侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【模拟, 枚举】旋转数字

GabrielxD
2022-09-25 / 0 评论 / 0 点赞 / 109 阅读 / 457 字
温馨提示:
本文最后更新于 2022-09-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

788. 旋转数字


我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。

如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。

现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?

示例:

输入: 10
输出: 4
解释: 
在[1, 10]中有四个好数: 2, 5, 6, 9。
注意 1 和 10 不是好数, 因为他们在旋转之后不变。

提示:

  • N 的取值范围是 [1, 10000]

解题

方法一:枚举 模拟

思路

由题意可知,当一个数中:

  • 可以出现 001188
  • 至少存在一位是 22556699
  • 不能出现 334477

时该数是一个好数。

由于数据范围只有 10410^4 所以可以直接枚举 1~n 中的每一个数模拟计数返回即可。

代码

class Solution {
    static final int[] rotates = {0, 0, 1, -1, -1, 1, 1, -1, 0, 1};

    public int rotatedDigits(int n) {
        int cnt = 0;
        outer: for (int i = 1; i <= n; ++i) {
            String strNum = String.valueOf(i);
            boolean flag = false;
            inner: for (char ch : strNum.toCharArray()) {
                switch (rotates[ch - '0']) {
                    case 0: continue inner;
                    case 1: 
                        flag = true;
                        break;
                    case -1: continue outer;
                }
            }
            if (flag) ++cnt;
        }
        return cnt;
    }
}
0

评论区