吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1349|回复: 1
收起左侧

[学习记录] 轻而易举笔试题 -层板等分衣柜,Java解法

[复制链接]
112k2ing 发表于 2022-7-14 20:56




该笔试题,目前网上并没有完整的java实现.
个人实现代码如下,Java小白,有改进的地方还希望大家指出:






public class LayeredTest {



    public static void main(String[] args) {
        int[] a = {50,600,700,1000};
        List<String> resolveList = resolve(4, a);


        // 输出结果
        for (String temp : resolveList) {
            StringBuilder sb = new StringBuilder();
            char[] chars = temp.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                if (sb.length() > 0) {//该步即不会第一位有逗号,也防止最后一位拼接逗号!
                    sb.append(",");
                }
                sb.append(chars);
            }
            System.out.println(sb);
        }

    }

    // 所有可能的组合
    private static List<String> allCaseList = new ArrayList<>();

    /**
     * 获取所有排列组合,去除不满足条件的组合(不能移动的版号的索引位置,要大于该  版号+1 所在索引位置)
     * n : 层板的数量
     * zs : 层板原始位置集合
     * list : 层板排序集合
     * */
    private static List<String> resolve(int n,int[] zs) {

        // 确定每一块层板的位置,avgHeight:每一层的平均高度
        int avgHeight = 2000/(n+1);
        // 每块木板位置的集合
        List<Integer> boardLocationList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            boardLocationList.add(avgHeight*(i+1));
//            System.out.println(avgHeight*(i+1));
        }
        // 初始化array: 层板号数组
        String[] array = new String[n];
        for (int i = 0; i < n; i++) {
            array = String.valueOf(i+1);
        }

        //  获取所有层板号的移动顺序的组合,存入成员变量  allCaseList
        arrangeAll(Arrays.asList(array),"",n);
        //  获取不满足移动条件的层板号集合
        List<Integer> noMoveBoardList = noMoveBoard(boardLocationList, zs);
//        System.out.println(noMoveBoardList.toString());
        // 删除,不符合条件的排列
        List<String> correctCaseList = removeErrorCase(noMoveBoardList);
        // 对结果进行从小到大排序
        Collections.sort(correctCaseList);


        return correctCaseList;
    }


    /**
     *  删除不满足条件的排列组合
     *  noMoveBoardList : 不满足移动条件的层板号集合
     *  return : 返回正确的排序集合
     * */
    public static List<String> removeErrorCase(List<Integer> noMoveBoardList) {
        List resultList = new LinkedList(allCaseList);
        //待删除元素集合
        List<String> tempList = new ArrayList<>();

        for (int i = 0; i < noMoveBoardList.size(); i++) {
            // 不能移动的板子
            Integer temp = noMoveBoardList.get(i);
            // temp 后面的板子
            Integer tempNext = temp + 1;
            for (String str: allCaseList) {
                int maxTemp = str.indexOf(temp.toString());
                int minTemp = str.indexOf(tempNext.toString());
                if (maxTemp < minTemp) {
                    tempList.add(str);
                }
            }
        }

        if (tempList.size() != 0) {
            for(String removeStr: tempList) {
                resultList.remove(removeStr);
            }
        }
        return resultList;

    }

    /**
     * 获取所有层板号的移动顺序的组合
     * array : 层板号数组
     * prefix : 层板号排列组合的一种情况
     * */
    public static void arrangeAll(List array, String prefix,int n){
        if (prefix.length() == n) {
            allCaseList.add(prefix);
        }
        for (int i = 0; i < array.size(); i++) {
            List temp = new LinkedList(array);
            arrangeAll(temp, prefix + temp.remove(i),n);
        }
    }

    /**
     * 获取不满足移动条件的层板号
     * boardLocationList : 层板目标位置集合
     * zs : 层板原始位置集合
     * return : 不满足移动条件的层板号集合
     * */
    public static List<Integer> noMoveBoard(List<Integer> boardLocationList,int[] zs) {
        List<Integer> resultList = new ArrayList<>();
        for (int i = 0; i < boardLocationList.size(); i++) {
            if (i == (zs.length-1)) {
                break;
            }
            if (boardLocationList.get(i) >= zs[i+1]) {
                resultList.add(i+1);
            }
        }
        return resultList;
    }
}

原题目:

原题目:

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
MYLQG2ZHX + 2 + 1 热心回复!
dgy + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

l441669899 发表于 2022-7-15 07:35
感谢楼主分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表