788. Rotated Digits

Question

X is a good number if after rotating each digit individually by 180 degrees, we get a valid number that is different from X. Each digit must be rotated - we cannot choose to leave it alone.

A number is valid if each digit remains a digit after rotation. 0, 1, and 8 rotate to themselves; 2 and 5 rotate to each other; 6 and 9 rotate to each other, and the rest of the numbers do not rotate to any other number and become invalid.

Now given a positive number N, how many numbers X from 1 to N are good?

Example:
Input: 10
Output: 4
Explanation:
There are four good numbers in the range [1, 10] : 2, 5, 6, 9.
Note that 1 and 10 are not good numbers, since they remain unchanged after rotating.

Note:

  1. N will be in range [1, 10000].

Solution

  • Method 1: HashMap / Array
    class Solution {
        private int[] arr;
        public int rotatedDigits(int N) {
            this.arr = new int[10];
            Arrays.fill(arr, -1);
            arr[0] = 0;
            arr[1] = 1;
            arr[8] = 8;
            arr[2] = 5;
            arr[5] = 2;
            arr[6] = 9;
            arr[9] = 6;
            int count = 0;
            for(int i = 1; i <= N; i++){
                if(isValid(i)) count++;
            }
            return count;
        }
        private boolean isValid(int N){
            int origin = N;
            int next = 0;
            int v = 1;
            while(N > 0){
                int cur = N % 10;
                if(arr[cur] == -1) return false;
                next = next + arr[cur] * v;
                N /= 10;
                v *= 10;
            }
            return origin != next;
        }
    }