LeetCode #27 移除元素

今天分享的内容是LeetCode中27.移除元素这个题目。

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

01

思路讲解

一种思路是可以新建一个数组。然后,遍历原数组,将所有值不等于val的元素放入新建的数组中,之后再将新建数组中那些值不等于val的元素拷贝至原数组。

public int removeElement(int[] nums, int val) {
    // 新建数组,用于存放原数组中值不等于val的元素
    int[] arr = new int[nums.length];


    // 新建数组中存放了多少个原数组中值不等于val的元素
    int j = 0;
    // 遍历原数组,将值不等于val的元素放入数组arr中
    for(int i = 0; i < nums.length; i++) {
        if (nums[i] != val) {
            arr[j] = nums[i];
            j++;
        }
    }


    // 拷贝数组arr中的数据到原数组中
    for(int m = 0; m < j; m++) {
        nums[m] = arr[m];
    }
    return j;
}

但题目中要求原地移除所有数值等于val的元素,因此上面的实现方式是与题意不符的,接下来我们就以示例中的数组{3, 2, 2, 3}为例来看下如何原地移除所有数值等于val的元素。

首先,定义变量j,我们规定在区间[0,j)中的元素都是值不等于val=3的元素。

接着,遍历原数组,对其中的每一个元素和val=3进行比较。比较的结果,有两种情况。一是,当前考察的元素值等于val=3;二是,当前考察的元素值不等于val=3。

对于第一种情况,如下图所示,当前考察的元素为变量i指向的元素3,其值与val相等。

对于这种情况,要做的就是继续考察下一个元素,即变量i向后移动一个位置(i++)。

此时,变量i指向的元素2不等于val=3。

对于这种情况,首先要做的是将变量i所指向的元素值赋予变量j所指向的元素所在位置,即nums[j]=nums[i]。

接着要做的就是将变量j向后移动一个位置,即j++。

对于数组nums中剩余的元素2和3,重复上述步骤,即可将所有数值等于val的元素移除。

02

代码实现

public int removeElement(int[] nums, int val) {
    // 定义变量j,在区间[0,j)中的元素都是值不等于val的元素
    int j = 0;
    for(int i = 0; i < nums.length; i++) {
        // 如果当前考察的元素其值不等于val
        // 则将当前元素放入区间[0,j)中
        if (nums[i] != val) {
            nums[j] = nums[i];
            // 在将当前元素放入区间[0,j)中后,j++
            j++;
        }
    }
    return j;
}

感谢您的阅读。

如有错误,

欢迎在公众号后台留言指出。

下一篇我们将学习新的内容,敬请期待。

PS:如果文章对您有一点点帮助,请动动手指,分享、点赞、在看都可以,这会让我开心好久好久。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值