华为机试 叠积木-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