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

PTA刷题避坑指南:L1-027‘出租’题的双指针去重与下标映射详解

PTA刷题避坑指南L1-027‘出租’题的双指针去重与下标映射详解当你第一次看到PTA平台L1-027这道出租题时可能会觉得它不过是个简单的字符串处理问题。但真正动手实现时很多人会陷入去重逻辑混乱、下标查找效率低下的困境。本文将从算法优化的角度带你重新审视这道经典题目。1. 问题本质与常见误区这道题的核心要求可以分解为两个部分首先将11位手机号码中的数字按降序排列并去重其次为原始号码中的每一位数字找到其在去重后数组中的索引位置。表面上看这似乎只需要基本的排序和查找操作但实际编码时会遇到几个典型问题去重逻辑混乱很多初学者会尝试在排序过程中直接去重导致算法复杂度骤增下标查找低效使用线性查找处理11位号码虽然可行但缺乏扩展性代码冗余常见实现中存在大量重复的数组拷贝和转换操作最容易被忽视的一个事实题目中的arr数组实际上是原始号码的数字指纹而index数组则是这个指纹的映射关系。理解这一点对优化代码结构至关重要。2. 双指针去重的艺术原始解法使用了冒泡排序双指针去重的组合。虽然可行但存在优化空间。让我们先看一个更优雅的双指针实现def deduplicate_sorted(arr): if not arr: return 0 slow 0 for fast in range(1, len(arr)): if arr[fast] ! arr[slow]: slow 1 arr[slow] arr[fast] return slow 1这个版本有几个关键改进前置条件检查处理空数组边缘情况指针初始化slow指针始终指向当前唯一序列的末尾元素比较只在不相等时才移动slow指针实际应用时需要注意双指针去重必须在有序数组上操作。因此我们应先排序再去重numbers list(map(int, phone_number)) numbers_sorted sorted(numbers, reverseTrue) unique_len deduplicate_sorted(numbers_sorted) unique_numbers numbers_sorted[:unique_len]3. 下标查找的优化策略原始解法使用线性查找建立索引映射时间复杂度为O(n²)。对于固定11位号码尚可接受但不够优雅。我们可以用哈希表进行优化index_map {num: idx for idx, num in enumerate(unique_numbers)} index_array [index_map[num] for num in numbers]这种方法的优势在于时间复杂度降为O(n)预处理阶段建立哈希表是O(n)后续每次查找是O(1)代码更简洁列表推导式取代了显式循环扩展性强适用于任意长度的号码处理性能对比方法时间复杂度11位号码100位号码线性查找O(n²)121次操作10,000次操作哈希表O(n)22次操作200次操作4. 通用化解决方案题目限定11位号码但优秀的代码应该具备处理任意长度输入的能力。以下是通用化改进输入验证def validate_phone(phone_str): if not phone_str.isdigit(): raise ValueError(输入必须为纯数字) return list(map(int, phone_str))动态处理def process_phone_number(phone_str): numbers validate_phone(phone_str) unique_sorted sorted(set(numbers), reverseTrue) index_map {num: idx for idx, num in enumerate(unique_sorted)} return unique_sorted, [index_map[num] for num in numbers]输出格式化def format_output(unique_sorted, index_array): arr_str { ,.join(map(str, unique_sorted)) } index_str { ,.join(map(str, index_array)) } return fint[] arr new int[]{arr_str};\nint[] index new int[]{index_str};这种实现不仅更健壮而且通过使用Python内置的set去重进一步简化了代码。虽然牺牲了一点教学意义不再显式展示双指针但在实际工程中是更优选择。5. 边界情况与异常处理优秀的算法实现必须考虑各种边界情况全相同数字如11111111111预期输出arr [1],index [0,0,...,0]空输入虽然题目保证输入但通用解法应处理if not phone_str: raise ValueError(输入不能为空)非数字字符if any(not c.isdigit() for c in phone_str): raise ValueError(包含非数字字符)极长输入虽然PTA不测试但实际应用要考虑if len(phone_str) 1000: # 设置合理上限 raise ValueError(输入过长)6. 语言特性与性能取舍不同编程语言对这个问题有不同最优解。以C为例#include vector #include algorithm #include unordered_map auto process_phone(const std::string phone) { std::vectorint numbers; for (char c : phone) { numbers.push_back(c - 0); } std::vectorint unique_sorted numbers; std::sort(unique_sorted.begin(), unique_sorted.end(), std::greater()); unique_sorted.erase(std::unique(unique_sorted.begin(), unique_sorted.end()), unique_sorted.end()); std::unordered_mapint, size_t index_map; for (size_t i 0; i unique_sorted.size(); i) { index_map[unique_sorted[i]] i; } std::vectorint index_array; for (int num : numbers) { index_array.push_back(index_map[num]); } return std::make_pair(unique_sorted, index_array); }C版本利用了STL算法代码更简洁同时保持了高性能。关键点std::sortstd::greater实现降序排序std::unique实现去重需要先排序std::unordered_map实现O(1)复杂度的查找7. 测试用例设计全面验证代码需要设计多种测试用例test_cases [ (18013820100, [8,3,2,1,0], [3,0,4,3,1,0,2,4,3,4,4]), (11111111111, [1], [0]*11), (12345678901, [9,8,7,6,5,4,3,2,1,0], [8,7,6,5,4,3,2,1,0,9,1]), (98765432100, [9,8,7,6,5,4,3,2,1,0], [0,1,2,3,4,5,6,7,8,9,9]) ] for phone, expected_arr, expected_index in test_cases: arr, index process_phone_number(phone) assert arr expected_arr assert index expected_index特别要注意的边界测试所有数字相同已经严格降序排列的输入包含0的号码极值情况虽然题目固定11位8. 从题目到实际应用的延伸这道题虽然简单但涉及的技术点在实际开发中广泛应用数据指纹生成类似arr数组的去重排序结果常用于生成数据特征摘要索引映射index数组的思想在序列化/反序列化、数据压缩中很常见算法选择根据数据规模选择线性查找或哈希表是性能优化的基本功例如处理用户手机号时可能需要类似技术def analyze_phone_pattern(phone): digits [int(c) for c in phone] unique sorted(set(digits), reverseTrue) pattern [unique.index(d) for d in digits] return { unique_digits: unique, digit_variety: len(unique), pattern: pattern, is_monotonic: all(xy for x,y in zip(pattern, pattern[1:])) }这个扩展应用可以分析号码的数字分布特征用于风险控制等场景。

