当前位置: 移动技术网 > IT编程>开发语言>Java > java中去除数组中重复元素的方法

java中去除数组中重复元素的方法

2020年07月22日  | 移动技术网IT编程  | 我要评论
题目请设计一个方法,将一个int数组arr中重复的元素去除,并且返回新数组newArr。解法一 保留重复数字中的第一次出现的元素首先建立一个与原数组等长的标记数组flag[],它的下标与原数组下标相同,而我们只要改变它的值,就可以知道第几个元素是重复的遍历原数组 内层也遍历原数组,如果arr[i] == arr[j] ,也就是外层循环到的元素与内层循环的相等 (内层是从i+1 开始找) 就把flag[j] = 1 也就是标记了一个重复元素循环结束后 ,flag数组求和,就是重复元素的个数

题目

请设计一个方法,将一个int数组arr中重复的元素去除,并且返回新数组newArr。

解法一 保留重复数字中的第一次出现的元素

  1. 首先建立一个与原数组等长的标记数组flag[],它的下标与原数组下标相同,而我们只要改变它的值,就可以知道第几个元素是重复的
  2. 遍历原数组 内层也遍历原数组,如果arr[i] == arr[j] ,也就是外层循环到的元素与内层循环的相等 (内层是从i+1 开始找) 就把flag[j] = 1 也就是标记了一个重复元素
  3. 循环结束后 ,flag数组求和,就是重复元素的个数,用原数组长度减去它,就等到了新数组的长度
  4. 声明一个变量表示所求新数组的下标index,如果flag[i] == 0 ,那么 将所对应原数组的值赋给新数组 newArr[index++] = arr[i]

具体代码实现:

public static int[] deRepetition(int[] arr) {
  if (arr == null) {//避免空指针异常
   System.out.println("请输入正确的数组");
   return null;
  }else {
   //声明一个标记数组 以标记所有元素 在其之后重复的值的下标
   //因为是等长数组 默认初始值为0  也就是说未重复的值的下标是0
   int[] flag = new int[arr.length];
   for (int i = 0; i < arr.length; i++) {
    //遍历所有元素 确认之后有没有重复的值
    for (int j = i+1; j < arr.length; j++) {
     if (arr[i] == arr[j]) {//如果两个数相等
      flag[j] = 1;//将重复的值的下标做个标记
      //一定是j 因为i是第一次出现的值 
      //就算是第i个是标记过的也无所谓因为flag[i]在之前已经标记
     }
    }
    
   }
   //标记完所有的下标之后可以统计新数组的长度
   //求和flag
   int flagSum = 0;
   for (int i : flag) {
    flagSum += i;
   }
   int newLength = arr.length - flagSum;
   //创建新数组
   int[] newArr = new int[newLength];
   //遍历数组赋值 如果是标记 则不赋值
   //声明一个新数组下标变量
   int index = 0;
   for (int i = 0; i < arr.length; i++) {//遍历所有下标
    if (flag[i] == 0) {//如果不是重复的值 就赋给新数组
     newArr[index++] = arr[i];
    }
   }
   return newArr;
  }
 }

解法二 保留数组中重复元素的最后一次 Arrays方法

  1. 遍历数组,外层为是否要留下的元素,内层为其之后的所有元素,若遇到相等的,则跳过当前外层元素不赋值
  2. 建立一个空数组,当要赋值的时候就扩容,取值,运用Arrays方法

具体代码实现:

public static int[] deRepetition2(int[] arr){
  int[] newArr = null;
  for (int i = 0; i < arr.length; i++) {
   boolean flag = true;
   for (int j = i+1; j < arr.length; j++) {
    if (arr[i] == arr[j]) {
     flag = false;
     break;
    }
   }
   if (flag) {
    if (newArr == null) {
     newArr = new int[1];
     newArr[0] = arr[i];
     continue;
    }
    newArr = Arrays.copyOf(newArr,newArr.length+1);
    newArr[newArr.length-1] = arr[i];
   }
  }
  return newArr;
 }

解法三 保留重复元素出现的第一次 System方法

  1. system类可以自己数组复制粘贴到自己数组 相当于创建了一个新的数组
  2. 遍历数组,外层遇到有重复元素时,使用system方法System.arraycopy(arr, k+1, arr, k, arr.length-k-1) 让内层 也就是被发现的重复元素之后的数组元素往前挪一个 使得重复数字被覆盖 再删除最后一个元素 (因为复制粘贴的时候最后一个没有被覆盖而是保持原来的值)
  3. 直接缩容arr 同时arr.length也变成动态了,不用计数,缩容记得把新地址赋给arr
  4. 注意该方法 若是发现了重复元素时,k不能++ 重新覆盖上来的值可能也与原元素相等,只有不相等才执行循环控制内层k++

具体代码实现:

public static int[] deRepetition3(int[] arr){
  for (int i = 0; i < arr.length;i++) {
   for (int k = i+1; k < arr.length; ) {
    if (arr[i] == arr[k]) {
     System.arraycopy(arr, k+1, arr, k, arr.length-k-1);
     arr = Arrays.copyOf(arr, arr.length-1);//缩容的同时相当于删除了最后一个元素
     //发现重复元素时不k++
    }else {
     k++;
     //没有重复元素才与后一个数比较
    }
   }
  }
  return arr;
 }

本文地址:https://blog.csdn.net/cora_99/article/details/107496280

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网