【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)

简介: 给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 :ruleKey == "type" 且 ruleValue == typei 。ruleKey == "color" 且 ruleValue == colori 。ruleKey == "name" 且 ruleValue == namei 。统计并返回 匹配检索规则的物品数量

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

给你一个数组 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"
  • 所有字符串仅由小写字母组成

分析

  • 这道算法题是简单题,也没想到什么能特别优化的地方。
  • 主要是 ruleKey 只有 "type"、"color" 或 "name"三种值,直接上if判断就可以了,用hash表好像除了代码看起来好看外,性能上也差不多。
  • 如果 ruleKey 的可取值范围大的话,就应该用hash表了。

题解

java

class Solution {
    public int countMatches(List<List<String>> items, String ruleKey, String ruleValue) {
        // 类型转换可以根据类型的多少去考虑,如果多的话,肯定是hash表比较好
        int type;
        switch(ruleKey) {
          case "type":
            type = 0;
            break;
          case "color":
            type = 1;
            break;
          default:
            // name
            type = 2;
            break;
        }
        int ans = 0;
        // 下面好像没有什么技巧
        for (List<String> item : items) {
          if (ruleValue.equals(item.get(type))) {
            ++ans;
          }
        }
        return ans;
    }
}

c

int countMatches(char *** items, int itemsSize, int* itemsColSize, char * ruleKey, char * ruleValue){
    int type;
    if (strcmp(ruleKey, "type") == 0) {
        type = 0;
    } else if (strcmp(ruleKey, "color") == 0) {
        type = 1;
    } else {
        // name
        type = 2;
    }
    int ans = 0;
    // 下面好像没有什么技巧
    for (int i = 0; i < itemsSize; ++i) {
        if (strcmp(ruleValue, items[i][type]) == 0) {
            ++ans;
        }
    }
    return ans;
}

c++

class Solution {
public:
    int countMatches(vector<vector<string>>& items, string ruleKey, string ruleValue) {
        // 类型转换可以根据类型的多少去考虑,如果多的话,肯定是hash表比较好
        int type;
        if ("type" == ruleKey) {
            type = 0;
        } else if ("color" == ruleKey) {
            type = 1;
        } else {
            // name
            type = 2;
        }
        int ans = 0;
        // 下面好像没有什么技巧
        for (vector<string> &item : items) {
            if (ruleValue == item[type]) {
                ++ans;
            }
        }
        return ans;
    }
};

python

class Solution:
    def countMatches(self, items: List[List[str]], ruleKey: str, ruleValue: str) -> int:
        if "type" == ruleKey:
            types = 0
        elif "color" == ruleKey:
            types = 1
        else:
            types = 2
        return sum(item[types] == ruleValue for item in items)

go

func countMatches(items [][]string, ruleKey string, ruleValue string) int {
    // 类型转换可以根据类型的多少去考虑,如果多的话,肯定是hash表比较好
    var types int
    switch ruleKey {
      case "type":
        types = 0
      case "color":
        types = 1
      default:
        types = 2
    }
    ans := 0
    // 下面好像没有什么技巧
    for _, item := range items {
      if ruleValue == item[types] {
        ans++
      }
    }
    return ans
}

rust

impl Solution {
    pub fn count_matches(items: Vec<Vec<String>>, rule_key: String, rule_value: String) -> i32 {
        let types = match rule_key.as_str() {
            "type" => 0,
            "color" => 1,
            _ => 2
        };
        items.iter().filter(|item| {
            rule_value == item[types]
        }).count() as i32
    }
}

在这里插入图片描述


原题传送门:https://leetcode-cn.com/problems/count-items-matching-a-rule/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
5月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1355 0
|
5月前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
5月前
|
jenkins Shell 测试技术
|
5月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
366 5
|
5月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
5月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
513 1
|
5月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
198 1
|
5月前
|
jenkins Java 测试技术
|
5月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
7月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
311 1

推荐镜像

更多