**银行春招–java笔试编程题:输入两个数 x,y表示两个有序数列中元素的个数,然后再输入两行含有x,y个有序数字的数据(1<=x,y<=1000);将两个数列中的元素 合并,并去重,并有序输出。
*********************************************************************************************
*输入两个数 x,y表示两个有序数列中元素的个数,然后再输入两行含有x,y个有序数字的数据(1<=x,y<=1000)
*将两个数列中的元素 合并,并将含有相同的元素给筛选排除掉,并有序输出。*****************************
*******如下:********
* 2 3
* 1 7
* 4 6 8
* 输出:1 4 6 7 8
********************
此题我没有写出来,因为编辑器不是用本地的,另外我一开始的想法太复杂,用的是纯数组循环,后来改用的
是ArrayList or list or map。但是list无法进行排序,比较器那块儿也忘了,后来卡槽了,时间到了。最
重要的一点是:重复的元素不是留下来一个,而是将重复的元素,统统去除,只要它的数量大于1,则结果中就
不含有这个数。当时做的时候,我没理解错,但是敲的时候,跑错方向了。。。哎,基础太差,没办法。。。
考完就在本机上做了一遍,思路离奇简单,低消耗的我也没空想。
代码如下:(开销:一个TreeMap,一个TreeSet;缺点:循环太多。。。)
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
int nums1[] = new int[x];
int nums2[] = new int[y];
for (int i = 0; i < x; i++) {
nums1[i] = sc.nextInt();
}
// sc.nextLine(); 这句话是多此一举,其实没必要写,也没问题
for (int i = 0; i < y; i++) {
nums2[i] = sc.nextInt();
}
// sc.nextLine();
solve(x, y, nums1, nums2);
}
public static void solve(int x, int y, int[] nums1, int[] nums2) {
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int i = 0; i < x; i++) {
if (map.containsKey(nums1[i])) {
map.put(nums1[i], map.get(nums1[i]) + 1);
} else {
map.put(nums1[i], 1);
}
}
for (int j = 0; j < y; j++) {
if (map.containsKey(nums2[j])) {
map.put(nums2[j], map.get(nums2[j]) + 1);
} else {
map.put(nums2[j], 1);
}
}
TreeSet<Integer> set = new TreeSet<>();
for (int i = 0; i < x; i++) {
if (map.get(nums1[i]) == 1) {
set.add(nums1[i]);
}
}
for (int i = 0; i < y; i++) {
if (map.get(nums2[i]) == 1) {
set.add(nums2[i]);
}
}
System.out.println(map);//此句话:输出是为了方便进行检查,测试
for (int i : set) {
System.out.print(i + " ");
}
}
}
运行截图如下:(三组测试结果,增强可读性)
案例一:
案例二:
案例三: