Leetcode:删除数组中的重复元素(int型数组)

在学习数组时,我们经常会遇到一个问题,如何删除数组中的重复元素呢?

基本思想:

1.我们用两个for循环嵌套,将所有数字进行逐个对比,第一个for循环变量i的范围是0~length-1,第二个循环变量j范围是         i+1~length。

2.如果对比中出现相同元素,就将j位置之后所有的元素都向前移动一位,从而将j位置重复元素覆盖掉。所以j位置的元素发生改变,不能添加循环条件j++,必须继续将i位置元素与j位置的新元素对比。

3.因为将j之后的元素都向前移动一位,所以使length--。

4.如果当前j位置元素不与i位置元素相等,则添加循环条件j++,使j向后循环。

5.一轮外循环完成对与i位置相同元素的排查,删除,则使i继续向后循环。

代码演示:

public class Solution {
public static void removeDuplicates(int []arr){
int length=arr.length;
for(int i=0;i<length-1;i++) {            //每一次循环判断arr[i]的值是否是重复
for(int j=i+1;j<length;) {          //先不给出循环条件,若出现重复,在移动数据后需要重新比对当前j位置元素。
if(arr[i]==arr[j]) {             //出现重复数据。
for(int m=j;m<length-1;m++) {//重复点之后的数据挨个向前移动,覆盖重复点元素。
arr[m]=arr[m+1];
}
length--;
}
else {                           //若当前j位置元素未出现相同元素,则使j移动到下一个位置。
j++;
}
 }
}
for(int i=0;i<length;i++)
System.out.println(arr[i]);
}
public static void main(String[] args) {
int A[]= {1,3,2,5,5,5,6,4,8,8,8,9,2,2,2,3,3,6};
removeDuplicates(A);
}

}

需要注意的几点:

1.再覆盖相同元素时,我们可以arr[m-1]=arr[m];前提是数组是有序的(相同元素排列在一起),否则相同元素不在一起,使j位置元素向前移动一位会将其他与i不相同的元素覆盖。(如上图代码就不可以,因为相同元素并不在一起

2.m变量的范围:

m(j~length-1)代表的是j位置及其j之后元素的位置,原本m的范围应该是j~length,但是arr[m]=arr[m+1],最后一个元素被计作m+1.所以......

猜你喜欢

转载自blog.csdn.net/Z_zfer/article/details/80181654