Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)


摘要

在日常开发中,我们经常遇到一些关于对称性的判断,比如字符串回文、镜像翻转等。而 "中心对称数"(Strobogrammatic Number) 这个问题,本质上是考察一个数字在旋转 180 度后是否还是原来的样子。

这个问题看似简单,但如果不理解它的本质,很容易走弯路。本文不仅会分析解法,还会聊聊它的实际应用场景,以及在解决这个问题时可能会遇到的坑,帮助你更深入地理解这个问题。

题目描述

给定一个字符串 num,判断它是否是中心对称数。

所谓中心对称数,指的是旋转 180 度后仍然相同的数字,比如:

  • "69" ➝ 旋转 180° 后仍是 "69"
  • "88" ➝ 旋转 180° 后仍是 "88"
  • "962" ➝ 旋转 180° 后变成 "296",和原数字不同

示例

swift 复制代码
输入: "69"
输出: true

输入: "88"
输出: true

输入: "962"
输出: false

痛点分析

这个问题的难点主要有以下几点:

  1. 并不是所有数字都能旋转

    直觉上,我们可能会觉得可以随便翻转数字,但事实并非如此。只有 0, 1, 6, 8, 9 这些数字在旋转 180° 后还能变成有效数字,而 2, 3, 4, 5, 7 这些数字根本没法对称。

  2. 需要正确匹配旋转后的映射关系

    例如 6 旋转后是 9,而 9 旋转后是 6,这是一种非对称映射,如果不注意这一点,很容易在代码实现时出错。

  3. 对称匹配的实现方式

    直觉上可能会想到先旋转整个字符串,再比对是否相等,但这样做起来比较麻烦。而最优解其实是用双指针从两边向中间检查,代码更简洁,逻辑也更清晰。

解题思路

要判断一个数字是否是中心对称数,可以分为以下几步:

确定旋转规则

首先,我们要知道哪些数字可以旋转 ,并且旋转后是什么样子的:

数字 旋转后
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 代码实现

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 = 0
    var right = numArray.count - 1
    
    while left <= right {
        guard let mappedChar = mapping[numArray[left]] else {
            return false
        }
        
        if mappedChar != numArray[right] {
            return false
        }
        
        left += 1
        right -= 1
    }
    
    return true
}

代码解析

  • mapping 哈希表:存储旋转 180° 后的映射关系
  • numArray:把字符串转换成数组,方便用索引访问字符
  • 双指针遍历 :
    • left 从左到右,right 从右到左
    • 检查 num[left] 是否在 mapping 里
    • 检查 mapping[num[left]] 是否等于 num[right]
    • 任何一个不匹配,就直接返回 false
    • 直到 left 超过 right,说明所有字符都符合要求,返回 true

示例测试

swift 复制代码
print(isStrobogrammatic("69"))   // true
print(isStrobogrammatic("88"))   // true
print(isStrobogrammatic("962"))  // false
print(isStrobogrammatic("818"))  // true
print(isStrobogrammatic("123"))  // false

测试结果

txt 复制代码
true
true
false
true
false

时间复杂度分析

  • 代码只遍历字符串一次(双指针各遍历一半),所以时间复杂度是 O(N) ,其中 N 是字符串长度。

空间复杂度分析

  • 只用了一个哈希表和两个指针,没有额外的数据结构,所以空间复杂度是 O(1)。

实际应用场景

这类对称性检查的逻辑在很多场景下都有应用,例如:

  1. 数字显示校验

    电子设备(比如计算器、LED 显示屏)可能需要检查某个数字在 旋转 180° 后是否仍然有效,避免错误显示。例如,有些屏幕支持倒置显示,但如果某些字符不能正确匹配,那就会导致混乱。

  2. 验证码设计

    有些验证码要求 "旋转后仍然可读",比如防止用户输错或机器识别失败。

  3. 车牌号 & 安全编码

    在某些国家,特殊车牌号或安全编码可能要求在 倒置或旋转后仍然有效,这就可以用这个方法来校验。

  4. 航空、军事领域的编号

    在某些飞行器或军事装备上,编号可能会被倒置或者镜像查看,因此需要确保它们即使旋转后也能正确识别。

总结

  • "中心对称数"(Strobogrammatic Number) 指的是 旋转 180° 后仍然相同的数字。
  • 解法核心 :
    • 双指针遍历
    • 哈希表映射旋转关系
    • 不匹配即返回 false
  • 时间复杂度:O(N) ,空间复杂度:O(1),高效且简洁。
  • 实际应用:数字显示校验、验证码、车牌号、航空编号等场景。
相关推荐
沫璃染墨9 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
垆边人似月.9 小时前
华为机试题 :和为 K 的子数组个数
算法·leetcode·华为
达子6669 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
夏幻灵10 小时前
每日一题:LeetCode 165:比较版本号
算法·leetcode·职场和发展
道尔柯南10 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀10 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
Navigator_Z10 小时前
LeetCode //C - 1288. Remove Covered Intervals
c语言·算法·leetcode
tachibana210 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组10 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go11 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型