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
痛点分析
这个问题的难点主要有以下几点:
-
并不是所有数字都能旋转
直觉上,我们可能会觉得可以随便翻转数字,但事实并非如此。只有 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),高效且简洁。
- 实际应用:数字显示校验、验证码、车牌号、航空编号等场景。
相关文章:
Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)
摘要 在日常开发中,我们经常遇到一些关于对称性的判断,比如字符串回文、镜像翻转等。而 “中心对称数”(Strobogrammatic Number) 这个问题,本质上是考察一个数字在旋转 180 度后是否还是原来的样子。 这个问题看似简…...
网络安全等级保护测评
名词解释 网络安全等级保护测评 网络安全等级保护测评,是对信息系统进行的一种安全评估活动。它的目的是验证信息系统是否达到了国家网络安全等级保护制度所规定的安全保护要求。这个制度将信息系统按照重要性划分为不同的安全保护等级,每个等级都有相应的安全保护要求。 …...
项目复盘:websocket不受跨域限制的原理
主要还是因为: 1、WebSocket 是独立于 HTTP 的应用层协议,通过 HTTP 建立连接后,完全脱离 HTTP 语义约束。这意味着 不受 HTTP 同源策略限制 不需要预检请求 不依赖 CORS 头机制 2、建立连接时的握手请求仍使用 HTTP 格式,但…...
deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天
一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天,这是一个浏览器扩展,它允许用户公开、私下分享他们的聊天对话,并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...
AI原生应用爆发:从通用大模型到垂直场景的算力重构
2025年第一季度,中国AI产业迎来标志性转折点:DeepSeek-R1大模型月活用户突破3000万,通义千问QwQ-32B在医疗领域诊断准确率达三甲医院主治医师水平,京东AI虚拟模特单日生成商品图超200万张……这些数据的背后,是AI技术从…...
arcgis jsapi 4.31 调用geoserver 发布的wms服务
服务的调用我也测试了网络搜索的很多方法,均未奏效,后来还是通过对官网例子的研究,找到了解决方案,调试的过程是非常痛苦的,最大的问题就是调用后没有任何反应,也不会给你任何的错误信息,这是最…...
《筋斗云的K8s容器化迁移》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:斗战胜佛的延迟焦虑****第二章:微服务化的紧箍咒****第三章:混沌中的流量劫持****第四章:量子筋斗的终极形态****终章&…...
[笔记.AI]大模型训练 与 向量值 的关系
(借助 DeepSeek-V3 辅助生成) 大模型在训练后是否会改变向量化的值,取决于模型的训练阶段和使用方式。以下是详细分析: 1. 预训练阶段:向量化值必然改变 动态调整过程: 在预训练阶段(如BERT、…...
【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)
源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPointÿ…...
Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】
目录 一.进程间通信目的 二.管道 三.匿名管道 3.1用fork来共享管理管道 3.2站在文件描述符角度-深度理解管道 3.3内核角度 3.4管道样例 3.4.1测试管道读写 3.4.2代码 解决方案1:倒着关闭: 解决方案2: 只让父进程一个人指向写端 四…...
Python 自动化:节省时间,更智能地工作
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 时间是你最宝贵的资产。如果你花费数小时手动执行重复性任务,那么当 Python 可以为你完成这些任务时,你就是在浪费时…...
StarRocks的执行计划和Profile
文章目录 一、执行计划和Profile相关脚本二、如何分析查询1、概念了解2、Query Plan①查看 Query Plan②分析 Query Plan 3、Query hint4、Query Profile①启用 Query Profile②查看 Query Profile③分析 Query Profile 一、执行计划和Profile相关脚本 命令功能ANALYZE PROFIL…...
【设计模式】过滤器模式
过滤器顾名思义,定义一些过滤规则,将符合要求的内容筛选,就比如过滤不同大小或者不同颜色的水果,需要颜色和大小过滤器,筛选条件独立为对象,可以通过灵活组合形成过滤链条。避免大量使用判断语句。 案例代…...
Jenkins插件安装失败如何解决
问题:安装Jenkins时候出现插件无法安装的情况。 测试环境: 操作系统:Windows11 Jenkins:2.479.3 JDK:17.0.14(21也可以) 解决办法一: 更换当前网络,局域网、移动、联通…...
GO语言杂记(文章持续更新)
1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数,将会报错,main函数只能在main包中。 实则不然,有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用:将go文件代码自动缩进。 gofmt -w escapecharprac.go...
VUE如何前端控制及动态路由详细讲解
在Vue.js中,前端控制通常指的是通过Vue的响应式系统、组件化、路由、状态管理等技术来实现对前端应用的控制和管理 一、前端路由控制基础 使用 vue-router 管理路由,通过路由守卫和动态添加路由实现权限控制。 1. 安装和配置 npm install vue-router…...
【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目
文章目录 背景目的安装1、安装 Rust2、克隆 heimdall-dec3、编译 heimdall-dec4、运行 heimdall-dec 使用说明1、访问 Web 界面2、输入合约信息3、查看反编译结果 实战演示1、解析普通合约2、解析代理合约 背景 在区块链安全研究中,智能合约的审计和分析至关重要。…...
day1_Flink基础
文章目录 Flink基础今日课程内容目标为什么要学Flink技术更新迭代市场需求 流式计算批量计算概念特点 批量计算的优势和弊端流式计算生活中流场景流式计算的概念 Flink简介Flink历史Flink介绍 Flink架构体系已学过的框架技术Flink架构 Flink集群搭建Flink的集群模式Standalone模…...
43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理
这份文档是一份关于大数据管理中心规划设计方案的详细报告,涵盖了背景与需求分析、整体规划方案、关键能力实现方案以及实施方案等内容。报告强调大数据在城市治理中的重要性,提出通过构建统一的大数据平台,整合城市各部门数据资源࿰…...
JavaScript数据结构
目录 JavaScript数据结构 一、基础数据结构 1. 数组(Array) 2. 对象(Object) 二、ES6 高级数据结构 1. Map 2. Set 3. WeakMap 与 WeakSet 三、类型化数组(Typed Arrays) 四、其他数据结构实现 …...
如何使用 FastAPI 构建 MCP 服务器
哎呀,各位算法界的小伙伴们!今天咱们要聊聊一个超酷的话题——MCP 协议!你可能已经听说了,Anthropic 推出了这个新玩意儿,目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心,为你的…...
Js 主线程和异步队列哪个先执行
JavaScript 主线程与异步队列执行顺序详解 JavaScript 是单线程语言,通过事件循环(Event Loop)机制来处理同步和异步任务。以下是主线程与异步队列的执行顺序解析: 1. 执行顺序基本原则 console.log(1. 主线程同步任务);setTim…...
C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent
完整项目托管地址:https://github.com/sometiny/http HTTP还有重要的一块:文件上传。 这篇文章将详细讲解下,前面实现了同一个链接处理多个请求,为了方便,我们独立写了一个HTTP基类,专门处理HTTP请求。 ht…...
【hadoop】远程调试环境
根据上一节,我们已经安装完成hadoop伪分布式环境 hadoop集群环境配置_jdk1.8 441-CSDN博客 还没安装的小伙伴可以看看这个帖子 这一节我们要实现使用vscode进行远程连接,并且完成java配置与测试 目录 vscode 配置远程 安装java插件 新建java项目 …...
检索增强生成(RAG):强化 AI 智能体的知识 “武装”
技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体(Agent)第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…...
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
1. 使用 Provider 实现局部刷新 示例 1:ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...
notepad++ 正则表达式
注意:Notepad正则表达式字符串最长不能超过69个字符 \ 转义字符 如:要使用 “\” 本身, 则应该使用“\\” \t Tab制表符 注:扩展和正则表达式都支持 \r 回车符CR 注:扩展支持,正则表达式不支持 \n 换行符…...
一起学大语言模型-通过ollama搭建本地大语言模型服务
文章目录 Ollama的github地址链接安装下载需求配置更改安装目录安装更改下载的模型存储位置Ollama一些目录说明日志目录 运行一个模型测试下测试下更改服务监听地址和端口号 Ollama的github地址链接 https://github.com/ollama/ollama 安装 下载 mac安装包下载地址࿱…...
webpack配置详解+项目实战
webpack在vue中的配置,适合想重新认知webpack的你 webpack配置-初级配置 1、配置入口和出口文件 2、配置loader 3、配置eslint(可组装js、jsx检查工具) 4、配置babel(将高级的js语法转换成低版本的js语法) 5、使用 ht…...
【学习笔记】文件上传漏洞--js验证、mime验证、.user.ini、短标签、过滤、文件头
概念 文件上传漏洞 什么是文件上传漏洞? 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。 这里上传的文件可以是木马,病毒,恶意脚…...
经典卷积神经网络LeNet实现(pytorch版)
LeNet卷积神经网络 一、理论部分1.1 核心理论1.2 LeNet-5 网络结构1.3 关键细节1.4 后期改进1.6 意义与局限性二、代码实现2.1 导包2.1 数据加载和处理2.3 网络构建2.4 训练和测试函数2.4.1 训练函数2.4.2 测试函数2.5 训练和保存模型2.6 模型加载和预测一、理论部分 LeNet是一…...
【VM虚拟机ip问题】
我就是我,不一样的烟火。 文章目录 前言一、启动VM虚拟机1. 开启虚拟机2. 输入账号密码登录3. 依次输入指令 二、主机ping地址测试1. ping ip地址-成功 三、安装-MobaXterm_Personal_21.51. 点击Session2. 选择SSH连接3. 输入信息4. 首次进入5. 连接成功 总结 前言 …...
【计算机视觉】YOLO语义分割
一、语义分割简介 1. 定义 语义分割(Semantic Segmentation)是计算机视觉中的一项任务,其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同,语义分割能够在像素级别上区分不同类别,从…...
【C++游戏引擎开发】《线性代数》(3):矩阵乘法的SIMD优化与转置加速
一、矩阵乘法数学原理与性能瓶颈 1.1 数学原理 矩阵乘法定义为:给定两个矩阵 A ( m n ) \mathrm{A}(mn) A(mn)和 B ( n p ) \mathrm{B}(np) B(np),它们的乘积 C = A B \mathrm{C}=AB C=AB 是一个 m p \mathrm{m}p mp 的矩阵,其中: C i , j = ∑ k = 1…...
聚焦交易能力提升!EagleTrader 模拟交易系统打造交易成长新路径
在全球市场波动加剧的背景下,交易者面临的挑战已不仅限于技术分析层面。许多交易者在实盘操作中常因情绪干扰导致决策变形,如何构建科学的交易心理与风险控制体系成为行业关注焦点。 国内自营交易考试EagleTrader运用自己研发的模拟交易系统,…...
文件分片上传
1前端 <inputtype"file"accept".mp4"ref"videoInput"change"handleVideoChange"style"display: none;">2生成hash // 根据整个文件的文件名和大小组合的字符串生成hash值,大概率确定文件的唯一性fhash(f…...
C#Lambda表达式与委托关系
1. 核心关系图示 A[委托] --> B[提供方法容器] B --> C[Lambda表达式] C --> D[委托实例的语法糖] A --> E[类型安全约束] C --> F[编译器自动生成委托实例] 2. 本质联系 2.1 类型关系 Lambda表达式是编译器生成的委托实例表达式自动匹配符合签名的…...
机器翻译和文本生成评估指标:BLEU 计算公式
📌 BLEU 计算公式 BLEU 主要由**n-gram精确匹配率(Precision)和长度惩罚(Brevity Penalty, BP)**组成。 1️⃣ n-gram 精确匹配率 计算不同长度的 n-gram(1-gram, 2-gram, ..., n-gram)在生成…...
24 python 类
在办公室里,类就像一个部门(如销售部、财务部),定义了该部门员工的共同属性(姓名、职位)和行为(处理客户、提交报表)。 一、面向对象技术简介 作为一个要入门码农的牛马࿰…...
pycharm与python版本
python 3.6-3.9 pycharm 2021版本搭配最好 python 3.8 pycharm 2019版本搭配最好 pycharm各版本下载...
23种设计模式-结构型模式-外观
文章目录 简介问题解决方案示例代码总结 简介 也称:门面模式、Facade。外观是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下,你需要负责…...
open3d教程 (三)点云的显示
官方文档位置: Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法: o3d.visualization.draw_geometries([几何对象列表]) import open3d as o3dprint("Load …...
node.js、npm相关知识
Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境,主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务,突破了 JavaScript 仅在浏览器中运行的限制。 npm(Node Package Man…...
大象如何学会太空漫步?美的:科技领先、To B和全球化
中国企业正处在转型的十字路口。一边是全新的技术、全新的市场机遇;一边是转型要面临的沉重负累和巨大投入,无数中国制造、中国品牌仍在寻路,而有的人已经走至半途。 近日,美的集团交出了一份十分亮眼的2024年财报。数据显示&…...
Go红队开发— 收官工具
文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 💡 本博客绝不涉及任何非法用途。 💡 使用者风险自担,违规后果自负。 💡 守法为先,技术向善。 …...
Android 应用程序包的 adb 命令
查看所有已安装应用的包名 命令:adb shell pm list packages说明:该命令会列出设备上所有已安装应用的包名。可以通过管道符|结合grep命令来过滤特定的包名,例如adb shell pm list packages | grep com.pm,这将只显示包名中包含co…...
北京南文观点:后糖酒会营销,以战略传播重构品牌信心坐标
第112届全国糖酒会落下帷幕,参展品牌面临一个关键命题。如何在流量洪流中沉淀品牌价值?北京南文(全称:南文乐园科技文化(北京)有限公司)认为,糖酒会的结束恰是算法时代品牌认知战的真…...
Qt - findChild
findChild 1. 函数原型2. 功能描述3. 使用场景4. 示例代码5. 注意事项6. 总结 在 Qt 中,每个 QObject 都可以拥有子对象,而 QObject 提供的模板函数 findChild 就是用来在对象树中查找满足特定条件的子对象的工具。下面我们详细介绍一下它的使用和注意事…...
2025年3月个人工作生活总结
本文为 2025年3月工作生活总结。 研发编码 一个curl下载失败问题的记录 问题: 某程序,指定IP和账户密码配置,再使用curl库连接sftp服务器,下载文件。在CentOS系统正常,但在某国产操作系统中失败,需要用命…...
Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析
Spring Boot 七种事务传播行为支持部分回滚的分析 支持部分回滚的传播行为 REQUIRES_NEW:始终开启新事务,独立于外部事务,失败时仅自身回滚。NESTED:在当前事务中创建保存点(Savepoint),可局部…...