A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

从网上找到一份编程练习题,我决定将里面的题目全都做一遍。

/*
       题目: 有两个数组int[] a = {1,5,4,6};int[] b = {1,5,4,6,8,7,2},编写一个程序找出数组a,b中不同的元素
*/

/*
        分析;这个题目想了好几种思路。
        思路一:遍历a,b两数组中的所有元素,将a,b中相同的元素赋值为某固定值(0,-1等特殊含义的值)。
                --> 但是int[]数组限制了数组中元素的范围,一旦数组中中出现该值,将出现问题。(行不通!)
        思路二:遍历a,b两数组中的所有元素,将a,b中相同的元素赋值为a中第一次比较相等的值。
                --> 这样能保证不会出现新值的问题。但是,一旦a,b数组中没有相同值,那么程序将失效。(行不通!)
        思路三:定义两个临时的数组c,d分别记录a,b两个数组的角标。当a,b中有相同元素,将c,d中对应元素赋值为-1。遍历c,d输出a,b的不同元素。
                --> 目前该思路还算通用。但是效率比较低。
        -----------------------------------------------------------------------------------------------------------------------------
        以上,三种思路都没有考虑到一个问题。就是 a中 或 b中自身有重复元素的情况。这是这个程序的不足之处!

        思路四:使用HashSet实现。将a,b中的数全部加到HashSet中。这样就能保证不出现重复元素。

        下面的代码是对思路三的实现。
*/
class ShuZuBuTongYuanSu {
        public static void main(String[] args) {
                int[] a={1,5,4,6};
                int[] b={1,5,4,6,8,7,2};
                //定义记录角标
                int[] c=new int[a.length];
                int[] d=new int[b.length];
                //对a[] 和 b[]遍历
                for (int i=0; i<a.length; i++){
                        for (int j=0; j<b.length; j++){
                                if (a==b[j]){ //如果a[] 和 b[]中元素相同
                                        c=-1;  //在c[]中将a[]出现相同元素的角标赋值为-1
                                        d[j]=-1; //在d[]中将b[]出现相同元素的角标赋值为-1
                                }
                        }
                }
                //遍历c[]数组中a[]的不同元素
                for (int i=0; i<c.length; i++){
                        if (c!=-1){
                                System.out.print(a);
                        }
                }
                //遍历d[]数组中b[]的不同元素
                for (int j=0; j<d.length; j++){
                        if (d[j]!=-1){
                                System.out.println(b[j]);
                        }
                }
        }
}

4 个回复

正序浏览
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] a = {1,5,4,6,9};
  6.                 int[] b = {1,5,4,6,8,7,2};

  7.                 /*
  8.                  * getDifferents(a, b),枚举a数组元素在b数组中找,看看a数组的这个元素b中有没有
  9.                  * getDifferents(b, a),枚举b数组元素在a数组中找,看看b数组的这个元素a中有没有
  10.                  * 上面两个返回值用连接符 连接 就是最终答案
  11.                  * 输出的时候,diff.substring(0, diff.length() - 1) 是为了去掉字符串最后的逗号
  12.                  */
  13.                 String diff = getDifferents(a, b)+getDifferents(b, a);
  14.                 System.out.println(diff.substring(0, diff.length() - 1));
  15.                
  16.         }

  17.         public static String getDifferents(int[] a, int[] b)
  18.         {
  19.                 String differents = "";// 记录不同的元素
  20.                 for(int n = 0 ;n < a.length ; n++)
  21.                 {
  22.                         int m;
  23.                         for(m = 0; m < b.length ; m++)
  24.                         {
  25.                                 //如果相等就跳出,下一个元素
  26.                                 if(a[n] == b[m])
  27.                                 {
  28.                                         break;
  29.                                 }
  30.                         }
  31.                         //如果角标等于少元素的数组长度,说明这个数组里没有这个元素
  32.                         if(m == b.length)
  33.                                 differents += a[n] + ",";
  34.                 }
  35.                 return differents;
  36.         }

  37. }
复制代码

希望可以帮到您!如果有不对的地方,希望大神们指出!

点评

好! 你的想法很好!膜拜!  发表于 2015-9-27 12:00
回复 使用道具 举报
将第二个数组转化为集合   调用contains方法

点评

谢谢。我忘记了...居然还有这个方法....  发表于 2015-9-27 09:09
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马