news 2026/10/9 2:31:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1773 统计匹配检索规则的物品数量:模拟解法与多语言实现(LogicStack-LeetCode 刷题笔记)
  • 教程
  • 文档

【免费下载链接】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_i;
  • ruleKey = "color"且ruleValue = color_i;
  • ruleKey = "name"且ruleValue = name_i。

题目要求统计并返回匹配检索规则的物品数量。

数据范围(题目提示)

项目范围
items.length1 <= items.length <= 10^4
字段长度1 <= type_i.length, color_i.length, name_i.length, ruleValue.length <= 10
ruleKey取值仅为"type"、"color"或"name"
字符集所有字符串仅由小写字母组成

这三条约束决定了我们可以采用极其轻量的实现:ruleKey只有三种固定取值,且三者的首字符t、c、n互不相同,为「首字符映射下标」的写法提供了前提。


示例走读

示例 1:

输入:items = [["phone","blue","pixel"],["computer","silver","lenovo"],["phone","gold","iphone"]] ruleKey = "color", ruleValue = "silver" 输出:1

ruleKey = "color",因此只比较每件物品的第 2 个字段(下标 1)。三件物品中只有["computer","silver","lenovo"]的第 2 个字段等于"silver",故答案为1。

示例 2:

输入:items = [["phone","blue","pixel"],["computer","silver","phone"],["phone","gold","iphone"]] ruleKey = "type", ruleValue = "phone" 输出:2

ruleKey = "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"→ 下标0
  • "color"→ 下标1
  • "name"→ 下标2

映射完成后,问题退化为一次线性扫描:对每个item,判断item[映射下标]是否等于ruleValue,相等则计数加一。

为什么可以用「首字符」完成映射

根据题目提示,ruleKey的取值被严格限定为"type"、"color"、"name"三者之一。三个单词的首字符分别是t、c、n,两两不同,因此只观察ruleKey的首字符就能唯一确定列下标:

首字符 't' → 下标 0(type) 首字符 'c' → 下标 1(color) 其余('n')→ 下标 2(name)

这是典型的「利用题目约束做最简实现」:把三路if-else压缩成一个三元表达式。需要强调的是,该技巧成立的前提正是题目对ruleKey取值的硬约束;如果ruleKey可能是任意字符串,就必须改用显式的分支判断或哈希映射(本文后续会给出可读性优先的写法)。


多语言实现

以下实现均来自原题解,完整保留在仓库的 1773. 统计匹配检索规则的物品数量 中。

Java

class Solution { public int countMatches(List<List<String>> items, String k, String v) { int ans = 0, idx = k.charAt(0) == 't' ? 0 : k.charAt(0) == 'c' ? 1 : 2; for (List<String> item : items) { if (item.get(idx).equals(v)) ans++; } return ans; } }

实现要点:

  • k.charAt(0)取出ruleKey首字符,配合嵌套三元表达式完成idx的映射;
  • 字符串比较必须使用equals(v)而非==,因为比较的是内容而非引用地址;
  • 单次遍历,无额外数据结构。

TypeScript

function 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 的List<List<String>>一一对应,k[0]取首字符、item[idx]按下标取值,逻辑完全一致。

Python

class 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 ans

Python 的连续三元表达式0 if ... else 1 if ... else 2与 Java 的嵌套三元写法等价,逐层缩进后阅读性反而更清晰。

C++(同思路扩展)

思路与上述实现完全同构,可作为本地调试时的对照版本:

class Solution { public: int countMatches(vector<vector<string>>& 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(List<List<String>> items, String k, String v) { Map<String, 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 (List<String> item : items) { if (item.get(idx).equals(v)) ans++; } return ans; } }

两种写法的选择标准很简单:代码最短(竞赛/刷题)选首字符映射,可读性与健壮性优先(工程/协作)选显式映射。


复杂度分析

