这题不是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。
笑哥,对不起。。。。