坚持日更第三天,习惯逐渐养成了,这两天都期待着每日的刷题写博客环节~
一、题目
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 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。
注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
二、思路解析
刚看到这道题的时候,我就想到了昨天刚学到的 "双指针" 解法,兴致冲冲就开始做了,结果还是得看答案才做出来(°̥̥̥̥̥̥̥̥o°̥̥̥̥̥̥̥̥)
放在前期,这很正常,调整好心态,继续上路!
这道题我用的是自己的方法写出来的,跟答案还不太一样。
但是大差不差,用的都是双指针的概念,一个指针定义为 fast ,另一个定义为 slow。
先让 fast 遍历数组,当 nums[fast] 不等于 val 时,我们就可以把 nums[fast] 赋值给 nums[slow] 了。
而如果找到跟值为 val 的元素之后,让 fast 跳过他,接着去遍历下一个元素就好。
总的来说,这道题还算比较简单的,因为跟我这篇博客的题目很类似:
【力扣每日一题02】数组篇--删除有序数组中的重复项_程序员阿蔡的博客-CSDN博客
三、完整代码
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0;
int slow = 0;
int count = 0;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow]=nums[fast];
fast++;
slow++;
}
else {
fast++;
}
}
return slow ;
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!