题目描述
给定两个数组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 个。 |
题目解析
很简单的双重for,
/**
*
* @param {Array} arrM 第二行输入的数组
* @param {Number} m 第一行输入的数字m
* @param {Array} arrN 第四行输入的数组
* @param {Number} n 第二行输入的数字n
* @returns
*/
function getResult(arrM, m, arrN, n) {
let count = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (arrM[i] === arrN[j]) {
count++;
}
}
}
return count;
}
但是不知道数量级多少,如果数量级比较大的话,则O(n*m)可能罩不住。
因此,我们还需要考虑下大数量级的情况。
我的思路如下:
先找找出m数组中,在n数组中出现的数及个数,在找出n数组中,在m数组中出现的数及个数,比如:
用例2中
countM = {2:2, 4:1}
countN = {2:2, 4:1}
然后将相同数的个数相乘,最后求和即为题解,比如2*2 + 1*1 = 5
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 4) {
const m = lines[0] - 0;
const arrM = lines[1].split(" ").map(Number);
const n = lines[2] - 0;
const arrN = lines[3].split(" ").map(Number);
console.log(getResult(arrM, m, arrN, n));
lines.length = 0;
}
});
function getResult(arrM, m, arrN, n) {
const setM = new Set(arrM);
const setN = new Set(arrN);
const countM = {};
for (let m of arrM) {
if (setN.has(m)) countM[m] ? countM[m]++ : (countM[m] = 1);
}
const countN = {};
for (let n of arrN) {
if (setM.has(n)) countN[n] ? countN[n]++ : (countN[n] = 1);
}
let count = 0;
for (let k in countM) {
count += countM[k] * countN[k];
}
return count;
}
Java算法源码
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = Integer.parseInt(sc.nextLine());
List<Integer> listM =
Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).collect(Collectors.toList());
int n = Integer.parseInt(sc.nextLine());
List<Integer> listN =
Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).collect(Collectors.toList());
System.out.println(getResult(listM, listN));
}
public static int getResult(List<Integer> listM, List<Integer> listN) {
HashSet<Integer> setM = new HashSet<Integer>(listM);
HashSet<Integer> setN = new HashSet<Integer>(listN);
HashMap<Integer, Integer> countM = new HashMap<>();
for (Integer m : listM) {
if (setN.contains(m)) {
countM.put(m, countM.getOrDefault(m, 0) + 1);
}
}
HashMap<Integer, Integer> countN = new HashMap<>();
for (Integer n : listN) {
if (setM.contains(n)) {
countN.put(n, countN.getOrDefault(n, 0) + 1);
}
}
int count = 0;
for (Integer k : countM.keySet()) {
count += countM.get(k) * countN.get(k);
}
return count;
}
}
Python算法源码
# 输入获取
m = int(input())
arrM = list(map(int, input().split()))
n = int(input())
arrN = list(map(int, input().split()))
# 算法入口
def getResult(arrM, arrN):
setM = set(arrM)
setN = set(arrN)
countM = {}
for m in arrM:
if m in setN:
if countM.get(m) is None:
countM[m] = 1
else:
countM[m] += 1
countN = {}
for n in arrN:
if n in setM:
if countN.get(n) is None:
countN[n] = 1
else:
countN[n] += 1
count = 0
for k in countM.keys():
count += countM[k] * countN[k]
return count
# 算法调用
print(getResult(arrM, arrN))
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0