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,则-
(增加ret 1)
对于初始化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
以上是 C ++中令人困惑的数字II 的全部内容, 来源链接: utcz.com/z/331329.html