We can rotate digits by 180 degrees to form new digits. When 0, 1, 6, 8, 9 are rotated 180 degrees, they become 0, 1, 9, 8, 6 respectively. When 2, 3, 4, 5 and 7 are rotated 180 degrees, they become invalid.
A confusing number is a number that when rotated 180 degrees becomes a different number with each digit valid.(Note that the rotated number can be greater than the original number.)
Given a positive integer N
, return the number of confusing numbers between 1
and N
inclusive.
Example 1:
Input: 20 Output: 6 Explanation: The confusing numbers are [6,9,10,16,18,19]. 6 converts to 9. 9 converts to 6. 10 converts to 01 which is just 1. 16 converts to 91. 18 converts to 81. 19 converts to 61.
思路:根据Confusing Number I 如果一个个判断,肯定超时,因为只有0,1,6,8,9,那么我们用这几个digit生成数字就可以了。
这里取巧的地方就是用dfs,然后传参数的时候,start * 10 + nums[i], 传,回来就还是start;
class Solution {
public int confusingNumberII(int N) {
HashMap<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
hashmap.put(0,0);
hashmap.put(1,1);
hashmap.put(6,9);
hashmap.put(8,8);
hashmap.put(9,6);
int[] count = {0};
int[] num = {0,1,6,8,9};
dfs(0, N, hashmap, num, count);
return count[0];
}
private void dfs(long start, int N, HashMap<Integer, Integer> hashmap,
int[] num, int[] count) {
if(start > N) {
return;
}
if(start <= N && isConfused(hashmap, start)) {
count[0]++;
}
int i = start == 0 ? 1 : 0;
for(; i < num.length; i++) {
dfs(start * 10 + num[i], N, hashmap, num, count);
}
}
private boolean isConfused(HashMap<Integer, Integer> hashmap, long n) {
long res = 0;
long x = n;
while(x != 0) {
int digit = (int) x % 10;
if(digit == 2 || digit == 3 || digit == 4 || digit == 5 || digit == 7) {
return false;
}
res = res*10 + hashmap.get(digit);
x = x/10;
}
return res != n;
}
}