当前位置: 首页 > article >正文

【华为OD-E卷-统计匹配的二元组个数 100分(python、java、c++、js、c)】

【华为OD-E卷-统计匹配的二元组个数 100分(python、java、c++、js、c)】

题目

给定两个数组A和B,若数组A的某个元素A[i]与数组B中某个元素B[j]满足 A[i] == B[j],则寻找到一个值匹配的二元组(i,j)。 请统计在这两个数组A和B中,一共存在多少个这样的二元组。

输入描述

  • 第一行输入数组A的长度M,

第二行输入数组B的长度N,

第三行输入数组A的值,

第四行输入数组B的值

输出描述

  • 输出匹配的二元组个数

备注

  • 若不存在相等的值,则输出0。 所采用的算法复杂度需小于O(N^2),否则会超时。 输入数组中允许出现重复数字,一个数字可以匹配多次

用例

用例一:
输入:
5
4
1 2 3 4 5
4 3 2 1
输出:
4
用例二:
输入:
6
3
1 2 4 4 2 1
1 2 3
输出:
4

python解法

  • 解题思路:
  • 首先输入两个整数 m 和 n,表示两个数组 a 和 b 的大小。
    接着输入两个列表 a 和 b,分别包含 m 个元素和 n 个元素。
    任务是统计数组 b 中有多少个元素在数组 a 中出现过。这里的元素是可能重复的。
    可以通过字典 counts 来存储数组 a 中每个元素出现的次数。然后遍历数组 b,每遇到一个在 a 中存在的元素,就将其计入匹配次数。
    最后输出匹配的总次数。
def solve():
    # 读入m和n
    m = int(input())  # 数组a的大小
    n = int(input())  # 数组b的大小

    # 读入数组a和b
    a = input().split()  # 数组a的元素
    b = input().split()  # 数组b的元素

    # 初始化一个字典,用于记录数组a中每个元素的出现次数
    counts = {}
    matches = 0  # 记录b中与a匹配的元素个数

    # 遍历数组a,统计每个元素出现的次数
    for x in a:
        counts[x] = counts.get(x, 0) + 1

    # 遍历数组b,查看其中的元素在a中出现过多少次
    for y in b:
        matches += counts.get(y, 0)  # 如果y在a中存在,就增加匹配次数

    # 输出最终的匹配次数
    print(matches)

solve()

java解法

  • 解题思路
  • 输入数据:首先输入两个整数 a 和 b,分别表示数组 arrA 和 arrB 的大小。接着输入两个字符串,分别是数组 arrA 和 arrB 的元素,元素之间用空格隔开。
    任务目标:统计数组 arrB 中的元素在数组 arrA 中出现的总次数。即数组 arrB 中每个元素在 arrA 中匹配到的次数总和。
    思路分析:
    使用一个 频率表(Map) 来记录数组 arrA 中每个元素出现的次数。
    遍历数组 arrB,查找数组 arrA 中每个元素出现的次数,并累加到结果中。
    代码步骤:
    通过 countFreq 方法统计数组 arrA 中每个元素的出现频率,返回一个 Map<String, Integer>。
    通过 calcMatches 方法遍历数组 arrB,并使用频率表查找每个元素在 arrA 中的出现次数,最终返回匹配次数。
    时间复杂度:假设数组 arrA 和 arrB 的长度分别为 a 和 b,那么时间复杂度是 O(a + b),因为分别遍历了两次数组。
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象,读取输入
        Scanner sc = new Scanner(System.in);

        // 读入数组arrA和arrB的大小,虽然a和b并不直接使用
        int a = Integer.parseInt(sc.nextLine()); // 数组arrA的大小
        int b = Integer.parseInt(sc.nextLine()); // 数组arrB的大小

        // 读入数组arrA和arrB的元素,使用空格分割
        String[] arrA = sc.nextLine().split(" "); // 数组arrA的元素
        String[] arrB = sc.nextLine().split(" "); // 数组arrB的元素

        // 统计数组arrA中每个元素的出现频率
        Map<String, Integer> freqMap = countFreq(arrA);

        // 计算数组arrB中元素在arrA中的匹配总次数
        int result = calcMatches(freqMap, arrB);

        // 输出匹配次数
        System.out.println(result);
    }

    // 统计数组中每个元素出现的频率
    private static Map<String, Integer> countFreq(String[] arr) {
        // 创建一个HashMap,用于存储元素及其出现的频率
        Map<String, Integer> freqMap = new HashMap<>();
        
        // 遍历数组,更新频率表
        for (String s : arr) {
            // getOrDefault方法,如果s在freqMap中存在,返回其对应的值,否则返回0
            freqMap.put(s, freqMap.getOrDefault(s, 0) + 1);
        }
        return freqMap; // 返回频率表
    }

    // 根据频率表计算在另一个数组中的匹配数量
    private static int calcMatches(Map<String, Integer> freqMap, String[] arr) {
        int total = 0; // 用于存储匹配的总次数
        
        // 遍历数组arr,累加匹配次数
        for (String s : arr) {
            // 如果s在freqMap中有记录,则返回其频率,否则返回0
            total += freqMap.getOrDefault(s, 0);
        }
        
        return total; // 返回总匹配次数
    }
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.kler.cn/a/461079.html

相关文章:

  • CDP集群安全指南-静态数据加密
  • 15. 接雨水
  • 鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理
  • 戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
  • Redis的生态系统和社区支持
  • 每天五分钟机器学习:凸集
  • 大语言模型遇上寻路算法:LLM-A*如何让路径规划效率提升50%?
  • 高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
  • 又一年。。。。。。
  • QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE (二)
  • 基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档
  • MySQL 并行复制:提升数据同步速度的秘密武器
  • Maven (day04)
  • Type-C接口台式显示器:LDR6021引领新潮流
  • 激光雷达点云语义分割——Polarseg环境配置
  • 深入理解 MVCC:多版本并发控制详解
  • Android 系统 AlarmManager 系统层深度定制
  • Qt信号的返回值
  • Xpath学习
  • AirLLM: 分层推理在低内存硬件上的应用
  • k8s 部署meilisearch UI
  • CentOS 7系统 OpenSSH和OpenSSL版本升级指南
  • 基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法
  • 复合选择器,CSS特性,emmet写法,背景属性,显示模式
  • 快递行业的创新引擎,近屿智能带您探索AI的无限可能
  • AI开发 - 算法基础 递归 的概念和入门(二)汉诺塔问题 递归的应用和使用注意 - Python