Confusing Number II

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.

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值