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
为了解决这个问题,我们将遵循以下步骤-
定义一个映射映射
定义一个有效的数组
定义一个函数solve()
,它将使用num,rotate,digit,N,
如果rotate不等于num,则-
(增加ret1)
对于初始化i:=0,当i<有效大小时,更新(将i增加1),执行-
从循环中出来
挖:=有效[i]
如果num*10+dig>N,则
resolve(num*10+dig,定义一张映射,数字*10,N)
从主要方法中执行以下操作-
ret:=0
有效:={0,1,6,8,9}
映射[0]:=0
映射[1]:=1
映射[6]:=9
映射[9]:=6
映射[8]:=8
解决(1,1,10,N)
解决(6,9,10,N)
解决(9,6,10,N)
解决(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