二元组个数
题目描述
给定两个数组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 个。 |
源码和解析
解析:
其实这个题目重在理解,如果理解了题意了你就好做了。
小编在做这个题时,就进入了误区
当输入为
6
1 1 2 2 4 5
3
2 2 4
输出5时 我天真的以为组合是这样的
其中a[]={1,1,2,2,4,5} b={2,2,4}
我以为的组合 a数组出一个2 b数组出一个2 得到 [2,0] [3,1] a数组出一个4 b数组出1个4 得到[4,2] 然后a出两个连续2 b出两个连续2 得到[ [2,3],[0,1] ] a出224 b出224 得到[[2,3,4],[0,1,2]]数了一下5个 和答案一致
然而真实的组合是这样的
[2,0] [2,1] [3,0] [3,1] [4,2] 没错就是这么简单
注意,题目只要求每个数组出一个数字即可。不要把题想得那么复杂,这个题我还特意咨询了大佬 伏城之外 忽然觉得自己好憨
既然分析懂了题目,就稍微好做些了。
1.因为是要a数组中的某一个a[i]等于b数组中的某一个b[j] 所以a中的一个数a[i]可以匹配B中的值相同的那个数多个就如a[2]就能匹配b[0]和b[1]
2.所以只要统计出a在b中出现的那些数及其个数 以及这些数在a中出现的个数即可运用简单方法求解出来,就不需要用双层for循环或双指针求解。例如a中2出现2次 所以第一个2在b数组中匹配了2个,自然而然第二个2也是匹配2个 最后就是分别求和相加
3.在a中 有2和4 出现在了b中,因此在b中2和4出现的次数为
{2:2,4:1}
在a中,2和4自己出现的次数为
{2:2,4:1}
所以综合求解为2*2+1*1次
示例代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class T37 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num=Integer.parseInt(scanner.nextLine());
String input1[]=scanner.nextLine().split(" ");
List<Integer> num1List=new ArrayList<Integer>();
for(int i=0;i<num;i++){
num1List.add(Integer.parseInt(input1[i]));
}
int num2=Integer.parseInt(scanner.nextLine());
String input2[]=scanner.nextLine().split(" ");
List<Integer> num2List=new ArrayList<Integer>();
for(int i=0;i<num2;i++){
num2List.add(Integer.parseInt(input2[i]));
}
Map<Integer, Integer> map1=new HashMap<Integer, Integer>();
Map<Integer, Integer> map2=new HashMap<Integer, Integer>();
for(int n:num1List){
//对方的数 在自己的中出现过几次map1
if(num2List.contains(n)){
if(map1.containsKey(n)){
map1.put(n, map1.get(n)+1);
}else{
map1.put(n, 1);
int count=0;//自己在对方的列表中出现的次数
for(int j:num2List){
if(j==n){
count++;
}
}
map2.put(n, count);
}
}
}
System.out.println(map1);
System.out.println(map2);
Set<Integer> keySet = map1.keySet();
Iterator<Integer> it=keySet.iterator();
int res=0;
while(it.hasNext()){
int key=it.next();
res+=map1.get(key)*map2.get(key);
}
System.out.println("结果为:"+res);
}
}
上述代码运行示意图: