[Leetcode]27. 移除元素

时间:2023-03-09 04:15:01
[Leetcode]27. 移除元素

题目描述:

++难度:简单++

给定一个数组 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]);
}

我的方法:

于我而言,并没有觉得简单就不想做的感觉。做好简单题目,正是处理复杂问题的基础。

此题的关键是正确理解题意,不要受上一题的影响。题目没有要求返回的数字不重复,只要求数组中的元素不等于val。

最终的效果中等偏上:执行用时 : 36 ms, 在Remove Element的Python提交中击败了63.92% 的用户。内存消耗 : 11.7 MB, 在Remove Element的Python提交中击败了34.43% 的用户。

class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i=0
# 遍历数组
for j in range(len(nums)):
# 当前元素不等于val时
if nums[j]!=val:
nums[i]=nums[j]
i+=1
return len(nums[:i])

别人的方法:

通过借鉴别人的方法,来优化自己的方法,至少要看一个比自己运行结果更优的方法。

以下方法中最值得借鉴的一点是使用了del方法。当del list[i]时,位于i上的元素将会被删除,其后的元素依次前移。del正好适合于应用于该场景。

效果不错:执行用时 : 32 ms, 在Remove Element的Python提交中击败了99.68% 的用户。内存消耗 : 11.7 MB, 在Remove Element的Python提交中击败了34.33% 的用户。

class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
start=0
# 遍历整个数组
while start<len(nums):
if nums[start]==val:
# 注意:当删除元素时,整个数组的长度变短了
# 此时删除元素,就相当于元素移位了
del nums[start]
else:
start+=1
return start