华为OD题目:统计匹配的二元组个数

华为OD题目:统计匹配的二元组个数

知识点数组
时间限制: 1s 空间限制: 32MB 限定语言: 不限
题目描述:
给定两个数组A和B,若数组A的某个元素AD与数组B中的某个元素BI]满足 AD == B,则寻找到一个值匹配的元组(i.i).请统计在这两个数组A和B中,一共存在多少个这样的二元组。

输入描述:第一行输入数组A的长度M; 第二行输入数组B的长度N; 第三行输入数组A的值: 第四行输入数组B的值。1 <= MN <= 100000
A,B数组中数值的取值均小于100000:
输出描述:
输出匹配的二元组个数
补充说明:
若不存在相等的值,则输出0.所采用的算法复杂度需小于O(N“2),否则会超时。输入数组中允许出现重复数字,一个数字可以匹配
多次。

示例1
输入:
5
4
1 2 3 4 5
4 3 2 1
输出:
4
说明:
若下标从0开始,则匹配的二元组分别为(0.3).(1.2).(2.1).(3.0).共计4个

示例2
输入:
6
3
1 2 4 4 2 1
1 2 3
输出:
4

说明:
若下标从0开始,则匹配的二元组分别为(0,0),(1,1),(4, 1),(5,0) 共计4个。

解题思路:
1使用map来记录A的元素及其个数
2.如果map中的key在B中存在,则二元数组个数为其map的value值

public class My {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = Integer.parseInt(sc.nextLine());
        int n = Integer.parseInt(sc.nextLine());
        String[] stringsA = sc.nextLine().split(" ");
        String[] stringsB = sc.nextLine().split(" ");
        int[] aArray = Arrays.stream(stringsA).mapToInt(Integer::parseInt).toArray();
        int[] bArray = Arrays.stream(stringsB).mapToInt(Integer::parseInt).toArray();

        //map key是数值,value对应数值出现的次数
        Map<Integer, Integer> map = new HashMap<>();

        for (int key : aArray) {
            Integer num = map.getOrDefault(key, 0);
            num++;
            map.put(key, num);
        }

        int sum = 0;
        for (int key : bArray) {
            sum += map.getOrDefault(key, 0);
        }
        System.out.println(sum);
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值