题目:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5,并且nums中的前五个元素为0,1,3,0,4。
注意:
这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
思路一:
有两个指针 i 和 j ,分别指向数组的首尾。当 i < j 时,判断 i 是否等于val。若 nums[i]!=val,则将 i 后移,指向nums中的下一位元素;当 nums[i]==val时,就用nums数组后面不等于val值的元素替换掉nums[i]。nums数组中不等于val的数值要从最后一个数开始判断,依次向前。直到 i 的值大于或等于 j 为止。如果 i == j,那么就要判断当前这个nums值是不是等于val。如果等于就要在原来基础上加1,若不等于就不用加,直接返回之前的 i 值即可。
代码一:
class Solution:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums)-1
while i<j:
if nums[i]!=val:
i += 1
else:
if nums[j]==val:
j -= 1
else:
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
if i==j:
if nums[i]==val:
return i
else:
return i+1
思路二:
上一个思路是自己想的,这个方法是提交了之后再网上搜到的大神的解法。大神的思路:定义两个变量 i 和 j ,两个变量都初始化为0。以 i 为索引开始遍历整个数组,当数组元素的值不等于val时,把nums[i]的值赋给nums[j]。最后返回 j 即可。整个方法比思路一的方法简洁很多。
代码二:
class Solution:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = 0
while i < len(nums):
if nums[i] != val:
nums[j] = nums[i]
j += 1
i+=1
return j