前些天笔试中遇到的一道算法题,很简单,但是想发出来给同样是小白的小伙伴看一下,或许有用。
- 需求:已知有两个数组a和b,数组里面的数字已经从小到大排好序,且每个数组中没有重复的数字,编写程序数组c,c是数组a和数组b的并集,且数组c中的数字要从小到大排好序,并且不重复。
- 不允许使用 for(i = 1 to m){
- for(j = 1 to n){
- ........
- }
- }
方法一:利用最原始的数组来编程
- package Demo;
- /**
- *
- * @author Doraemon
- *
- */
- public class Demo1 {
- public static void main(String[] args) {
- /**
- * 定义a和b两个数组
- */
- int a[] = { 1, 3, 8, 45 };
- int b[] = { 2, 3, 11, 12, 15, 20, 55 };
- //定义数组c并且长度是数组a+数组b的长度
- int c[] = new int[a.length + b.length];
- //定义两个变量
- int x = 0, y = 0;
- //循环3个数组
- for (int i = 0, j = 0, z = 0;;) {
- //判断如果i小于a的长度并且j小于b的长度,将a中的元素赋给x,b中的元素赋给y
- if (i < a.length && j < b.length) {
- x = a[i];
- y = b[j];
- //如果x小于y,将小的放进数组c中
- if (x < y) {
- c[z] = x;
- i++;
- z++;
- } else if (x == y) {
- //如果x等于y,将x的放进数组c中
- c[z] = x;
- i++;
- j++;
- z++;
- } else {
- // x>y
- c[z] = y;
- j++;
- z++;
- }
- } else if (i >= a.length && j < b.length) {
- //如果i中的元素循环完b中没有循环完将b中的元素赋给数组c
- c[z] = b[j];
- j++;
- z++;
- } else if (i < a.length && j >= b.length) {
- //如果i中没有循环完b中元素循环完将a中的元素赋给数组c
- c[z] = a[i];
- i++;
- z++;
- } else {
- break;
- }
- }
- //循环数组c,并打印
- for (int i = 0; i < c.length; i++) {
- System.out.println(c[i]);
- }
- }
- }
方法二:利用集合来编程
- package Demo;
- /**
- * @author Doraemon
- */
- import java.util.TreeSet;
- public class Demo2 {
- public static void main(String[] args) {
- //定义数组
- int a[] = {1,3,8,20};
- int b[] = {2,3,8,12,15,20,26};
- //定义一个TreeSet集合,他是有序的
- TreeSet set = new TreeSet();
- //循环遍历数组a中的元素将其添加到set中
- for (int i = 0; i < a.length; i++) {
- set.add(a[i]);
- }
- //循环遍历数组b中的元素将其添加到set中
- for (int i = 0; i < b.length; i++) {
- set.add(b[i]);
- }
- //将set集合转换为object对象数组
- Object obje[] = set.toArray();
- //定义一个c数组长度为obje的长度
- int c[] = new int[obje.length];
- //循环遍历
- for (int i = 0; i < c.length; i++) {
- c[i] = (int) obje[i];
- System.out.println(c[i]);
- }
- }
- }