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

【华为OD机试真题】手牌接龙 · 最大出牌次数(Python /JS)

一、真题题目描述手里给一副手牌数字从0-9有(红色)g(绿色)b(蓝色)y(黄色)四种颜色出牌规则为每次打出的牌必须跟上一张的数字或者颜色相同否则不能抽选。选手应该怎么选才能使得抽选的次数最大并且输出这个最大次数。输入描述第一行牌的数值n(1n9)·第二行牌的颜色(r,g,b,y四种颜色表示)输出描述输出最大出牌数量0示例1【输入输出示例仅供调试后台判题数据一般不包含示例】输入1 4 3 4 5r y b b r输出3说明如果打(1,r)-(5,r)那么能打两张。如果打(4,y)-(4,b)-(3,b)那么能打三张。二、题目深度解析这道题的本质是在一个无向图或者是根据规则构建的有向图中寻找最长简单路径。节点每一张手牌。边如果两张牌数字相同或颜色相同则存在连接。约束每个节点只能访问一次。 解题思路由于 N 非常小最大为 9全排列的数量 9!362,880 对计算机来说微不足道。因此我们不需要复杂的动态规划或剪枝优化直接使用回溯法 (Backtracking)即可枚举起点最长序列的起始牌可能是任意一张因此我们需要外层循环遍历所有牌作为起点。深度搜索 (DFS)从当前牌出发遍历所有未使用的牌。检查是否满足接龙规则数字同 OR 颜色同。若满足标记该牌为“已使用”递归进入下一层路径长度 1。状态回溯递归返回后必须将该牌标记回“未使用”。这是回溯法的灵魂确保其他分支也能尝试使用这张牌。更新全局最大值在搜索的每一步都尝试更新记录到的最大长度。三、Python 实现 (简洁优雅风)Python 的代码极其精炼利用列表推导式和元组 unpacking可以让逻辑一目了然。import sys # 设置递归深度虽然 N9 不需要但养成好习惯 sys.setrecursionlimit(2000) def solve(): # 读取所有输入令牌 input_data sys.stdin.read().split() if not input_data: return iterator iter(input_data) try: n int(next(iterator)) except StopIteration: return numbers [] for _ in range(n): numbers.append(int(next(iterator))) colors [] for _ in range(n): colors.append(next(iterator)) # 组合成手牌列表: [(num, color), ...] cards list(zip(numbers, colors)) # 标记数组记录每张牌是否被使用 used [False] * n max_len 0 def dfs(last_idx, current_count): nonlocal max_len # 更新最大值 if current_count max_len: max_len current_count # 尝试接下一张牌 last_num, last_col cards[last_idx] for i in range(n): if not used[i]: curr_num, curr_col cards[i] # 规则判断数字相同 或 颜色相同 if curr_num last_num or curr_col last_col: used[i] True dfs(i, current_count 1) used[i] False # 回溯 # 枚举每一张牌作为起点 for i in range(n): used[i] True dfs(i, 1) used[i] False # 恢复状态以便下一次循环作为起点 print(max_len) if __name__ __main__: solve()✅ Python 版亮点输入处理sys.stdin.read().split()一次性读取并分割所有输入完美处理数字和颜色分两行输入的格式无需关心换行符。数据结构使用zip将数字和颜色打包成元组列表访问方便。闭包与 Nonlocal内部函数dfs直接访问外部变量max_len和used代码结构紧凑无需传过多的参数。逻辑清晰used[i] True-dfs-used[i] False的回溯三部曲非常直观。四、JavaScript (Node.js) 实现 (异步流处理)在 Node.js 中处理标准输入通常是异步的。我们需要确保所有数据读取完毕后再开始计算。const readline require(readline); function main() { const rl readline.createInterface({ input: process.stdin, output: process.stdout }); const lines []; // 监听每一行输入 rl.on(line, (line) { lines.push(line.trim()); }); // 输入结束时处理逻辑 rl.on(close, () { // 将所有行合并并按空格分割成令牌数组 const tokens lines.join( ).split(/\s/).filter(t t ! ); if (tokens.length 0) return; let idx 0; const n parseInt(tokens[idx], 10); const numbers []; for (let i 0; i n; i) { numbers.push(parseInt(tokens[idx], 10)); } const colors []; for (let i 0; i n; i) { colors.push(tokens[idx]); } // 组合手牌 const cards []; for (let i 0; i n; i) { cards.push({ num: numbers[i], col: colors[i] }); } const used new Array(n).fill(false); let maxLen 0; // DFS 函数 function dfs(lastIdx, currentCount) { if (currentCount maxLen) { maxLen currentCount; } const lastCard cards[lastIdx]; for (let i 0; i n; i) { if (!used[i]) { const currCard cards[i]; // 规则判断 if (currCard.num lastCard.num || currCard.col lastCard.col) { used[i] true; dfs(i, currentCount 1); used[i] false; // 回溯 } } } } // 枚举起点 for (let i 0; i n; i) { used[i] true; dfs(i, 1); used[i] false; } console.log(maxLen); }); } main();✅ JavaScript 版亮点健壮的输入流通过rl.on(close)确保所有数据包括跨行的数字和颜色都读取完毕后再统一解析。避免了异步读取导致的数据缺失问题。对象数组使用{ num, col }对象存储手牌语义清晰。作用域链dfs函数作为内部函数可以直接访问cards,used,maxLen等变量保持了代码的整洁性。严格相等使用进行比较符合 JS 最佳实践。五、深度解析回溯法的“现场恢复”这道题最容易出错的地方在于回溯步骤的遗漏。错误示范if condition: used[i] True dfs(i, count 1) # 忘记写 used[i] False后果假设路径 A 使用了牌 X递归结束后如果没有将 X 标记回False那么当算法尝试探索路径 B 时会发现 X 已经被占用从而跳过 X。这会导致很多合法的长路径被错误地截断最终结果偏小。正确逻辑想象你在走迷宫每走过一个路口插上一面旗帜used True。当你发现这条路走不通或者想尝试另一条路时必须拔掉旗帜used False把路口恢复原状这样后续的探索者其他递归分支才能再次通过这个路口。六、常见陷阱与注意事项⚠️起点的选择题目没有规定第一张出什么牌。很多人只从第 0 张牌开始 DFS这是错误的。必须在外层循环遍历0到n-1让每一张牌都有机会做“领头羊”。输入解析输入分为两行第一行全是数字第二行全是颜色。Python 的input().split()如果只调用两次会分别得到两行数据。需要小心处理索引对应关系第 ii 个数字对应第 ii 个颜色。本代码采用“扁平化”读取所有 token 的策略彻底规避了行对齐的问题。边界条件N1 时循环执行一次输出 1逻辑正确。没有任何牌能相连时最大值应为 1因为至少可以出一张牌代码逻辑天然支持这一点。七、复杂度分析时间复杂度 O(N!) 。在最坏情况下所有牌都能互连算法需要遍历全排列。对于 N9 9!≈3.6×105 在现代 CPU 上Python 和 JS 都能在几十毫秒内完成计算完全满足机考的时间限制通常为 1-2 秒。空间复杂度 O(N) 。主要用于递归调用栈深度最大为 N 和used数组。八、总结无论是Python的极简主义还是JavaScript的异步流处理解决这类问题的核心都在于对回溯状态的精准控制。Python 选手享受列表操作和闭包带来的便利用最少代码解决复杂问题。JS 选手掌握readline模块处理多行输入的技巧是前端/全栈工程师应对后端算法题的关键。这道题虽然数据规模小但它完美展示了暴力搜索 剪枝/回溯的思想。在数据规模允许的情况下这往往是最快写出且最不容易出错的方案。希望这篇博文能助你顺利拿下华为 OD 机考如果觉得有用请点赞、收藏⭐、评论支持一下