相关文章:

PTA刷题避坑指南:L1-027‘出租’题的双指针去重与下标映射详解

PTA刷题避坑指南:L1-027‘出租’题的双指针去重与下标映射详解 当你第一次看到PTA平台L1-027这道"出租"题时,可能会觉得它不过是个简单的字符串处理问题。但真正动手实现时,很多人会陷入去重逻辑混乱、下标查找效率低下的困境。本…...

终极指南:如何将电视盒子变身高性能Linux服务器

终极指南:如何将电视盒子变身高性能Linux服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568…...

从原型到上线仅4小时:某省级政务平台Dify低代码集成全周期复盘(含OpenAPI Schema自动映射工具链下载链接)

更多请点击: https://intelliparadigm.com 第一章:从原型到上线仅4小时:某省级政务平台Dify低代码集成全周期复盘(含OpenAPI Schema自动映射工具链下载链接) 某省级“一网通办”政务平台在紧急应对突发政策落地需求时…...

PotPlayer字幕翻译插件完整指南:三步实现外语视频无障碍观看

PotPlayer字幕翻译插件完整指南:三步实现外语视频无障碍观看 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为看不懂外…...

终极指南:3步快速破解极域电子教室限制的完整方案

终极指南:3步快速破解极域电子教室限制的完整方案 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专为对抗极域电子教室控制而设计的开源软件&#…...

平板 手机触摸屏坏了就丢掉吗?

平板电脑的触碰坏了就丢掉吗?还有办法下载这个软件附件的软件,USB线连接平板,点击 scrcpy.exe在电脑上就可以,鼠标左键点击,鼠标右键是返回。就可以操作手机或者平板了。通过网盘分享的文件:平板无法触摸了…...

SkeyeVSS开发FAQ:版本升级数据迁移与回滚

试用安装包下载 | SMS | 在线演示 项目源码地址:https://github.com/openskeye/go-vss 1. 升级前准备 阅读 Release Note:是否有不兼容配置、数据库迁移脚本、端口变更;全量备份:MySQL 逻辑备份、Redis、etcd 快照(若…...

