2024华为OD试题及答案-A015-二元组个数

题目描述

给定两个数组a,b,若a[i] == b[j] 则称 [i, j] 为一个二元组,求在给定的两个数组中,二元组的个数。

输入描述

第一行输入 m
第二行输入m个数,表示第一个数组

第三行输入 n
第四行输入n个数,表示第二个数组

输出描述

二元组个数。

用例
输入4
1 2 3 4
1
1
输出1
说明二元组个数为 1个
输入6
1 1 2 2 4 5
3
2 2 4
输出5
说明二元组个数为 5 个。

问题解析

题目要求找到两个数组中相等元素的对数。具体来说,给定两个数组 ab,需要找出所有满足 a[i] == b[j] 的二元组 [i, j] 的数量。

输入描述

  1. 第一行输入一个整数 m,表示第一个数组的大小。
  2. 第二行输入 m 个整数,表示第一个数组 a
  3. 第三行输入一个整数 n,表示第二个数组的大小。
  4. 第四行输入 n 个整数,表示第二个数组 b

输出描述

输出二元组的个数。

实现思路

  1. 读取输入:读取两个数组 ab
  2. 建立字典:使用一个字典统计第一个数组中每个元素的出现次数。
  3. 遍历第二个数组:检查每个元素在第一个数组中出现的次数,并累加到二元组的数量中。
  4. 输出结果:输出二元组的数量。

实现步骤

  1. 读取输入:使用 cin 读取输入的两个数组。
  2. 构建字典:遍历数组 a,统计每个元素的出现次数。
  3. 统计二元组:遍历数组 b,根据字典统计符合条件的二元组数量。
  4. 输出结果

C++ 实现

以下是实现该逻辑的 C++ 代码:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main() {
    int m, n;
    cin >> m;
    vector<int> a(m);
    for (int i = 0; i < m; ++i) {
        cin >> a[i];
    }

    cin >> n;
    vector<int> b(n);
    for (int i = 0; i < n; ++i) {
        cin >> b[i];
    }

    unordered_map<int, int> count_map;
    for (int i = 0; i < m; ++i) {
        count_map[a[i]]++;
    }

    int pair_count = 0;
    for (int j = 0; j < n; ++j) {
        if (count_map.find(b[j]) != count_map.end()) {
            pair_count += count_map[b[j]];
        }
    }

    cout << pair_count << endl;

    return 0;
}

代码说明

  1. 输入处理:使用 cin 读取数组的大小和元素。
  2. 构建字典:使用 unordered_map 统计第一个数组中每个元素的出现次数。
  3. 统计二元组:遍历第二个数组,检查每个元素在第一个数组中的出现次数,并累加到二元组数量中。
  4. 输出结果:输出二元组数量。

输入输出示例

  • 输入:

4
1 2 3 4
1
1
  • 输出:
1

输入:

6
1 1 2 2 4 5
3
2 2 4

输出:

5

该程序能够根据输入的两个数组,正确计算并输出相等元素的二元组数量。

Python 实现

def main():
    import sys
    input = sys.stdin.read
    data = input().split()

    m = int(data[0])
    a = list(map(int, data[1:m+1]))
    
    n = int(data[m+1])
    b = list(map(int, data[m+2:m+2+n]))

    count_map = {}
    for num in a:
        if num in count_map:
            count_map[num] += 1
        else:
            count_map[num] = 1

    pair_count = 0
    for num in b:
        if num in count_map:
            pair_count += count_map[num]

    print(pair_count)

if __name__ == "__main__":
    main()

代码说明

  1. 输入处理:使用 input().split() 读取所有输入数据,并拆分成数组 ab
  2. 构建字典:使用 count_map 字典统计第一个数组 a 中每个元素的出现次数。
  3. 统计二元组:遍历第二个数组 b,检查每个元素在第一个数组 a 中的出现次数,并累加到二元组数量中。
  4. 输出结果:输出二元组数量。

使用示例

运行程序时,将按照下述步骤操作:

  1. 输入第一个数组的大小 m
  2. 输入第一个数组 a 的元素。
  3. 输入第二个数组的大小 n
  4. 输入第二个数组 b 的元素。
  5. 程序将输出二元组的数量。

示例输入:

4
1 2 3 4
1
1

示例输出:

1

示例输入:

6
1 1 2 2 4 5
3
2 2 4

示例输出:

5

该程序能够根据输入的两个数组,正确计算并输出相等元素的二元组数量。

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值