统计匹配检索规则的物品数量

标签: 数组 字符串

难度: Easy

给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。

另给你一条由两个字符串 ruleKeyruleValue 表示的检索规则。

如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配

  • ruleKey == "type"ruleValue == typei
  • ruleKey == "color"ruleValue == colori
  • ruleKey == "name"ruleValue == namei

统计并返回 匹配检索规则的物品数量

 

示例 1:

输入:items = [["phone","blue","pixel"],["computer","silver","lenovo"],["phone","gold","iphone"]], ruleKey = "color", ruleValue = "silver"
输出:1
解释:只有一件物品匹配检索规则,这件物品是 ["computer","silver","lenovo"] 。

示例 2:

输入:items = [["phone","blue","pixel"],["computer","silver","phone"],["phone","gold","iphone"]], ruleKey = "type", ruleValue = "phone"
输出:2
解释:只有两件物品匹配检索规则,这两件物品分别是 ["phone","blue","pixel"] 和 ["phone","gold","iphone"] 。注意,["computer","silver","phone"] 未匹配检索规则。

 

提示:

  • 1 <= items.length <= 104
  • 1 <= typei.length, colori.length, namei.length, ruleValue.length <= 10
  • ruleKey 等于 "type""color""name"
  • 所有字符串仅由小写字母组成

Submission

运行时间: 31 ms

内存: 20.5 MB

class Solution:
    def countMatches(self, items: List[List[str]], ruleKey: str, ruleValue: str) -> int:
        i = {"type": 0, "color": 1, "name": 2}[ruleKey]
        return sum(item[i] == ruleValue for item in items)

Explain

这个题解使用了一个很简洁的方法来解决问题。首先,它通过一个字典将规则键('type', 'color', 'name')映射到物品列表中对应的索引(0, 1, 2)。然后,它遍历所有物品,并使用列表推导式来计算匹配给定规则的物品数量。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def countMatches(self, items: List[List[str]], ruleKey: str, ruleValue: str) -> int:
        i = {'type': 0, 'color': 1, 'name': 2}[ruleKey]  # 将规则键映射到索引
        return sum(item[i] == ruleValue for item in items)  # 计算匹配规则的物品数量

Explore

是的,如果规则键不存在于字典中,尝试访问该键会触发 KeyError 异常。为防止这种情况,可以使用字典的 get 方法,它允许在键不存在时返回一个默认值,例如 -1,然后检查这个返回值是否有效。如果是无效索引,则可以抛出一个更清晰的错误信息或者处理为特定的默认行为。示例代码:`i = {'type': 0, 'color': 1, 'name': 2}.get(ruleKey, -1); if i == -1: raise ValueError('Invalid ruleKey')`。

原代码确实假设所有属性值均为字符串类型。如果物品的属性值可能包括非字符串类型,应该确保在比较前统一数据类型。可以通过将属性值强制转换为字符串(使用 str 函数),然后进行比较。修改后的代码可以是:`sum(str(item[i]) == str(ruleValue) for item in items)`。这样可以保证即使属性值是数字或其他类型,代码也能正确运行而不会出错。

对于大数据量的处理,可以使用 Python 的多线程或多进程库来并行化处理。例如,可以使用 multiprocessing 库的 Pool 类来分配任务到多个进程。示例代码如下:`from multiprocessing import Pool; with Pool(processes=4) as pool: results = pool.map(lambda item: item[i] == ruleValue, items); return sum(results)`。此外,也可以考虑使用 NumPy 或 Pandas 这类库,它们内部优化了大量数据操作的性能。

如果规则键映射字典被意外修改,可能会导致错误的索引值被使用,进而导致程序逻辑错误或异常。为了提高程序的稳定性和正确性,确实有必要增加错误检查机制。一种方法是确保字典不被修改,例如使用 Python 的 frozendict 来创建不可变字典。另一种方法是在访问字典前进行键存在性检查,确保代码的健壮性。示例代码:`if ruleKey not in {'type', 'color', 'name'}: raise KeyError('Key is not valid')`。