Remove Element
初学算法,Leetcode练习
Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
我的理解:
给定一个数组以及一个特定的数elem,并将数组中所有等于elem的数删除,并返回新数组的长度。
数组中的元素顺序可以改变,也不用理会在新数组后是什么。
标签:数组,二指针
我的解法
int removeElement(int A[], int n, int elem) {
int i;
int *tail = &A[n-1];
int *current = &A[0];
for(i=0;i<n;i++)
{
if(*current==elem)
{
while(*tail == elem)
{
tail--;
n--;
}
if(tail > current)
{
A[i] = *tail;
n--;
tail--;
}
}
current++;
}
return n;
}
这种解法的主要方法是从数组的两端逐渐向中间逼近
解题过程中的要点:
- 使用两指针*current,*tail分别指向当前数组的头尾
进行n次循环(n会发生变化,因移出过程中长度会发生变化)
- 循环体执行条件:当current的指向与elem相等时
- 因需要原址操作,用tail从后往前扫描,若*tail==elem,继续往前扫描,同时长度n要记得Decrease
- 当*tail!=elem时,找到可替换 *current(A[i])的值,然而,需要判断tail>current? 确保是用数组后部元素替代前部元素。而且不能是tail>=current! “=”意味着没有删除这个与elem相等的元素
- 当tail>current时,用 *tail替换 *current(A[i]),同时,长度n减一,以及tail要指向 前一元素(即未判断的元素)
- 循环体执行条件:当current的指向与elem相等时
当次循环完成后,current要指向下一未操作元素
- 即current与tail始终指向未处理的元素
P.S:代码存在大量可改进的地方,如:指针current,tail可免,但冗余有时可让我的思路更加清晰