黑马程序员技术交流社区

标题: 关于int[] 去重的方法 [打印本页]

作者: sdx_1234    时间: 2016-3-24 21:49
标题: 关于int[] 去重的方法
基础班第5天课后作业有道关于int类型数组去重的方法,老师给的答案(如下),可发现第四步(.遍历新数组,查看是否包含老数组中的当前元素,如果不包含,flag置为true),如果原数组数据有0这个数据则这种方法就会将0除去即获得的新数组不可能包含0元素.
就自己又想了一方法:前面一样只是当遍历去重是用老数组中的i索引的数与老数组中的0~(i-1)索引的数比较如果有相同的flag=false如果没相同的则flag=true;
这样就算原数组中有0元素也不会去除
  1. public static int[] getSingleArr(int[] arr) {
  2.                 //index表示既能表示当前存入数据在新数组中的位置,又能表示存数新数组中的数据的个数
  3.                 int index = 0;
  4.                 //1.定义一个和老数组长度相同的数组
  5.                 int[] newArr = new int[arr.length];
  6.                 //2.遍历老数组的内容
  7.                 for(int i = 0;i<arr.length;i++) {
  8.                         //3.定义flag标记,表示新数组中是否包含当前遍历到的老数组内容
  9.                         boolean flag = false;
  10.                         //4.遍历新数组,查看是否包含老数组中的当前元素,如果不包含,flag置为true
  11.                         for (int j = 0;j<newArr.length;j++) {
  12.                                 if (arr[i] == newArr[j]) {
  13.                                         flag = true;
  14.                                         break;
  15.                                 }
  16.                         }
  17.                         //5.flag为false时说明新数组中不包含当前遍历的老数组的内容,并将当前遍历的老数组的元素存入新数组中
  18.                         if (!flag) {
  19.                                 newArr[index++] = arr[i];
  20.                         }
  21.                 }
  22.         int[] returnArr = new int[index];
  23.                 //8.将新数组中的index个元素存入returnArr数组中,并将该数组返回
  24.                 for(int i=0;i<index;i++) {
  25.                         returnArr[i] = newArr[i];
  26.                 }
  27.                 return returnArr;
  28.         }
复制代码

以上是老师的代码
下面是自己的代码,不知道有什么问题吗,希望各位大神看看

  1.         public static int[] change(int[] arr) {
  2.                 int[] b = new int[arr.length];
  3.                 b[0] = arr[0];                                //先将新数组的第一个数赋值老数组第一个数,因为索引0的元素没有比他索                                                                        引小的元素
  4.                 int count = 0;
  5.                 for (int i = 1;i < arr.length  ; i++ ) { //遍历老数组arr
  6.                         boolean flag = true;
  7.                         for (int j = i-1; j >= 0 ;j-- ) {  //将arr[i] 与比它索引小的数比较(即与arr[i-1]~arr[0])
  8.                                 if ( arr[j] == arr [i]) {
  9.                                         flag = false;
  10.                                         break;
  11.                                 }
  12.                         }
  13.                         if (flag) {
  14.                                 count++;
  15.                                 b[count] = arr[i];
  16.                         }       
  17.                 }
  18.                 int[] c = new int[count];
  19.                 for (int i =0;i < count ;i++ ) {
  20.                         c[i]=b[i];
  21.                 }
  22.                 return c;
  23.         }
复制代码





作者: mundane    时间: 2016-3-24 22:48
确实,我刚刚试了一下。当初我在学的时候自己还没发现这个问题,因为新数组初始化元素都是0的。你很有前途!
作者: as9600    时间: 2016-3-24 22:56
不错可以
作者: mundane    时间: 2016-3-24 22:59

但是你的代码好像也有点小小的问题,刚才我测试了一下,但是我也暂时找不出问题出在哪里(其实我也懒得找==)

作者: sdx_1234    时间: 2016-3-25 23:21
mundane 发表于 2016-3-24 22:59
但是你的代码好像也有点小小的问题,刚才我测试了一下,但是我也暂时找不出问题出在哪里(其实我也懒得找= ...

是的 最后那个数组的长度少了一个长度
int c = new int[count+1];
作者: sdx_1234    时间: 2016-3-25 23:23
上个自己的代码 第19 和20行有错..... 应该是int[] c = new int[count+1]和for(int i = 0;i<count+1;i++)
作者: zhoubinjian    时间: 2016-3-26 01:59
不错 ,,赞 一个
作者: NeverBack    时间: 2016-3-26 07:42
这种精神值得学习呀!!知识点要一点点啃!!
作者: 695010894    时间: 2016-3-26 10:43
本帖最后由 695010894 于 2016-3-26 10:49 编辑

老师那个确实是全都是重复,没排除本身




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2