摘要
在日常开发中,我们经常遇到一些关于对称性的判断,比如字符串回文、镜像翻转等。而 “中心对称数”(Strobogrammatic Number) 这个问题,本质上是考察一个数字在旋转 180 度后是否还是原来的样子。
这个问题看似简单,但如果不理解它的本质,很容易走弯路。本文不仅会分析解法,还会聊聊它的实际应用场景,以及在解决这个问题时可能会遇到的坑,帮助你更深入地理解这个问题。
题目描述
给定一个字符串 num
,判断它是否是中心对称数。
所谓中心对称数,指的是旋转 180 度后仍然相同的数字,比如:
"69"
➝ 旋转 180° 后仍是"69"
"88"
➝ 旋转 180° 后仍是"88"
"962"
➝ 旋转 180° 后变成"296"
,和原数字不同
示例
输入: "69"
输出: true输入: "88"
输出: true输入: "962"
输出: false
痛点分析
这个问题的难点主要有以下几点:
-
并不是所有数字都能旋转
直觉上,我们可能会觉得可以随便翻转数字,但事实并非如此。只有 0, 1, 6, 8, 9 这些数字在旋转 180° 后还能变成有效数字,而 2, 3, 4, 5, 7 这些数字根本没法对称。 -
需要正确匹配旋转后的映射关系
例如6
旋转后是9
,而9
旋转后是6
,这是一种非对称映射,如果不注意这一点,很容易在代码实现时出错。 -
对称匹配的实现方式
直觉上可能会想到先旋转整个字符串,再比对是否相等,但这样做起来比较麻烦。而最优解其实是用双指针从两边向中间检查,代码更简洁,逻辑也更清晰。
解题思路
要判断一个数字是否是中心对称数,可以分为以下几步:
确定旋转规则
首先,我们要知道哪些数字可以旋转,并且旋转后是什么样子的:
数字 | 旋转后 |
---|---|
0 | 0 |
1 | 1 |
6 | 9 |
8 | 8 |
9 | 6 |
而 2, 3, 4, 5, 7
这些数字是无效的,如果 num
里有这些数字,那肯定不是中心对称数。
使用双指针进行对称检查
我们可以从字符串的两端向中间遍历,检查两端数字是否符合旋转对称规则:
- 左指针(left) 指向字符串起始位置
- 右指针(right) 指向字符串末尾
- 逐个检查
num[left]
和num[right]
是否符合旋转匹配规则 - 如果有任何一个不匹配,直接返回
false
- 如果所有字符都符合规则,则返回
true
Swift 代码实现
func isStrobogrammatic(_ num: String) -> Bool {let mapping: [Character: Character] = ["0": "0", "1": "1", "6": "9", "8": "8", "9": "6"]let numArray = Array(num)var left = 0var right = numArray.count - 1while left <= right {guard let mappedChar = mapping[numArray[left]] else {return false}if mappedChar != numArray[right] {return false}left += 1right -= 1}return true
}
代码解析
mapping
哈希表:存储旋转 180° 后的映射关系numArray
:把字符串转换成数组,方便用索引访问字符- 双指针遍历:
left
从左到右,right
从右到左- 检查
num[left]
是否在mapping
里 - 检查
mapping[num[left]]
是否等于num[right]
- 任何一个不匹配,就直接返回
false
- 直到
left
超过right
,说明所有字符都符合要求,返回true
示例测试
print(isStrobogrammatic("69")) // true
print(isStrobogrammatic("88")) // true
print(isStrobogrammatic("962")) // false
print(isStrobogrammatic("818")) // true
print(isStrobogrammatic("123")) // false
测试结果
true
true
false
true
false
时间复杂度分析
- 代码只遍历字符串一次(双指针各遍历一半),所以时间复杂度是 O(N),其中
N
是字符串长度。
空间复杂度分析
- 只用了一个哈希表和两个指针,没有额外的数据结构,所以空间复杂度是 O(1)。
实际应用场景
这类对称性检查的逻辑在很多场景下都有应用,例如:
-
数字显示校验
电子设备(比如计算器、LED 显示屏)可能需要检查某个数字在 旋转 180° 后是否仍然有效,避免错误显示。例如,有些屏幕支持倒置显示,但如果某些字符不能正确匹配,那就会导致混乱。 -
验证码设计
有些验证码要求 “旋转后仍然可读”,比如防止用户输错或机器识别失败。 -
车牌号 & 安全编码
在某些国家,特殊车牌号或安全编码可能要求在 倒置或旋转后仍然有效,这就可以用这个方法来校验。 -
航空、军事领域的编号
在某些飞行器或军事装备上,编号可能会被倒置或者镜像查看,因此需要确保它们即使旋转后也能正确识别。
总结
- “中心对称数”(Strobogrammatic Number) 指的是 旋转 180° 后仍然相同的数字。
- 解法核心:
- 双指针遍历
- 哈希表映射旋转关系
- 不匹配即返回 false
- 时间复杂度:O(N),空间复杂度:O(1),高效且简洁。
- 实际应用:数字显示校验、验证码、车牌号、航空编号等场景。