788. 旋转数字 - 力扣(LeetCode)
788. 旋转数字 - 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。 现在我们有一个正整数 N, 计算从 1...
思路
注意题目所说的旋转是指字形在几何上的旋转,比如 2 旋转后看上去就像 5。
题目中已经提到 0, 1, 8 旋转后还是自身,而 2, 5, 6, 9 旋转后数位会变。为了满足好数定义:
- 这个数必须每个数位都是
0, 1, 2, 5, 6, 8, 9其中一个数字。 - 至少要包含
2, 5, 6, 9中的一个(以保证旋转后不同)。
按照这个规则枚举判断即可。
代码
class Solution {
public:
int rotatedDigits(int n) {
// 注意这里的旋转指的是字形在几何上的旋转,比如 2 旋转后看上去就像 5
// 满足要求的数只有 0, 1, 2, 5, 6, 8, 9
// 其中 0, 1, 8 旋转后还是自身
// 题目要求整个数旋转后是不同的数,因此至少要包含 2, 5, 6, 9 中的一个
// 直接枚举判断即可
int res=0;
for(int i=1;i<=n;i++){
bool allSpecial=true; // 所有位都在 0, 1, 2, 5, 6, 8, 9
bool invDiff=false; // 是否有翻转后不同的数
int num=i;
while(num>0){
switch(num%10){
case 2:
case 5:
case 6:
case 9:
invDiff=true;
case 0:
case 1:
case 8:
allSpecial=true;
break;
default:
allSpecial=false;
}
if(!allSpecial){
break;
}
num/=10;
}
if(allSpecial&&invDiff){
res++;
}
}
return res;
}
};
1 个帖子 - 1 位参与者