在学习数组时,我们经常会遇到一个问题,如何删除数组中的重复元素呢?
基本思想:
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.所以......