一、原题目
Given an array nums and a value val, remove all instances of that value in-placeand return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
二、题目大意
给定一个列表nums和一个值val,删除列表中的val,但是只能通过返回一个整数,代表输出nuns中的
元素个数作为结果返回。
三、思路分析
这个题目可以有三种思路,两种本人的,一种作者的。
本人的思路:
1.统计val在nums中个数n,在n-1个位置把不是val的数放到这个范围之内(先统计,后挪位)这里两次循环操作,下面都是一次循环操作。
2.先复制nums,利用for循环删除val(先复制,后删除)。这里必须复制,否则在for中遍历会索引出界
别人的思路:
利用for循环遍历,移除相同的值。(边比较,边删除)您是不是觉得与上面矛盾,但是这里就是可以,请看下面解释。
四、具体代码
作者的代码:
class Solution:
def removeElement(self, nums, val):
for num in reversed(nums):#使用了reversed
if num == val: nums.remove(num)
return len(nums)
本人的代码:
思路一:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
cout=0
for i in range(len(nums)):#统计val出现次数
if nums[i]==val:
cout+=1
n=0
for i in range(len(nums)):#进行挪位
if nums[i]!=val and n<len(nums)-cout:
nums[n]=nums[i]
n+=1
return len(nums)-cout
思路二:
class Solution:
def removeElement(self, nums: 'List[int]', val: 'int') -> 'int':
k=len(nums)
s=nums[:]
for i in range(k):#不复制,会索引出界
if s[i]==val:
nums.remove(val)
return len(nums)
五、两者差别
本人刚开始做这道题目的时候,采用的是本人的思路一,通过运行发现太耗资源,经过分析,发现是用了两次循环,因此,找到了作者的代码,作者只用一个循环就解决了问题,是自己思维的改进和升级。随后,根据自己经验,写了思路二,这是作者思路的另一种实现方式。
六、知识点总结
1.reversed(seq)的用法 seq -- 要转换的序列,可以是 tuple, string, list 或 range。
2.列表元素值的修改和长度的改变。值的修改:nums=nums[0:i]+nums[i+1:]不能出现在for i in range()结构中,会数组越界
七、.来源
题目连接:https://leetcode.com/problems/remove-element/
作者原文解答:https://leetcode.com/problems/remove-element/discuss/217181/3-line-Python-52ms
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。
由于受限于本人经验,难免不足,如有建议,欢迎留言交流。
说明:以上代码都能通过测试,本人亲测。(交代这个是因为,前面文章有些本人代码是没有通过的,为避免误解,特此说明。如果喜欢,请点赞,您的鼓励是本人前进的最好动力。)
---------------------
作者:路漫漫,远修兮
来源:CSDN
原文:https://blog.csdn.net/qq_41827968/article/details/88756403
版权声明:本文为博主原创文章,转载请附上博文链接!