数据结构和算法分析程序员

程序员饭后甜点 (1)

2016-12-23  本文已影响64人  CokeNello

0 .Thanks

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


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

世界级难题.png

再次声明一下,


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;
    }

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

/**
     * 检验规则
     * @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 .大神的解法

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

上一篇 下一篇

猜你喜欢

热点阅读