LeetCod_27Remove Element

一、原题目

 

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 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值