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

    0 .Thanks 题目来自于大神:给聪明的你解解闷 1 .这是一道世界级的难题 再次声明一下, 这个是4位数的密...

  • 饭后甜点

    我们人类在科学技术上每一次质的飞跃,人类都要为此付出巨大的代价,要么为了适应此,要么把此运用到军事上,要么,...

  • 饭后甜点☕

    「一」 微微细雨中图书馆门前的偷懒时刻 扑鼻而来的厚重的久违的泥土气息 和偶然拍到的狂奔在雨中的少年 「二」 那日...

  • [饭后甜点] 大小端

    网络/存储字节序中有大、小端的概念,简而言之就是内存地址由高到低与数据由高位到低位的对应关系.PS:哪个是大端,哪...

  • 饭后甜点,小字伴乐

    别笑这一盅三白酒手上浇 怪你那一段拷花蓝小裙腰 纸灯再一挑散墨鬓掩唇角 桥头风和雨都静了 半卷夜航船载天地心海飘 ...

  • 小棉袄的饭后甜点

    小棉袄,像春天的小树,一路成长,晴空下思考、好奇的疑问,对世界有无数的期盼和想法,这都是这个年纪所拥有的无限可能。...

  • “小雪”菜 | 饭后甜点:山楂酪

    “顺着节气过日子,身体会告诉你,TA很舒服。” 冬天可以适当吃一点酸味的食材,一是为了消食解腻,帮助消化,毕竟冬天...

  • 饭后甜点之——烤蛋白霜

    文/乱世清莲 本来呢,我是想做着当下午茶的,然后我妈就说那你用完蛋白之后蛋黄能干什么,如果要等到晚饭用,又放了好久...

  • 美味私厨食谱

    《健康主食》 《营养早餐》 《特色菜》 《老火靓汤》 《饭后甜点》

  • 甜点(1)

    与小A多年未见,她刚从国外回来,我去机场接她到家里吃饭。 开放式的厨房,他笔直地站在那儿,左手稳稳...

网友评论

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

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