  • 时间复杂度:O(n),其中n = items.length。规则映射为常数操作,随后仅需一次线性扫描,每件物品进行一次 O(1) 的取值与字符串比较。
  • 空间复杂度:O(1)。除返回答案的计数器外不申请额外空间,无论采用首字符映射还是常数大小的哈希表(Map大小恒为 3),均不随输入规模增长。

边界情况与易错点

  1. 字符串比较方式:Java 中必须用equals;Python / TypeScript / C++ 中==对字符串即比较内容,可直接使用。若在 Java 中误用==,只有当ruleValue恰好是常量池中的同一对象时才可能成立,属于典型的隐蔽错误。

  2. 比较字段的定位:ruleKey决定的是「按哪个字段比较」,与ruleValue的内容无关。示例 2 中某物品的name等于"phone"但type不等于,ruleKey = "type"时就不匹配。

  3. 首字符映射的前提:该技巧依赖「ruleKey只可能是type/color/name三者之一」这一提示。若题目约束发生变化,应回退到switch/if-else/ 哈希映射等显式方式。

  4. 重复字段值:同一ruleValue可能对应多件物品(如示例 2),计数时逐件累加即可,无需去重——题目统计的是「物品数量」。


题型定位与仓库索引

本题在仓库的题型分类中被标记为「模拟」,见 Index/模拟.md(第 1773 条记录)。模拟类题目的共同特征是:状态转换规则由题意直接给出,实现时忠实还原规则、避免过度设计。

仓库中同属「模拟」且思路相近的简单题还可对照练习:

    1. K 次取反后最大化的数组和:按规则反复取反,属于带贪心色彩的模拟;
    1. 奇数值单元格的数目:按行/列增量规则模拟,进阶版可用位运算压缩空间;
    1. 比赛中的配对次数:按轮次配对规则模拟,并可抽象出n - 1的数学结论。

本仓库 README.md 说明这是一个「日更」的算法仓库,题解按题号归档在LeetCode/目录下,同时以Index/下的分类索引(如 模拟)组织全部题目,适合按题型刷穿。


小结

「统计匹配检索规则的物品数量」是一道难度为简单的纯模拟题,它的价值在于两点:一是训练「把字符串规则翻译为可计算下标」的建模能力;二是提醒我们善用题目约束写出更简洁的代码——在ruleKey取值受限的前提下,首字符三元映射可以把三路分支压缩到一行,同时将整体复杂度维持在 O(n) 时间、O(1) 空间。

掌握这一题之后,遇到「按条件字段检索记录」「按枚举名定位列下标」之类的模拟题,都可以复用同一套思路:先建模(规则 → 下标/索引),再扫描(逐条比对计数),最后利用约束做最小化实现。

  • 教程
  • 文档

【免费下载链接】LogicStack-LeetCode

公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码

项目地址:https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode
点击查看免费下载

相关推荐

上一篇:Prism Launcher 离线启动器教程:一行代码解除登录限制,10 分钟免账号启动 Minecraft
下一篇:云原神PC客户端适配完成:Better Genshin Impact 低配电脑原神优化完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 2:31:15

AI Logo 设计工具怎么选?多款品牌标识生成工具能力客观记录

新品牌注册、项目命名、账号头像、门店招牌、产品包装等场景中&#xff0c;Logo 是品牌识别的核心资产。不同 Logo 工具在图形生成能力、字体适配、品牌调性控制、矢量输出、版权合规性上存在明显差异。下文客观记录五款 Logo 相关工具的基础能力与使用局限&#xff0c;本文无任…

作者头像 李华
网站建设 2026/10/9 2:30:59

OpenClaw 实现小红书自动化发文:操作指南与 TaoToken 统一 Key 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 2:30:09

PL/SQL Developer 13免安装中文版配置指南

简介&#xff1a;PL/SQL Developer 13 可选中文语言免安装版是一套面向 Oracle 数据库管理员与开发人员的便携式开发工具包&#xff0c;旨在免去传统安装步骤、消除英文界面带来的操作障碍。内置 SQL 与 PL/SQL 双编辑器&#xff0c;支持语法高亮、自动补全、错误检查和断点调试…

作者头像 李华