相关文章:

【华为OD机试真题】手牌接龙 · 最大出牌次数(Python /JS)

一、真题题目描述:手里给一副手牌,数字从0-9,有(红色),g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上一张的数 字或者颜色相同,否则不能抽选。 选手应该怎么选才…...

EasyExcel导出日期变#####?3分钟搞定列宽自适应问题(附@ColumnWidth注解详解)

EasyExcel导出日期变#####?3分钟搞定列宽自适应问题(附ColumnWidth注解详解) 当你用EasyExcel导出数据时,突然发现Excel里本该显示日期的单元格变成了一串"#####",这种场景对Java开发者来说再熟悉不过了。别…...

OpenCode终极指南:开源AI编程助手如何重塑你的开发体验

OpenCode终极指南:开源AI编程助手如何重塑你的开发体验 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 你是否厌倦了在多个A…...

StarRocks新手入门:如何用CloudDM个人版快速验证四种数据模型的特点?

StarRocks数据模型实战指南:用可视化工具快速掌握四大核心特性 刚接触StarRocks时,最让人困惑的莫过于四种数据模型的选择。官方文档虽然详细,但缺乏直观对比。本文将带你使用CloudDM个人版,通过同一组测试数据在四种模型下的不同…...

革命性角色生成引擎Pony V7:重新定义AI驱动的视觉创作范式

