Leetcode每日一题 —— 788. 旋转数字

力扣 LeetCode 788. 旋转数字 - 力扣(LeetCode) 788. 旋转数字 - 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数...
Leetcode每日一题 —— 788. 旋转数字
Leetcode每日一题 —— 788. 旋转数字
力扣 LeetCode

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 旋转后数位会变。为了满足好数定义:

  1. 这个数必须每个数位都是 0, 1, 2, 5, 6, 8, 9 其中一个数字。
  2. 至少要包含 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 位参与者

阅读完整话题

来源: linux.do查看原文