题目
现有两个整数数组,需要你找出两个数组中同时出现的整数,并按照如下要求输出:
1.有同时出现的整教时,先按照同时出现次数(整数在两个数组中都出现并目出现次数较少的那个)进行归类,然后按照出现次数从小到大依次按行输出。
2.没有同时出现的整数时,输出NULL
输入描述
第一行为第一个整数数组,第二行为第二个整数数组,每行数中整数与整数之间以英文号分,数组长度的范围为[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
说明
两整数数组中同时出现的整数为-12、3、 6、8、 11 ,其中同时出现次数为1的整数为-1,2,36(升序排序),同时出现次数为3的整数为8,11(升序排序),先升序输出出现次数为1的整数,再升序输出出现次数为3的整数。
思路
简单题,使用两个map分别统计两个数组出现的次数,再在两个map中找到公共的交集(key值相同的),对于指定key来说,公共出现次数等于min(map1.get(key),map2.get(key))。
最后按照题目要求输出排序后的结果即可。
题解
package hwod;import java.util.*;public class FindSameNumInArr {private static Map<Integer, List<Integer>> resMap;private static Map<Integer, Integer> map1;private static Map<Integer, Integer> map2;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arrs1 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int[] arrs2 = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();map1 = new HashMap<>();map2 = new HashMap<>();for (int i = 0; i < arrs1.length; i++) {map1.put(arrs1[i], map1.getOrDefault(arrs1[i], 0) + 1);}for (int i = 0; i < arrs2.length; i++) {map2.put(arrs2[i], map2.getOrDefault(arrs2[i], 0) + 1);}resMap = new HashMap<>();findSameNumInArr();if (resMap.size() == 0) {System.out.println("NULL");} else {ArrayList<Integer> list = new ArrayList<>(resMap.keySet());list.sort(Comparator.comparingInt(o -> o));for (int i = 0; i < list.size(); i++) {int cnt = list.get(i);System.out.print(cnt + ":");List<Integer> rows = resMap.get(cnt);rows.sort(Comparator.comparingInt(o -> o));for (int j = 0; j < rows.size(); j++) {if (j != 0) System.out.print(",");System.out.print(rows.get(j));}System.out.println();}}}private static void findSameNumInArr() {Set<Integer> set1 = map1.keySet();for (Integer item : set1) {if (map2.containsKey(item)) {int cnt = Math.min(map1.get(item), map2.get(item));List<Integer> tlist = resMap.getOrDefault(cnt, new ArrayList<>());tlist.add(item);resMap.put(cnt, tlist);}}}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。