资讯动态

LeetCode 1773 统计匹配检索规则的物品数量:模拟解法与多语言实现(LogicStack-LeetCode 刷题笔记)

发布时间:2026/10/10 9:24:38 来源:尧图企业网站定制
教程文档【免费下载链接】LogicStack-LeetCode公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码项目地址https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode点击查看免费下载本篇技术指南以 LogicStack-LeetCode 仓库中的题解 1773. 统计匹配检索规则的物品数量 为骨架完整讲解该「简单」题目的匹配规则、模拟思路与 Java / TypeScript / Python 多语言实现并补充 C 变体、可读性优先写法及易错点分析。读完本文你将掌握一类「按规则字段检索二维数据」问题的通用处理手法也能理解为何在题目约束下可以用首字符快速完成规则到列下标的映射。题目描述与匹配规则给定一个二维数组items其中每一项items[i] [type_i, color_i, name_i]依次描述第i件物品的类型、颜色、名称。另给出一条检索规则由两个字符串ruleKey和ruleValue组成。当且仅当满足下列条件之一时物品i被视为匹配该规则ruleKey type且ruleValue type_iruleKey color且ruleValue color_iruleKey name且ruleValue name_i。题目要求统计并返回匹配检索规则的物品数量。数据范围题目提示项目范围items.length1 items.length 10^4字段长度1 type_i.length, color_i.length, name_i.length, ruleValue.length 10ruleKey取值仅为type、color或name字符集所有字符串仅由小写字母组成这三条约束决定了我们可以采用极其轻量的实现ruleKey只有三种固定取值且三者的首字符t、c、n互不相同为「首字符映射下标」的写法提供了前提。示例走读示例 1输入items [[phone,blue,pixel],[computer,silver,lenovo],[phone,gold,iphone]] ruleKey color, ruleValue silver 输出1ruleKey color因此只比较每件物品的第 2 个字段下标 1。三件物品中只有[computer,silver,lenovo]的第 2 个字段等于silver故答案为1。示例 2输入items [[phone,blue,pixel],[computer,silver,phone],[phone,gold,iphone]] ruleKey type, ruleValue phone 输出2ruleKey type只比较每件物品的第 1 个字段下标 0。[computer,silver,phone]的name下标 2虽然也是phone但比较的字段是type因此不匹配。匹配的只有[phone,blue,pixel]和[phone,gold,iphone]答案为2。示例 2 特意提醒我们匹配必须发生在ruleKey指定的那一个字段上其它字段内容相同并不会产生匹配。解题思路把 ruleKey 映射为列下标本题属于最经典的「模拟」题型——题意本身即算法直接按规则逐条执行即可。关键点在于ruleKey是字符串而items[i]是三元组我们无法直接用ruleKey作为下标访问。因此第一步是把规则字符串翻译成一个列下标type→ 下标0color→ 下标1name→ 下标2映射完成后问题退化为一次线性扫描对每个item判断item[映射下标]是否等于ruleValue相等则计数加一。为什么可以用「首字符」完成映射根据题目提示ruleKey的取值被严格限定为type、color、name三者之一。三个单词的首字符分别是t、c、n两两不同因此只观察ruleKey的首字符就能唯一确定列下标首字符 t → 下标 0type 首字符 c → 下标 1color 其余n→ 下标 2name这是典型的「利用题目约束做最简实现」把三路if-else压缩成一个三元表达式。需要强调的是该技巧成立的前提正是题目对ruleKey取值的硬约束如果ruleKey可能是任意字符串就必须改用显式的分支判断或哈希映射本文后续会给出可读性优先的写法。多语言实现以下实现均来自原题解完整保留在仓库的 1773. 统计匹配检索规则的物品数量 中。Javaclass Solution { public int countMatches(ListListString items, String k, String v) { int ans 0, idx k.charAt(0) t ? 0 : k.charAt(0) c ? 1 : 2; for (ListString item : items) { if (item.get(idx).equals(v)) ans; } return ans; } }实现要点k.charAt(0)取出ruleKey首字符配合嵌套三元表达式完成idx的映射字符串比较必须使用equals(v)而非因为比较的是内容而非引用地址单次遍历无额外数据结构。TypeScriptfunction countMatches(items: string[][], k: string, v: string): number { let ans 0, idx k[0] t ? 0 : k[0] c ? 1 : 2 for (const item of items) { if (item[idx] v) ans } return ans }TS 中string[][]与 Java 的ListListString一一对应k[0]取首字符、item[idx]按下标取值逻辑完全一致。Pythonclass Solution: def countMatches(self, items: List[List[str]], k: str, v: str) - int: ans, idx 0, 0 if k[0] t else 1 if k[0] c else 2 for item in items: if item[idx] v: ans 1 return ansPython 的连续三元表达式0 if ... else 1 if ... else 2与 Java 的嵌套三元写法等价逐层缩进后阅读性反而更清晰。C同思路扩展思路与上述实现完全同构可作为本地调试时的对照版本class Solution { public: int countMatches(vectorvectorstring items, string k, string v) { int ans 0; int idx k[0] t ? 0 : k[0] c ? 1 : 2; for (const auto item : items) { if (item[idx] v) ans; } return ans; } };可读性优先的写法哈希映射版若面试或工程场景下追求「一眼可读」也可以用显式映射替代首字符技巧——代价是增加一次常数级的查表复杂度不变class Solution { public int countMatches(ListListString items, String k, String v) { MapString, Integer map new HashMap(); map.put(type, 0); map.put(color, 1); map.put(name, 2); int idx map.get(k); int ans 0; for (ListString item : items) { if (item.get(idx).equals(v)) ans; } return ans; } }两种写法的选择标准很简单代码最短竞赛/刷题选首字符映射可读性与健壮性优先工程/协作选显式映射。复杂度分析时间复杂度O(n)其中n items.length。规则映射为常数操作随后仅需一次线性扫描每件物品进行一次 O(1) 的取值与字符串比较。空间复杂度O(1)。除返回答案的计数器外不申请额外空间无论采用首字符映射还是常数大小的哈希表Map大小恒为 3均不随输入规模增长。边界情况与易错点字符串比较方式Java 中必须用equalsPython / TypeScript / C 中对字符串即比较内容可直接使用。若在 Java 中误用只有当ruleValue恰好是常量池中的同一对象时才可能成立属于典型的隐蔽错误。比较字段的定位ruleKey决定的是「按哪个字段比较」与ruleValue的内容无关。示例 2 中某物品的name等于phone但type不等于ruleKey type时就不匹配。首字符映射的前提该技巧依赖「ruleKey只可能是type/color/name三者之一」这一提示。若题目约束发生变化应回退到switch/if-else/ 哈希映射等显式方式。重复字段值同一ruleValue可能对应多件物品如示例 2计数时逐件累加即可无需去重——题目统计的是「物品数量」。题型定位与仓库索引本题在仓库的题型分类中被标记为「模拟」见 Index/模拟.md第 1773 条记录。模拟类题目的共同特征是状态转换规则由题意直接给出实现时忠实还原规则、避免过度设计。仓库中同属「模拟」且思路相近的简单题还可对照练习K 次取反后最大化的数组和按规则反复取反属于带贪心色彩的模拟奇数值单元格的数目按行/列增量规则模拟进阶版可用位运算压缩空间比赛中的配对次数按轮次配对规则模拟并可抽象出n - 1的数学结论。本仓库 README.md 说明这是一个「日更」的算法仓库题解按题号归档在LeetCode/目录下同时以Index/下的分类索引如 模拟组织全部题目适合按题型刷穿。小结「统计匹配检索规则的物品数量」是一道难度为简单的纯模拟题它的价值在于两点一是训练「把字符串规则翻译为可计算下标」的建模能力二是提醒我们善用题目约束写出更简洁的代码——在ruleKey取值受限的前提下首字符三元映射可以把三路分支压缩到一行同时将整体复杂度维持在 O(n) 时间、O(1) 空间。掌握这一题之后遇到「按条件字段检索记录」「按枚举名定位列下标」之类的模拟题都可以复用同一套思路先建模规则 → 下标/索引再扫描逐条比对计数最后利用约束做最小化实现。赞分享教程文档【免费下载链接】LogicStack-LeetCode公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码项目地址https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode点击查看免费下载相关推荐LogicStack-LeetCode 题解精讲动态规划攻克 LeetCode 10「正则表达式匹配」的完整推导与多语言实现LogicStack LeetCode 题解精讲动态规划攻克 LeetCode 10「正则表达式匹配」的完整推导与多语言实现 本文是「宫水三叶的刷题日记」系列教程文档LeetCode 1047 题解删除字符串中的所有相邻重复项——栈与数组模拟的多种实现LogicStack-LeetCode 刷题笔记LeetCode 1047 题解删除字符串中的所有相邻重复项——栈与数组模拟的多种实现LogicStack LeetCode 刷题笔记 导读 本文围绕 L教程文档LogicStack-LeetCode 刷题笔记双指针与通用解法吃透数组移除元素问题LeetCode 26 / 27LogicStack LeetCode 刷题笔记双指针与通用解法吃透数组移除元素问题LeetCode 26 / 27 本篇技术指南围绕公众号「宫水三叶的刷教程文档上一篇Prism Launcher 离线启动器教程一行代码解除登录限制10 分钟免账号启动 Minecraft下一篇云原神PC客户端适配完成Better Genshin Impact 低配电脑原神优化完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