1. 问题背景与理解
"788. 旋转数字"是LeetCode上一道经典的字符串处理题目,主要考察候选人对数字特性、字符串操作和边界条件的处理能力。题目要求我们判断在给定范围内有多少个"好数",这类数字在旋转180度后能形成另一个有效数字,且与原数字不同。
我第一次遇到这个问题时,花了些时间理解"好数"的定义。简单来说,就是数字中的每一位旋转后仍然是有效数字(0,1,8旋转后不变,2和5、6和9互相旋转),且最终结果不能与原数字完全相同(排除全由0,1,8组成的数字)。
2. 解题思路分析
2.1 数字旋转特性分析
首先我们需要明确哪些数字旋转后仍然是有效数字:
- 0 → 0
- 1 → 1
- 2 → 5
- 5 → 2
- 6 → 9
- 8 → 8
- 9 → 6
而3,4,7旋转后会变成无效字符,因此包含这些数字的数都不是"好数"。
2.2 判断逻辑设计
基于上述特性,我们可以设计判断逻辑:
- 遍历数字的每一位
- 如果出现3,4,7 → 直接排除
- 如果至少包含一个2,5,6,9 → 可能是好数
- 旋转后与原数字不同 → 确认是好数
2.3 算法选择
对于这类范围统计问题,通常有两种思路:
- 暴力枚举:遍历范围内的每个数字并检查
- 数学方法:通过组合数学计算符合条件的数字数量
考虑到题目范围通常不会太大(比如N≤10000),暴力法在这里更直观且易于实现。
3. 代码实现与优化
3.1 基础实现
python复制def rotatedDigits(N):
count = 0
for num in range(1, N+1):
s = str(num)
if '3' in s or '4' in s or '7' in s:
continue
if '2' in s or '5' in s or '6' in s or '9' in s:
count += 1
return count
这个实现简单直接,但存在一些可以优化的点。
3.2 优化思路
- 提前终止:发现3,4,7时立即跳过当前数字
- **数字
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容