革命性角色生成引擎Pony V7:重新定义AI驱动的视觉创作范式 【免费下载链接】pony-v7-base 项目地址: https://ai.gitcode.com/hf_mirrors/purplesmartai/pony-v7-base 副标题:解决数字艺术行业5大核心难题——从风格割裂到高分辨率输出的全链路突…...

百川2-13B模型效果展示:代码生成与解释能力实测

百川2-13B模型效果展示:代码生成与解释能力实测 最近在开发者圈子里,关于AI编程助手的讨论越来越热。大家不再只关心模型参数有多大,而是更看重它实际干活的能力:我描述一个需求,它能写出能跑的代码吗?我贴…...

弹性伸缩与高可用:重力科技智能投放平台的云原生架构实践

一、 出海营销平台:流量洪峰与全球化部署的挑战 重力科技的AI智能投放平台,作为全球出海品牌的营销利器,面临着严峻的架构挑战: 流量洪峰: 面对全球不同时区的营销活动、节假日促销、突发热点等,请求量可能…...

Midscene.js vs Selenium:AI自动化与浏览器测试工具实战对比(附场景选择指南)

Midscene.js vs Selenium:AI自动化与浏览器测试工具实战对比(附场景选择指南) 在自动化测试和业务流程自动化的世界里,工具的选择往往决定了项目的成败。作为一名经历过无数次深夜调试和紧急修复的老兵,我深知选错工具…...

LSPosed实战:用Xposed给微信添加开发者调试菜单(免Root方案)

LSPosed高阶应用:为微信构建免Root调试菜单的技术实践 在移动应用开发领域,调试功能的便捷性直接影响开发效率。对于商业级应用如微信这样的超级App,标准的开发者选项往往无法满足深度定制需求。本文将揭示如何利用新一代LSPosed框架&#xf…...

Pixel Mind Decoder 嵌入式应用初探:STM32设备日志情绪分析

Pixel Mind Decoder 嵌入式应用初探:STM32设备日志情绪分析 1. 场景痛点与解决方案 在工业物联网领域,设备维护一直是个让人头疼的问题。想象一下,工厂里几十台STM32设备日夜运转,工程师们每天要盯着密密麻麻的日志数据&#xf…...

材料科学家的终极神器:pymatgen完整指南与实战应用

材料科学家的终极神器:pymatgen完整指南与实战应用 【免费下载链接】pymatgen Python Materials Genomics (pymatgen) is a robust materials analysis code that defines classes for structures and molecules with support for many electronic structure codes.…...

从0开始的SPSS数据分析:基础概念与核心检验实战

1. 认识SPSS与数据分析基础 第一次打开SPSS时,很多人会被密密麻麻的菜单栏吓到。别担心,这就像刚拿到新手机需要熟悉界面一样正常。SPSS(Statistical Package for the Social Sciences)本质上是个"统计计算器"&#xff…...

ADC肺毒性评估新方法:人源肺泡体外模型的实验研究与分析【曼博生物官方代理Epithelix 人原代肺细胞】

一、问题提出:为什么ADC肺毒性难以预测? 抗体药物偶联物(ADC)近年来在肿瘤治疗中发展迅速,其通过“抗体毒素”的组合,实现精准杀伤肿瘤细胞。 但在实际临床应用中,一个关键问题逐渐凸显&#xf…...

从8小时到15分钟:feishu-doc-export如何重构飞书文档管理流程

从8小时到15分钟:feishu-doc-export如何重构飞书文档管理流程 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export feishu-doc-export是一款基于.NET框架开发的飞书文档批量导出工具,通过封装飞…...

Gigasoft ProEssentials 使AI助手能够通过实时访问API图表配置并提供支持答案

利用人工智能访问改进图表开发Gigasoft ProEssentials 使 AI 助手能够通过实时访问 API 生成精确的图表配置并提供支持答案。Gigasoft ProEssentials 是一款功能强大的 Windows 开发图表库,提供丰富的 2D 和 3D 图表类型。该产品提供了一套用途广泛的组件&#xff0…...

Linux hostid命令实战:如何用它搞定软件授权和网络许可证管理

Linux hostid命令实战:如何用它搞定软件授权和网络许可证管理 在Linux系统管理中,软件授权和网络许可证管理一直是让开发者头疼的问题。想象一下,你刚部署了一套价值不菲的商业软件,结果因为授权问题导致服务中断;或者…...

cv_resnet101_face-detection_cvpr22papermogface 模型压缩与加速:面向边缘设备的部署探索

cv_resnet101_face-detection_cvpr22papermogface 模型压缩与加速:面向边缘设备的部署探索 1. 引言 想象一下,你手里有一台小巧的Jetson Nano开发板,想让它实时识别人脸,完成门禁或者客流统计。你兴冲冲地找到了一个效果不错的模…...

