[番外篇]k位精巧数

这题不是leetcode上的。。
今天中午笑哥在微信群发了这个题目让我做一下。。

[番外篇]k位精巧数_第1张图片
39CB711C-00D6-47B4-8ACC-1D2C65CB0692.png

题目是这样的:


[番外篇]k位精巧数_第2张图片
WechatIMG9.jpeg

我花了半小时做了一下。

class Test {

    public static void main(String args[]) {
        ArrayList res = new Test().kPerfectList();
        int sum = 0;
        for (Integer i : res) {
            sum += i;
        }
        System.out.println(res);
        System.out.println(sum);
    }

    private ArrayList kPerfectList() {
        ArrayList res = new ArrayList<>();
        for (int i = 11111111; i < 99999999; i++) {
            int[] bitmap = new int[10];
            int mod = 8;
            int temp = i;
            while (mod > 1) {
                if (temp % mod != 0 || temp % 10 == 0) {
                    break;
                } else {
                    bitmap[temp % 10]++;
                    mod--;
                    temp /= 10;
                }
            }
            if (mod != 1) continue;
            //bitmap[temp % 10] ++ ;
            if (checkAllSingleOccurence(bitmap)) {
                res.add(i);
            }
        }
        return res;
    }

    private boolean checkAllSingleOccurence(int[] map) {
        for (int i = 0; i < map.length; i++) {
            if (map[i] != 1 && map[i] != 0) return false;
        }
        return true;
    }

}

谈不上什么算法了,就是traverse。我看了下百度,发现有奥数题是类似这个的,这个题可以手动构造出来的。
我猜这题只能用traverse,否则就要用到数学上的一些rountine比如能被2,3,4...整除的数的规律。

结尾是一个悲伤的故事,我发现上面的代码会打印出3个结果,[24925816, 38165472, 54325816]
用肉眼检查一下发现第一个和第三个答案首位有重复数字。因为上面的代码少了首位的map。。
应该加上:
bitmap[temp % 10] ++ ;

这样 答案就只有一个:
38165472。

笑哥,对不起。。。。

你可能感兴趣的:([番外篇]k位精巧数)