程序员饭后甜点 (1)

作者: CokeNello | 来源:发表于2016-12-23 11:59 被阅读64次

    0 .Thanks

    题目来自于大神:给聪明的你解解闷


    1 .这是一道世界级的难题

    世界级难题.png

    再次声明一下,

    • 这个是4位数的密码,
    • 五次输入都错,
    • 但是只有两个数字正确,而且数字的位置都不对。

    2 .学渣的解法

    学渣没学啥高深算法,一上来,直接就暴力法。

    • 首先,我们先来两个工具方法:(因为要对密码的每一位进行分析,所以要先把每一个位给分割出来)
    /**
         * 输入一个整数,分割其每一个位数
         * @param num
         * @return  返回一个数组,0-N代表1-N-1位
         */
        public static int[] cutInt(int num) {
            int size = countSize(num);
            int[] result = new int[size];
            for (int i = 0; i < size; i++) {
                result[i] = num % 10;
                num = num / 10;
            }
            return result;
        }
    
        /**
         * 输入一个整数,判断其位数。
         * @return
         */
        public static int countSize(int num) {
            int i;
            for (i = 1;; i++) {
                num = num/10;
                if (num==0)
                    break;
            }
            return i;
        }
    
    • 然后,写一下检验条件:
      思路是,对分割出来的检验数字,跟匹配的密码进行条件的检验。
      也就是上面的几个条件:
    • 这个是4位数的密码,
    • 五次输入都错,
    • 但是只有两个数字正确,而且数字的位置都不对。

    在方法内部,先进行相同的数字的位置确定,
    然后,进行检验是否是只有两个数字相同且位置不一样。

    /**
         * 检验规则
         * @param check 要检验的数字
         * @param temp  参考
         * @return
         */
        private static boolean check(int[] check, int[] temp) {
            int[] checkLocal = new int[check.length];
            int[] tempLocal = new int[check.length];
            int index = 0;
            for (int i = 0; i < check.length; i++) {
                for (int j = 0; j < temp.length; j++) {
                    if (temp[i] == check[j]) {
                        checkLocal[index] = j;
                        tempLocal[index] = i;
                        index++;
                    }
                }
            }
            if (index==2) {
                for (int i = 0; i < index; i++) {
                    if (checkLocal[i]==tempLocal[i]) {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }
    
    • 好了,最后附上源码
    public class Test {
    
        public static void main(String[] args) {
    
            long time = System.currentTimeMillis();
    
            int[] a = cutInt(6087);
            int[] b = cutInt(5173);
            int[] c = cutInt(1358);
            int[] d = cutInt(3825);
            int[] e = cutInt(2531);
    
    
            List<Integer> result = new ArrayList<>();
    
            for (int i = 1000; i <= 9999; i++) {
                int[] check = cutInt(i);
                if ( check(check,a) &&
                        check(check,b) &&
                        check(check,c) &&
                        check(check,d) &&
                        check(check,e)) {
                    result.add(i);
                }
            }
    
            time = System.currentTimeMillis() - time;
    
            for (int i = 0; i < result.size(); i++) {
                System.out.println("第"+(i+1)+"个结果:"+result.get(i));
            }
    
            System.out.println("Time(ms):"+time);
        }
    
        /**
         * 检验规则
         * @param check 要检验的数字
         * @param temp  参考
         * @return
         */
        private static boolean check(int[] check, int[] temp) {
            int[] checkLocal = new int[check.length];
            int[] tempLocal = new int[check.length];
            int index = 0;
            for (int i = 0; i < check.length; i++) {
                for (int j = 0; j < temp.length; j++) {
                    if (temp[i] == check[j]) {
                        checkLocal[index] = j;
                        tempLocal[index] = i;
                        index++;
                    }
                }
            }
            if (index==2) {
                for (int i = 0; i < index; i++) {
                    if (checkLocal[i]==tempLocal[i]) {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }
    
        /**
         * 输入一个整数,分割其每一个位数
         * @param num
         * @return  返回一个数组,0-N代表1-N-1位
         */
        public static int[] cutInt(int num) {
            int size = countSize(num);
            int[] result = new int[size];
            for (int i = 0; i < size; i++) {
                result[i] = num % 10;
                num = num / 10;
            }
            return result;
        }
    
        /**
         * 输入一个整数,判断其位数。
         * @return
         */
        public static int countSize(int num) {
            int i;
            for (i = 1;; i++) {
                num = num/10;
                if (num==0)
                    break;
            }
            return i;
        }
    }
    

    答案:

    第1个结果:8712
    Time(ms):3
    

    3 .大神的解法

    以上是学渣我的直接解法,没有多一刻的考虑。
    关于各位大神,请评论,回复您的解法吧~

    相关文章

      网友评论

        本文标题:程序员饭后甜点 (1)

        本文链接:https://www.haomeiwen.com/subject/sqrkvttx.html