程序员饭后甜点 (1)

0 .Thanks

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


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

程序员饭后甜点 (1)_第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 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))