LeetCode 283. 移动零

   日期:2020-07-18     浏览:152    评论:0    
核心提示:阅读助手1.题目解法一:双指针解法二:remove&apeend解法三:布尔排序一个有问题的解法1.题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes/著作权归领扣网络

阅读助手

  • 1.题目
  • 解法一:双指针
  • 解法二:remove&apeend
  • 解法三:布尔排序
  • 一个有问题的解法

1.题目

给定一个数组 nums,
编写一个函数将所有 0 移动到数组的末尾,
同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:双指针

#基本思路:
新建一个索引指针j,原索引指针i上的值不等于0时,把值放到j索引位置上

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """ Do not return anything, modify nums in-place instead. """
        j=0
        for  i in range(len(nums)):
            if nums[i]!=0:
                nums[j]=nums[i]
                if i !=j:
                    nums[i]=0
                j+=1

解法二:remove&apeend

①Python List count() 方法
用于统计某个元素在列表中出现的次数。
语法:list.count(obj)
参数:obj – 列表中统计的对象。
返回值:返回元素在列表中出现的次数。

②Python List remove()方法
remove() 函数用于移除列表中某个值的第一个匹配项
语法:list.remove(obj)
参数:obj – 列表中要移除的对象。
返回值:该方法没有返回值但是会移除列表中的某个值的第一个匹配项

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """ Do not return anything, modify nums in-place instead. """
        for i in range(nums.count(0)):
            nums.remove(0)
            nums.append(0)

解法三:布尔排序

key的值指定bool,
就只对0和非零排序, 非0中的1,3,4或者1,4,3不排序;
用lambda x:x!=0也一样,(运行速度要快)

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """ Do not return anything, modify nums in-place instead. """
        nums.sort(key=bool, reverse=True)			#运行时间48 ms 内存消耗 14.4 MB
        #nums.sort(key=lambda x:x!=0,reverse=True) 运行时间 28 ms 内存消耗 14.4 MB

一个有问题的解法

LeetCode提交显示错误,解法灵感来源:约瑟夫环问题

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """ Do not return anything, modify nums in-place instead. """
        for i in nums:
            if i == 0:
                nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
                nums.append(i)
        return nums

但是在自己IDE里测试时候是可以正确输出的

nums=[0,1,0,3,12]
for i in nums:
    if i == 0:
        nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
        print(nums)
        nums.append(i)
        print(nums)
print(nums)

#函数封装
def moveZeroes(nums):
    """ Do not return anything, modify nums in-place instead. """
    for i in nums:
        if i == 0:
            nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
            nums.append(i)
    return nums
moveZeroes(nums)


最后,换了一个东西测试了下,
可能的原因是 for 遍历的时候nums的内存指向没变

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服