Welcome to Subscribe On Youtube
1088. Confusing Number II
Description
A confusing number is a number that when rotated 180
degrees becomes a different number with each digit valid.
We can rotate digits of a number by 180
degrees to form new digits.
- When
0
,1
,6
,8
, and9
are rotated180
degrees, they become0
,1
,9
,8
, and6
respectively. - When
2
,3
,4
,5
, and7
are rotated180
degrees, they become invalid.
Note that after rotating a number, we can ignore leading zeros.
- For example, after rotating
8000
, we have0008
which is considered as just8
.
Given an integer n
, return the number of confusing numbers in the inclusive range [1, n]
.
Example 1:
Input: n = 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.
Example 2:
Input: n = 100 Output: 19 Explanation: The confusing numbers are [6,9,10,16,18,19,60,61,66,68,80,81,86,89,90,91,98,99,100].
Constraints:
1 <= n <= 109
Solutions
-
class Solution { private final int[] d = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6}; private String s; public int confusingNumberII(int n) { s = String.valueOf(n); return dfs(0, 1, 0); } private int dfs(int pos, int limit, int x) { if (pos >= s.length()) { return check(x) ? 1 : 0; } int up = limit == 1 ? s.charAt(pos) - '0' : 9; int ans = 0; for (int i = 0; i <= up; ++i) { if (d[i] != -1) { ans += dfs(pos + 1, limit == 1 && i == up ? 1 : 0, x * 10 + i); } } return ans; } private boolean check(int x) { int y = 0; for (int t = x; t > 0; t /= 10) { int v = t % 10; y = y * 10 + d[v]; } return x != y; } }
-
class Solution { public: int confusingNumberII(int n) { string s = to_string(n); int d[10] = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6}; auto check = [&](int x) -> bool { int y = 0; for (int t = x; t; t /= 10) { int v = t % 10; y = y * 10 + d[v]; } return x != y; }; function<int(int, int, int)> dfs = [&](int pos, int limit, int x) -> int { if (pos >= s.size()) { return check(x); } int up = limit ? s[pos] - '0' : 9; int ans = 0; for (int i = 0; i <= up; ++i) { if (d[i] != -1) { ans += dfs(pos + 1, limit && i == up, x * 10 + i); } } return ans; }; return dfs(0, 1, 0); } };
-
class Solution: def confusingNumberII(self, n: int) -> int: def check(x: int) -> bool: y, t = 0, x while t: t, v = divmod(t, 10) y = y * 10 + d[v] return x != y def dfs(pos: int, limit: bool, x: int) -> int: if pos >= len(s): return int(check(x)) up = int(s[pos]) if limit else 9 ans = 0 for i in range(up + 1): if d[i] != -1: ans += dfs(pos + 1, limit and i == up, x * 10 + i) return ans d = [0, 1, -1, -1, -1, -1, 9, -1, 8, 6] s = str(n) return dfs(0, True, 0)
-
func confusingNumberII(n int) int { d := [10]int{0, 1, -1, -1, -1, -1, 9, -1, 8, 6} s := strconv.Itoa(n) check := func(x int) bool { y := 0 for t := x; t > 0; t /= 10 { v := t % 10 y = y*10 + d[v] } return x != y } var dfs func(pos int, limit bool, x int) int dfs = func(pos int, limit bool, x int) (ans int) { if pos >= len(s) { if check(x) { return 1 } return 0 } up := 9 if limit { up = int(s[pos] - '0') } for i := 0; i <= up; i++ { if d[i] != -1 { ans += dfs(pos+1, limit && i == up, x*10+i) } } return } return dfs(0, true, 0) }
-
function confusingNumberII(n: number): number { const s = n.toString(); const d: number[] = [0, 1, -1, -1, -1, -1, 9, -1, 8, 6]; const check = (x: number) => { let y = 0; for (let t = x; t > 0; t = Math.floor(t / 10)) { const v = t % 10; y = y * 10 + d[v]; } return x !== y; }; const dfs = (pos: number, limit: boolean, x: number): number => { if (pos >= s.length) { return check(x) ? 1 : 0; } const up = limit ? parseInt(s[pos]) : 9; let ans = 0; for (let i = 0; i <= up; ++i) { if (d[i] !== -1) { ans += dfs(pos + 1, limit && i === up, x * 10 + i); } } return ans; }; return dfs(0, true, 0); }