【移除元素】

这篇具有很好参考价值的文章主要介绍了【移除元素】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

移除元素

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

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

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

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}


示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

双指针法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 定义两个指针 i 和 j,初始时都指向数组的开头
        int i = 0, j = 0;
        // 只要指针 j 没有到达数组的末尾,就继续循环
        while (j < nums.size()) {
            // 如果当前元素不等于 val,就将它赋值给指针 i 所指向的位置,并将指针 i 向后移动一个位置
            if (nums[j] != val) {
                nums[i] = nums[j];
                i++;
            }
            // 不管当前元素是否等于 val,都要将指针 j 向后移动一个位置
            j++;
            for (int k = 0; k < nums.size(); k++) {
                cout << nums[k] << " ";
            }
            cout << endl;
        }
        // 循环结束后,指针 i 所指向的位置就是新数组的长度
        return i;
    }
};

输入

[0,1,2,2,3,0,4,2]
2

输出

[0,1,3,0,4]

预期结果

[0,1,4,0,3]

stdout

0 1 2 2 3 0 4 2
0 1 2 2 3 0 4 2
0 1 2 2 3 0 4 2
0 1 2 2 3 0 4 2
0 1 3 2 3 0 4 2
0 1 3 0 3 0 4 2
0 1 3 0 4 0 4 2
0 1 3 0 4 0 4 2

详细地分析一下数组变化的过程。

初始状态:

0 1 2 2 3 0 4 2
i
j

循环过程:

  1. 第一次循环: nums[i] = nums[j]; i++; j++;
0 1 2 2 3 0 4 2
  i
  j

循环后的数组:[0, 1, 2, 2, 3, 0, 4, 2]
  1. 第二次循环: ; j++;
0 1 2 2 3 0 4 2
    i
    j

循环后的数组:[0, 1, 2, 2, 3, 0, 4, 2]
  1. 第三次循环:j++
0 1 2 2 3 0 4 2
    i
      j

循环后的数组:[0, 1, 2, 2, 3, 0, 4, 2]
  1. 第四次循环:nums[i] = nums[j]; i++; j++;
0 1 2 2 3 0 4 2
    i
        j

循环后的数组:[0, 1, 2, 2, 3, 0, 4, 2]
  1. 第五次循环:nums[i] = nums[j]; i++; j++;
0 1 3 2 3 0 4 2
      i
          j

循环后的数组:[0, 1, 3, 0, 3, 0, 4, 2]
  1. 第六次循环:nums[i] = nums[j]; i++; j++;
  0 1 3 0 3 0 4 2
          i
              j
  
  循环后的数组:[0, 1, 3, 0, 3, 0, 4, 2]
  

7.第七次循环:nums[i] = nums[j]; i++; j++; j < nums.size()结束循环

0 1 3 0 4 0 4 2
          i
              j

循环后的数组:[0, 1, 3, 0, 4, 0, 4, 2]

循环结束。此时i指向新数组的长度,即5。新数组为0 1 3 0 4文章来源地址https://www.toymoban.com/news/detail-437344.html

到了这里,关于【移除元素】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 27.移除元素+88.合并两个有序数组

    目录 一、移除元素 (一)题目 (二)代码  二、合并两个有序数组 (一)题目 (二)代码 27. 移除元素 - 力扣(LeetCode)     88. 合并两个有序数组 - 力扣(LeetCode)    用双指针  

    2023年04月14日
    浏览(41)
  • ( 数组) 27. 移除元素 ——【Leetcode每日一题】

    难度:简单 给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明

    2024年02月08日
    浏览(441)
  • 使用C++实现数组中移除元素的算法

    本篇博客将介绍一种使用C++语言实现的数组中移除元素的算法,算法代码基于代码随想录第三章 算法思路: 有两种算法解决该问题,第一种是暴力解法,也就是两个for循环,算法复杂度为n2。第二个算法基于双索引的思想,只需使用一个for循环,算法复杂度为n。 我们使用两

    2024年02月09日
    浏览(42)
  • 【LeetCode】移除元素、删除有序数组中的重复项、合并两个有序数组

    🧑‍💻作者: @情话0.0 📝专栏:《LeetCode》 🔖题目链接:移除元素、删除有序数组中的重复项、合并两个有序数组 给你一个数组 nums 和一个值 val,你需要 原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空

    2023年04月09日
    浏览(78)
  • C语言每日一题:6.移除元素+合并两个有序数组。

    一:暴力查找的方法: 1.找到对应val值的下标,返回数组的下标。 2.删除对应的下标,从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了(注意数组越界的问题)。 3.删除了一个数之后数组元素个数要–。 4.查找和删除是在一个循环里面因为val的值可能

    2024年02月15日
    浏览(46)
  • day1-数组part01| 704. 二分查找、27. 移除元素

    数组是存放在连续内存空间上的相同类型数据的集合。 数组下标从0开始 数组内存空间的地址是连续的 1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其 内存空间大小是能够改变的 。 2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的 内存空

    2024年02月05日
    浏览(47)
  • 图灵日记之Leetcode删除有序数组中的重复项&&合并两个有序数组&&移除链表元素

    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过

    2024年02月04日
    浏览(59)
  • 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数

    Java面试题目录 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数 使用前缀和来实现。在保存累加和的数组preSum中,找坐标大的元素与坐标小的元素差值正好为k的个数。 leecode地址:. - 力扣(LeetCode) 直接在力扣找了个写好的答案。

    2024年01月24日
    浏览(50)
  • 每日一题leetcode--使循环数组所有元素相等的最少秒数

    相当于扩散,每个数可以一次可以扩散到左右让其一样,问最少多少次可以让整个数组都变成一样的数 使用枚举,先将所有信息存到hash表中,然后逐一进行枚举,计算时间长短用看下图  考虑到环形数组,可以把首项+n放到最后,这样for循环就相当于前后可以联通 贴一张别

    2024年02月12日
    浏览(48)
  • 【LeetCode 热题 100】矩阵 专题(大多原地算法,需要一定思维)

    解题思路 在 代码注释中!

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包