当前位置: 首页 > news >正文

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

在这里插入图片描述
在这里插入图片描述

摘要

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

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

题目描述

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

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

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

示例

输入: "69"
输出: true

输入: "88"
输出: true

输入: "962"
输出: false

痛点分析

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

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

  2. 需要正确匹配旋转后的映射关系
    例如 6 旋转后是 9,而 9 旋转后是 6,这是一种非对称映射,如果不注意这一点,很容易在代码实现时出错。

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

解题思路

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

确定旋转规则

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

数字旋转后
00
11
69
88
96

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 = 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

示例测试

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)

实际应用场景

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

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

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

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

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

总结

  • “中心对称数”(Strobogrammatic Number) 指的是 旋转 180° 后仍然相同的数字
  • 解法核心
    • 双指针遍历
    • 哈希表映射旋转关系
    • 不匹配即返回 false
  • 时间复杂度:O(N)空间复杂度:O(1),高效且简洁。
  • 实际应用:数字显示校验、验证码、车牌号、航空编号等场景。
http://www.dtcms.com/a/111862.html

相关文章:

  • Maven的下载配置及在Idea中的配置
  • 【云计算互联网络】 专线、VPN与云网关技术对比
  • Vue2 组件创建与使用
  • TDengine 中的视图
  • Spring Boot 可扩展脱敏框架设计全解析 | 注解+策略模式+模板方法模式实战
  • Python Requests 库终极指南
  • Redis-13.在Java中操作Redis-Spring Data Redis使用方式-操作哈希类型的数据
  • 免费内网穿透方法
  • LocaDate、LocalTime、LocalDateTime
  • 如何设计好一张表
  • LLM 性能优化有哪些手段?
  • 软件工程面试题(二十七)
  • 硬件电路(23)-输入隔离高低电平有效切换电路
  • MYOJ_4342:(洛谷P1087)[NOIP 2004 普及组] FBI 树(二叉树实操,递归提高)
  • SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案
  • Arduino示例代码讲解:Ping
  • c语言学习16——内存函数
  • 面向对象(2)
  • 多模态技术概述(一)
  • Visio | 将(.vsdx)导出为更清楚/高质量的图片(.png) | 在Word里面的visio图
  • 从感光sensor到显示屏,SOC并非唯一多样
  • 手动将ModelScope的模型下载到本地
  • Eclipse怎么创建java项目
  • 前端快速入门学习2-HTML
  • 编写实现一个简易的域名服务器
  • 长龙通信机CAN数据查看(工具版)
  • AI Agent设计模式一:Chain
  • 出现次数最多的子树元素和——深度优先搜索
  • 如何将Android 应用上传到国内各大应用市场
  • Webpack中loader的作用。