✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
给定两个数组A和B,若数组A的某个元素A[i]与数组B中的某个元素B[j]满足 A[i] == B[j],则寻找到一个值匹配的二元组(i, j)。
请统计在这两个数组A和B中,一共存在多少个这样的二元组。
2. 输入描述
第一行输入数组A的长度M;
第二行输入数组B的长度N;
第三行输入数组A的值;
第四行输入数组B的值。
1 <= M, N <= 100000
A, B数组中数值的取值均小于100000;
3. 输出描述
输出匹配的二元组个数。
补充说明:
若不存在相等的值,则输出0。
所采用的算法复杂度需小于O(N2)
,否则会超时。输入数组中允许出现重复数字,一个数字可以匹配多次。
4. Java算法源码
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 数组A的长度M
int M = in.nextInt();
// 数组B的长度N
int N = in.nextInt();
//数组A的值
int[] A = new int[M];
for (int i = 0; i < M; i++) {
A[i] = in.nextInt();
}
//数组B的值
int[] B = new int[N];
for (int i = 0; i < N; i++) {
B[i] = in.nextInt();
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int a : A) {
map.put(a, map.getOrDefault(a, 0) + 1);
}
int sum = 0;
for (int b : B) {
sum += map.getOrDefault(b, 0);
}
// 输出匹配的二元组个数
System.out.print(sum);
}
5. 测试
6.解题思路
- 读取输入的数组 A 的长度
M
和数组 B 的长度N
。 - 创建数组 A 和数组 B 并读取输入的值。
- 创建一个哈希表
map
用于记录数组 A 中每个元素的出现次数。键为元素的值,值为该元素出现的次数。 - 初始化变量
sum
为 0,用于记录匹配的二元组个数。 - 遍历数组 B,对于每个元素
b
:- 通过哈希表
map
获取元素b
在数组 A 中出现的次数,并将其加到sum
中。
- 通过哈希表
- 输出匹配的二元组个数
sum
。