PyTorch网络可视化实战:Jupyter Notebook与TensorWatch的完美结合

1. 为什么需要PyTorch网络可视化? 当你第一次接触深度学习模型时,可能会被复杂的网络结构搞得晕头转向。想象一下,你正在搭建一个由几十层神经网络组成的模型,每层都有不同的参数和连接方式。这时候如果能直观地"看到"这…...

C#实战:5分钟搞定Winform鼠标坐标实时追踪(附API对比)

C#实战:Winform鼠标坐标追踪的深度优化与API选择指南 在自动化测试工具开发或屏幕绘图软件构建过程中,精确获取鼠标坐标是基础却关键的功能需求。许多开发者往往只满足于实现基本功能,却忽略了不同API选择对性能、精度和系统兼容性的深远影响…...

Legado内置Web服务深度剖析:轻量级架构与跨设备阅读体验升级

Legado内置Web服务深度剖析:轻量级架构与跨设备阅读体验升级 【免费下载链接】legado Legado 3.0 Book Reader with powerful controls & full functions❤️阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便…...

告别AppImage:在Ubuntu上源码编译QGroundControl地面站(QT项目实战)

从源码构建QGroundControl:Ubuntu开发者深度指南 为什么选择源码编译而非AppImage? 在无人机开发领域,QGroundControl(QGC)作为PX4生态的核心地面站软件,其预编译的AppImage包虽然提供了开箱即用的便利性&a…...

ArcMap属性表连接保姆级教程:从Excel到SHP,5分钟搞定数据挂接

ArcMap属性表连接实战指南:Excel与SHP高效挂接技巧 在地理信息系统(GIS)工作中,将外部数据与空间要素关联是常见需求。本文将手把手教你如何将Excel表格数据完美挂接到SHP矢量图层,解决实际工作中90%的连接问题。 1. 数…...

GBase 8c数据库权限管理场景实践 分享

环境要求项目参数目标数据库turboex数据库端口15400测试用户turboserver / turbolog测试模式test_privileges环境准备-- 清理旧环境gsql -r -d postgres -p 15400clean connection to all force for database turboex;drop database if exists turboex;drop user if exists tur…...

收藏 | 小白程序员必看:轻松入门RAG技术,让大模型拥有你的专业知识领域

收藏 | 小白程序员必看:轻松入门RAG技术,让大模型拥有你的专业知识领域 本文介绍了RAG(检索增强生成)技术,一种经济高效地解决大模型缺乏特定领域知识的方案。文章详细阐述了RAG的工作流程:用户请求→查询资…...

Nomic-Embed-Text-V2-MoE赋能Python爬虫:智能内容分析与去重

Nomic-Embed-Text-V2-MoE赋能Python爬虫:智能内容分析与去重 你是不是也遇到过这样的烦恼?写了个Python爬虫,吭哧吭哧爬了几万条新闻或者商品信息,结果发现里面一大堆内容都是重复的,或者只是换了个说法。用关键词去重…...

Vue Toast组件:轻量级通知解决方案的无侵入式集成实践

Vue Toast组件:轻量级通知解决方案的无侵入式集成实践 【免费下载链接】vue-sonner 🔔 An opinionated toast component for Vue. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-sonner 在现代Web应用开发中,用户交互反馈是提升体…...

Next-Admin:基于Next.js的企业级中后台管理系统技术评估与实施指南

Next-Admin:基于Next.js的企业级中后台管理系统技术评估与实施指南 【免费下载链接】next-admin An out-of-the-box admin based on NextJS and AntDesign | 一款基于nextjsantd5.0的中后台系统 项目地址: https://gitcode.com/gh_mirrors/ne/next-admin Nex…...

3步开启智能歌词管理:告别手动搜索,拥抱高效音乐体验

3步开启智能歌词管理:告别手动搜索,拥抱高效音乐体验 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾在深夜听到一首动人的歌曲&#xff…...

AI Agent社交网络:为什么这是比AI工具更值得关注的方向?

2026年,AI Agent已经从概念走向落地。从AutoGPT到各类AI助手产品,Agent的能力在不断提升。但有一个问题值得关注:当AI Agent越来越强大,它们之间需要社交吗?今天从行业角度,聊聊AI Agent社交网络这个话题。…...

python沉浸式戏曲文化体验系统vue3

目录 系统架构设计前端实现方案后端Python服务沉浸式体验关键技术开发里程碑计划测试策略部署方案 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 系统架构设计 采用前后端分离架构,前端使用Vue3TypeScriptPinia构…...