前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 283. 移动零

LeetCode 283. 移动零

作者头像
诡途
发布2022-05-09 19:26:24
1970
发布2022-05-09 19:26:24
举报
文章被收录于专栏:诡途的python路诡途的python路

阅读助手

1.题目

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

示例:

代码语言:javascript
复制
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

代码语言:javascript
复制
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

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

解法一:双指针

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

代码语言:javascript
复制
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 – 列表中要移除的对象。 返回值:该方法没有返回值但是会移除列表中的某个值的第一个匹配项

代码语言:javascript
复制
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也一样,(运行速度要快)

代码语言:javascript
复制
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提交显示错误,解法灵感来源:约瑟夫环问题

代码语言:javascript
复制
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里测试时候是可以正确输出的

代码语言:javascript
复制
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的内存指向没变

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 阅读助手
  • 1.题目
  • 解法一:双指针
  • 解法二:remove&apeend
  • 解法三:布尔排序
  • 一个有问题的解法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档