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

134 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 -> 统计匹配检索规则的物品数量

题目描述

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

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

如果第 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 <= 10^4
  • 1 <= typei.length, colori.length, namei.length, ruleValue.length <= 10
  • ruleKey 等于 "type"、"color" 或 "name"
  • 所有字符串仅由小写字母组成

思路分析

首先我们要先理解一下题目的意思,题目会我们一个数组 items,item为物品描述数组,每一项都包含一个物品的类型、颜色以及名称,还会给我们一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则,我们需要统计给出物品中满足这检索规则的物品数量。

我们可以有以下两种方法来进行统计

一、根据三个特征统计各属性的物品数量

题目中说到每一项都包含一个物品的类型、颜色以及名称也就是说我们只需要根据这三个特征来进行分类统计即可。

  • 1、定义一个map来分别记录三个特征属性

使用哈希表来记录每个特征属性物品的数量。

const res = {
    color:{},
    type:{},
    name:{}
};
  • 2、遍历统计各特征物品数量

遍历items数组,将统计各特征属性物品的数量。

for(const item of items){
    res.type[item[0]] = (res.type[item[0]] || 0) + 1;
    res.color[item[1]] = (res.color[item[1]] || 0) + 1;
    res.name[item[2]] = (res.name[item[2]] || 0) + 1;
}
  • 3、取出满足这检索规则的物品数量

在统计好的哈希表中直接取出满足这检索规则的物品数量即可。

return res[ruleKey][ruleValue] || 0;

二、直接遍历统计满足条件的物品数量

第一种方法适用于需要进行多次检索的情况,我们只需要统计一次,后面便可以直接根据检索条件来返回答案,在这道题目中我们只需要统计一次,所以直接统计满足条件的物品数量会更便捷,省去了不必要浪费的空间使用。

/**
 * @param {string[][]} items
 * @param {string} ruleKey
 * @param {string} ruleValue
 * @return {number}
 */
var countMatches = function(items, ruleKey, ruleValue) {
    let res = 0;
    const ruleKeyMap = {
        type:0,
        color:1,
        name:2
    };
    for(let i = 0; i < items.length; i++){
        if(items[i][ruleKeyMap[ruleKey]] == ruleValue) res++;
    }
    return res;
};

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。