重构QQ音乐加密音频格式:用qmc-decoder实现跨平台解密

重构QQ音乐加密音频格式:用qmc-decoder实现跨平台解密 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 当你在QQ音乐平台购买或下载的歌曲只能在特定应用播放&am…...

从电视棒到无线电:手把手教你用RTL-SDR V4搭建个人频谱监测站(附避坑指南)

从电视棒到无线电:手把手教你用RTL-SDR V4搭建个人频谱监测站(附避坑指南) 十年前,谁会想到一个20美元的电视棒能变成无线电爱好者的瑞士军刀?2012年,当黑客们发现Realtek RTL2832U芯片能绕过数字电视解码…...

从SDR到5G原型:拆解AD9361的TDD/FDD切换与滤波器设计,如何影响你的系统性能?

从SDR到5G原型:拆解AD9361的TDD/FDD切换与滤波器设计,如何影响你的系统性能? 在无线通信系统开发中,AD9361这颗高度集成的射频收发器芯片已经成为软件定义无线电(SDR)和5G原型设计的核心组件。它独特的灵活性和可配置性让工程师能…...

Go语言TUI开发实战:基于Bubble Tea框架构建终端井字棋游戏

1. 项目概述:一个用Go语言打造的终端井字棋游戏最近在整理自己的Go语言学习项目时,翻到了一个挺有意思的小玩意儿——一个完全运行在终端里的井字棋游戏。这可不是那种黑底白字的简陋命令行程序,而是一个拥有彩色界面、支持键盘导航、交互体验…...

3个维度深度解析:NVIDIA Profile Inspector如何解锁显卡隐藏性能

3个维度深度解析:NVIDIA Profile Inspector如何解锁显卡隐藏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款能够深入访问NVIDIA驱动内部数据库的专业工…...

基于OpenShell硬件沙箱与Hermes Agent构建安全可控的本地AI智能体

1. 项目概述:在硬件级沙箱中安全运行AI智能体如果你和我一样,对AI智能体的强大能力着迷,但又对让它直接访问你的网络、文件系统甚至执行任意系统调用感到不安,那么HermesClaw这个项目绝对值得你花时间研究。简单来说,它…...

告别DETR训练慢!手把手教你用Deformable DETR在COCO数据集上快速收敛

突破DETR训练瓶颈:Deformable DETR实战指南与性能优化解析 目标检测领域近年来迎来Transformer架构的革新浪潮,DETR作为首个端到端的Transformer检测器,以其简洁的架构设计颠覆了传统检测流程。然而在实际工程落地时,开发者们普遍…...

ThreeFingerDragOnWindows完全指南:在Windows上实现MacBook级三指拖拽体验

ThreeFingerDragOnWindows完全指南:在Windows上实现MacBook级三指拖拽体验 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th…...

别再死记硬背公式了!用Cadence Virtuoso手把手教你仿真MOS偏置电路(附避坑指南)

从零搭建MOS偏置电路:Cadence Virtuoso仿真实战与性能优化 在模拟集成电路设计中,偏置电路如同建筑物的地基,决定了整个系统的稳定性和性能上限。许多初学者常陷入理论公式的泥潭,却在实际仿真时遭遇各种意外结果——PSRR不达标、…...

2026年权威发布:GEO优化系统贴牌源头公司怎么选?深度测评TOP5服务商避坑指南

当传统搜索引擎还在围绕关键词排名内卷时,AI搜索已经重新定义了用户获取信息的方式。人们向ChatGPT、DeepSeek、豆包等模型提问,模型从浩瀚的网络内容中提炼答案并直接生成建议。对企业而言,核心命题不再是某个网页排在百度第几位&#xff0c…...

Python国密实战:用gmssl库5分钟搞定SM2/SM3/SM4加密与签名

Python国密算法实战:5分钟掌握SM2/SM3/SM4核心操作 国密算法作为信息安全领域的重要技术标准,正在金融、政务、物联网等行业快速普及。对于Python开发者而言,如何在项目中快速集成SM2非对称加密、SM3哈希算法和SM4对称加密,成为提…...

