问题描述: 给定一个排序数组,要求在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。且不要使用额外的数组空间。
算法思路:
①定义fast为1,slow为0,这里的fast和slow代表的是数组的下标
②若fast和slow内容相等,让fast向后走一步,再判断,如果一直相等,fast就一直向后走,直到slow和fast的内容不相等,当两个内容不相等时,slow和fast中间那些元素其实都是不要的重复的,所以此时让slow向后走一步,再将fast的值赋值给slow,fast++判断下一个元素
③当整个循环结束后,返回此时数组的元素个数,让slow+1即是当前删除掉重复元素后的数组长度
如图:
参考代码:
public class Test {
public static void main(String[] args) {
int[] arr={1,2,2,3,3,4,5,5};
int i=remove(arr);
System.out.println(i);
}
public static int remove(int[] arr){
if(arr.length<0){
return 0;
}
int fast=1; //初始fast为1号下标
int slow=0; //初始slow为0号下标
while(fast<arr.length){
if(arr[slow]==arr[fast]){
fast++;
}else{
slow++; //此时不相等,所以fast的值要放在slow的下一个位置。即让slow先走一步再赋值,
arr[slow]=arr[fast]; //赋值
fast++;
}
}
return slow+1;
}
}
//
5