华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。
看不懂有疑问需要答疑辅导欢迎私VX: code5bug
题目描述
现有两个整数数组,需要你找出两个数组中同时出现的整数,并按照如下要求输出:
1、 有同时出现的整数时,先按照同时出现次数(整数在两个数组中都出现并且出现次数较少的那个)进行归类,然后按照出现次数从小到大依次按行输出。
2、没有同时出现的整数时,输出NULL。
输入描述
第一行为第一个整数数组,第二行为第二个整数数组,每行数据中整数与整数之间以英文逗号分隔,整数的取值范围为[-200,200],数组长度的范围为[1,10000]之间的整数。
输出描述
按照出现次数从小到大依次按行输出,每行输出的格式为:出现次数:该出现次数下的整数升序排序的结果。
格式中的":"为英文冒号,整数间以英文逗号分隔。
示例1
输入:
5,3,6,-8,0,11
2,8,8,8,-1,15
输出:
NULL
说明:
两个整数数组没有同时出现的整数,输出NULL。
示例2
输入:
5,8,11,3,6,8,8,-1,11,2,11,11
11,2,11,8,6,8,8,-1,8,15,3,-9,11
输出:
1:-1,2,3,6
3:8,11
说明:
两个整数数组中同时出现的整数为-1、2、3、6、8、11,其中同时出现次数为1的整数为-1,2,3,6(升序排序),同时出现次数为3的整数为8,11(升序排序),先升序输出出现次数为1的整数,再升序输出出现次数为3的整数。
题解
这道题目属于**哈希表(Hash Table)和排序(Sorting)**的结合应用。主要考察的是如何利用哈希表高效统计元素的出现次数,并根据条件进行筛选和排序。
思路
- 统计出现次数:首先,我们需要分别统计两个数组中每个整数的出现次数。可以使用哈希表来记录每个整数及其出现的次数。
- 找出共同出现的整数:遍历其中一个哈希表,检查每个整数是否在另一个哈希表中也存在。如果存在,则计算该整数在两个数组中出现次数的较小值(即共同出现次数)。
- 按共同出现次数分类:将共同出现的整数按照其共同出现次数进行分类,存储到一个新的哈希表中,键为共同出现次数,值为该次数下的整数列表。
- 排序和输出:
- 对共同出现次数进行升序排序。
- 对每个共同出现次数下的整数列表进行升序排序。
- 按照格式输出结果,如果没有任何共同出现的整数,则输出
NULL
。
JavaScript
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 统计每个元素出现的次数
function counter(arr) {
const cnt = new Map();
for (let k of arr) {
let v = cnt.get(k) || 0;
cnt.set(k, v + 1);
}
return cnt;
}
(async () => {
const arr1 = (await readline()).split(',').map(Number);
const arr2 = (await readline()).split(',').map(Number);
// 对两个数组统计计数
const cnt1 = counter(arr1);
const cnt2 = counter(arr2);
// 记录同时存在的结果值 (key = 两个数组中最小出现的次数, value =[对应的数字...])
const result = new Map();
cnt1.forEach((v1, k) => {
let cnt = Math.min(cnt2.get(k) || 0, v1);
if (cnt > 0) {
if (!result.has(cnt)) result.set(cnt, []);
result.get(cnt).push(k);
}
});
if (result.size === 0) {
console.log('NULL');
} else {
let lst = [...result.entries()];
// 根据出现次数从小到大排序
lst.sort((a, b) => a[0] - b[0]);
// 每行结果格式化输出
for (let [cnt, nums] of lst) {
nums.sort((a, b) => a - b);
console.log(`${cnt}:${nums.join(',')}`);
}
}
rl.close();
})();
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