首页
学习
活动
专区
圈层
工具
发布

每日一题 | 移除元素

移除元素(27. 简单难度)

题目来源

LeetCode 27. 移除元素[1]

题目描述

给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。

假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:

•更改nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。•返回k。

示例

示例 1:

输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2,_,_]解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3,_,_,_]解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。注意这五个元素可以任意顺序返回。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

作者思考

快慢指针思路:用两个指针,从后往前遍历。一个指针走在前面用来找到值等于val的元素,另一个指向要跟本次val交换的元素。当前面的指针找到时,交换两指针对应值,直到前面的指针遍历完。

对撞指针思路:同样是两个指针,一个从前往后,一个从后往前。左边的指针来找值等于val的元素,右边的指针用来赋值给左边的指针。当左边的指针找到时,右边的指针把值赋值给左边的指针,然后右边的指针左移一位(如果此时赋的值也是val,就再赋一次值,再左移)

抽象思维:把要删除的值为val的元素理解为一个"空位",想办法把有内容的元素往前占用这些空位。

🧠 题解

//java//快慢指针class Solution {   public int removeElement(int[] nums, int val) {       int tail = nums.length - 1;       int index = tail;       while(index >= 0){           if(nums[index] == val){               int temp = 0;               temp = nums[index];               nums[index] = nums[tail];               nums[tail] = temp;               tail--;               index--;           }else index--;       }       return tail + 1;   }}//对撞指针//作者:力扣官方题解//链接:https://leetcode.cn/problems/remove-element/solutions/730203/yi-chu-yuan-su-by-leetcode-solution-svxi/class Solution {   public int removeElement(int[] nums, int val) {       int left = 0;       int right = nums.length;       while (left < right) {           if (nums[left] == val) {               nums[left] = nums[right - 1];               right--;           } else {               left++;           }       }       return left;   }}

References

[1]LeetCode 27. 移除元素: https://leetcode.cn/problems/remove-element/description/

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OCWbymrLGX5CNa4ROqsdGDfw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

领券