[番外篇]k位精巧数

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

题目是这样的:

我花了半小时做了一下。

class Test {

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

    private ArrayList<Integer> kPerfectList() {
        ArrayList<Integer> 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。

笑哥,对不起。。。。

转载于:https://juejin.im/post/5a31314c6fb9a0451f30f0fb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值