别再死磕mmcv-full了!手把手教你用mmcv 2.x+mmengine解决ModuleNotFoundError: No module named ‘mmcv.runner‘

深度解析OpenMMLab生态升级:从MMCV 1.x到2.x的平滑迁移指南 当你在PyTorch 2.x环境中运行一个基于OpenMMLab旧版本的项目时,突然遇到ModuleNotFoundError: No module named mmcv.runner这样的错误,这往往意味着你正站在OpenMMLab生态重大架构…...

保姆级教程:2024年MathorCup数学建模C题,从选题到论文提交的完整实战流程

保姆级教程:2024年MathorCup数学建模C题,从选题到论文提交的完整实战流程 数学建模竞赛对于许多本科生来说,既是挑战也是机遇。特别是像MathorCup这样具有影响力的赛事,往往能让学生在短时间内快速提升问题分析、算法实现和团队协…...

Pytorch图像去噪实战(三十九):图像质量回归测试,防止模型更新后去噪效果变差

Pytorch图像去噪实战(三十九):图像质量回归测试,防止模型更新后去噪效果变差 一、问题场景:新模型上线后,用户反馈图片更糊了 图像去噪模型迭代时,经常会遇到这种情况: 新模型 PSNR 更高 训练 loss 更低 论文指标更好 但业务图像效果变差 比如: OCR图片文字边缘变虚 …...

5个必学技巧:掌握AMD Ryzen处理器SMU调试工具的终极指南

5个必学技巧:掌握AMD Ryzen处理器SMU调试工具的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…...

初创公司如何通过Taotoken管理多模型API成本与用量

初创公司如何通过Taotoken管理多模型API成本与用量 1. 多模型API的成本管理挑战 初创团队在开发AI应用时,往往需要同时接入多个大模型API以满足不同场景需求。随着业务规模扩大,模型调用量增长带来的成本压力会逐渐显现。常见问题包括:不同…...

ARM AMBA ASB总线架构与嵌入式系统设计解析

1. ARM AMBA ASB总线架构解析在嵌入式系统设计中,总线架构如同城市的交通网络,决定了各个功能模块之间数据流动的效率和可靠性。AMBA(Advanced Microcontroller Bus Architecture)作为ARM公司推出的片上总线标准,已经成…...

抖音下载器完整指南:免费批量下载无水印抖音视频、图集和音乐终极教程

抖音下载器完整指南:免费批量下载无水印抖音视频、图集和音乐终极教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser…...

别再被MySQL的ambiguous错误搞懵了!手把手教你用表别名彻底解决多表查询字段冲突

多表查询字段冲突终极解决方案:表别名的艺术与科学 在数据库查询的世界里,JOIN操作就像一场精心编排的舞会,各张表优雅地旋转、交织,共同演绎数据的交响曲。但当多张表拥有相同名字的字段时,这场舞会就可能变成一场混乱…...

原神自动化脚本:如何让派蒙帮你解放双手,轻松畅游提瓦特

原神自动化脚本:如何让派蒙帮你解放双手,轻松畅游提瓦特 【免费下载链接】genshin-impact-script 原神脚本,包含自动钓鱼、自动拾取、自动跳过对话等多项实用功能。A Genshin Impact script includes many useful features such as automatic…...

深度解析:ComfyUI-ControlNet-Aux项目中DepthAnything节点参数错误的技术根源与修复方案

深度解析:ComfyUI-ControlNet-Aux项目中DepthAnything节点参数错误的技术根源与修复方案 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 在AI图…...

告别蓝牙和服务器:5分钟为你的微信小游戏加上局域网联机对战功能

5分钟实现微信小游戏局域网联机对战:零服务器极简方案 在移动游戏开发领域,社交互动功能往往能显著提升用户留存率。然而对于独立开发者和小团队而言,传统基于服务器的联机方案存在两大痛点:一是云服务成本高昂,二是技…...

别再死记硬背了!用对比学习(Contrastive Learning)让AI自己学会‘找不同’

对比学习:让AI像人类一样通过比较掌握世界 想象一下教孩子认识动物——你不会准备几千张标注好的图片,而是指着绘本说:"看,这只毛茸茸、有长鼻子的是大象,和刚才看到的狮子不一样吧?"这种通过比较…...