LeetCode 283. 移动零

举报
诡途 发表于 2021/11/19 01:01:50 2021/11/19
【摘要】 阅读助手 1.题目解法一:双指针解法二:remove&apeend解法三:布尔排序一个有问题的解法 1.题目 给定一个数组 nums, 编写一个函数将所有 0 移动到数组的末尾, ...

1.题目

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

示例:

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

  
 
  • 1
  • 2

说明:

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

  
 
  • 1
  • 2

来源:力扣(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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

解法二: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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解法三:布尔排序

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

一个有问题的解法

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

但是在自己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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述
在这里插入图片描述

最后,换了一个东西测试了下,
可能的原因是 for 遍历的时候nums的内存指向没变
在这里插入图片描述

文章来源: blog.csdn.net,作者:诡途,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_35866846/article/details/107414830

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。