算法系列-Remove Element

该博客讨论了算法问题,涉及从数组中删除特定值并返回新长度。题目要求在原地修改数组,移除指定值,而不仅仅是计算长度。博主指出现有直观解决方案的错误,并提出使用游标来移动不同元素至数组头部的正确方法,以实现原地修改。示例代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

  对于数组的操作是算法题目中经常会出现的类型,这次来看一个从数组中移除元素的问题。


问题描述

原文:

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.

大意:给定一个数组和值,移除数组中与此值相同的元素,并返回新的数组长度。数组中的元素顺序可以被改变,只需要获取到新的数组长度,不需要考虑最终数组当中的元素排列状态。

思路分析

  这个题目看起来是如此简单,直观的想法就是可以统计数组中与指定值相同的元素个数,然后用原长度减去这个元素个数,就可以获得新数组的长度。

public static int removeElement(int[] A, int n, int elem) {
        if (n < 1)
            return -1;
        int count = 0;// 统计与elem相同的元素个数
        for (int i = 0; i < n; i++)
            if (A[i] == elem)
                count++;
        return n - count;
    }

  貌似这样写挺对的,再看看题目要求,其实上述写法是存在问题的,我们只是得到了数组的长度,但是数组当中的元素并没有任何改变,与elem相同的元素并没有被移除,没有办法筛选出移除后elem之后的数组元素,这样的算法显然是错误的。那么我需要改进算法。如果你有经验的话,你应该可以想到通过设置游标来指示与elem不同的元素,通过数组赋值将数组中和elem不同的元素依次移到数组头部。代码很简单,下面给出改进后的代码:

public static int removeElement1(int[] A, int n, int elem) {
        if (n < 1)
            return -1;
        int index = 0;
        for (int i = 0; i < n; i++)
            if (A[i] != elem) {
                A[index] = A[i];
                index++;
            }
        //print(A);//打印出来用来观测
        return index;

    }

  当然数组当中与elem相等的元素仍然是存在的,假如传入数组为{7, 4, 8, 4, 4, 4, 10},实际经过算法操作之后,数组变为{7,8,10,4,4,4,10} ,数组当中所有不等于elem的元素被移到前段,有效数组区间为{7,8,10},游标index值正好是有效的数组长度。这样是符合题目要求的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值