華為機試 疊積木-java暴力解法


題目描述
積木寬高相等,長度不等,每層只能放一個或拼接兩個個積木,每層長度相等,求最大層數。
輸入
給定積木的長度,以空格分隔,例如:3 6 6 3。
輸出
如果可以搭建,返回最大層數,如果不可以返回-1。

樣例輸入
3 6 6 3
樣例輸出
3

 

樣例輸入
1 4 2 3 6
樣例輸出
-1

 

代碼:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String inStr = in.nextLine();
        String[] inStrs = inStr.split(" ");
        int inLen = inStrs.length;

        int[] brickLength = new int[inLen];      //積木長度
        Map<Integer, Integer> lenMap = new HashMap();
        for (int i = 0; i < inLen; i++) {
            int length = Integer.parseInt(inStrs[i]);
            brickLength[i] = length;
            int count = 1;
            if (lenMap.containsKey(length)) count += lenMap.get(length);        //如果原來有此數,則加上1
            lenMap.put(length, count);
        }

        Map<Integer, int[]> brick2LengthMap = new HashMap(); int index = 0;
        for (int i = 0; i < inLen; i++) {
            for (int j = 1; j < inLen; j++) {
                brick2LengthMap.put(index++, new int[]{i, j, brickLength[i] + brickLength[j]});
            }
        }


        Set<Integer> set = new HashSet();
        Set<Integer> seti = new HashSet();
        int eq2Count;        //相同長度積木的至少個數
        for (int i = inLen; i > (inLen - 1) / 2; i--) {
            eq2Count = inLen - i;       //如果此為一層,則兩塊積木。2-4,3-6

            int[] eqs = new int[eq2Count];
            long counteqs = 0;
            for (int j = 1; j <= eqs.length; j++) {
                counteqs += Math.pow(brick2LengthMap.size(), j);
            }

            for (int j = 0; j < counteqs; j++) {
                int temp = j;seti.clear();set.clear();
                for (int k = eqs.length - 1; k >= 0 ; k--) {
                    int i1 = (int) (temp / Math.pow(brick2LengthMap.size(), k));
                    int[] ints = brick2LengthMap.get(i1);
                    temp = temp - (int) (i1 * Math.pow(brick2LengthMap.size(), k));
                    if (seti.contains(ints[0]) || seti.contains(ints[1])) break;


                    seti.add(ints[0]);seti.add(ints[1]);
                    set.add(ints[2]);
                }
                if (set.size() > 1) continue;       //針對上面的進行跳出
                for (int k = 0; k < brickLength.length; k++) {
                    if (seti.contains(k)) continue;

                    set.add(brickLength[k]);
                    if (set.size() > 1) break;
                }
                if (set.size() == 1) {
                    System.out.println(i);
                    return;
                }
            }

        }
        System.out.println(-1); return;

    }
}

 機考的時候代碼寫完,測試時間沒夠,提交的代碼。時間到了后還花了20分鍾才測試修改成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM