Remove Element

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要指向下一未操作元素

  • 即current与tail始终指向未处理的元素

P.S:代码存在大量可改进的地方,如:指针current,tail可免,但冗余有时可让我的思路更加清晰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值