删除元素专题
1.原地移除所有数值等于 val 的元素
方法一:
public static int DeleteElement(int[] arr,int target){
int slow = 0;
for (int fast = 0; fast <arr.length ; fast++) {
if(arr[fast]!=target){
arr[slow] = arr[fast];
slow++;//两行等同于arr[slow++]=arr[fast];
}
}
return slow;
}
方法二:
public static void DeleteElement(int[] arr, int target){
int right = arr.length -1;
for (int left = 0; left <=right;) {
if (arr[left] == target){
arr[left] = arr[right--];
}else{
left++;
}
}
}
思路:建立两个指针,一个指针(left)指向数组头部,一个指针(right)指向数组尾部,当arr[left]==target时将left停下,然后right指针在向前遍历的同时将值赋给arr[left],直到arr[left]!=target时,指针left才能向前移动。
2.删除有序数组中的重复项
int slow = 0;
for (int fast = 0; fast <arr.length ; fast++) {
if(arr[fast]!=arr[slow]){
arr[++slow] = arr[fast];
}
}
思路:该问题要求删除重复的元素,而上面的问题是将指定元素全部删除,所以写法上稍有不同,我们是要将arr[fast]赋给slow指针的下一个位置,也就是arr[++slow]=arr[fast],这样就保证了相同的值至少会存在一个。