C++ 中的令人困惑的數字 II
假設我們有一個數字,現在如果我們將該數字旋轉 180 度以形成新的數字。當 0、1、6、8、9 旋轉 180 度時,它們分別變成 0、1、9、8、6。但是當 2、3、4、5 和 7 旋轉 180 度時,它們變得無效。
令人困惑的數字是一個數字,當旋轉 180 度時會變成一個新數字。因此,如果我們有一個正整數 N,我們必須找到 1 到 N(包括 1 和 N)之間令人困惑的數字的數量。
因此,如果輸入類似於 20,則輸出將為 6
為了解決這個問題,我們將遵循以下步驟 -
定義一個對映 map
定義一個數組 valid
定義一個函式 solve(),它將接收 num、rotate、digit、N,
如果 rotate 不等於 num,則 -
(將 ret 增加 1)
對於初始化 i := 0,當 i < valid 的大小,更新(將 i 增加 1),執行 -
dig := valid[i]
如果 num * 10 + dig > N,則
退出迴圈
solve(num * 10 + dig, 定義一個對映,digit * 10, N)
從主方法執行以下操作 -
ret := 0
valid := { 0, 1, 6, 8, 9 }
mapping[0] := 0
mapping[1] := 1
mapping[6] := 9
mapping[9] := 6
mapping[8] := 8
solve(1, 1, 10, N)
solve(6, 9, 10, N)
solve(9, 6, 10, N)
solve(8, 8, 10, N)
返回 ret
讓我們看看以下實現以獲得更好的理解 -
示例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int ret; map <int, int> mapping; vector <int> valid; void solve(lli num, lli rotate, lli digit, lli N){ if (rotate != num) { ret++; } for (int i = 0; i < valid.size(); i++) { int dig = valid[i]; if (num * 10 + dig > N) { break; } solve(num * 10 + dig, mapping[dig] * digit + rotate, digit * 10, N); } } int confusingNumberII(int N) { ret = 0; valid = { 0, 1, 6, 8, 9 }; mapping[0] = 0; mapping[1] = 1; mapping[6] = 9; mapping[9] = 6; mapping[8] = 8; solve(1, 1, 10, N); solve(6, 9, 10, N); solve(9, 6, 10, N); solve(8, 8, 10, N); return ret; } }; main(){ Solution ob; cout << (ob.confusingNumberII(20)); }
輸入
20
輸出
6
廣告