leetcode 283. 移动零

题目:

思路

分情况:

  1. 如果列表只有一个值或者值都是重复,则返回列表即可
  2. 获取当前列表0的个数,从末尾开始遍历:如果0的个数=列表0个数,说明0都在列表后面且连续至0末尾,此时不需要进行0的转移。0的个数!=列表0个数,找到末尾遍历时最后遍历为0的数的位置i,这时候只需要遍历前i-1个数,找出0移至列表末尾即可

ps:

遍历前n项,如果更严谨点,需要分情况来定义i的值。

一种是 末尾第一个数不为0 此时i =len(nums),即遍历应该为列表长度 如3,5,6

另一种:末尾第一个数为0 此时i = len(nums)-1, 如 1,0,3,0 遍历前n项可以为0:3

而不用判断来定义i也可以是因为移动0是把0移至原列表的末尾,如:

i = len(nums)-1

假如 nums = 1,0,2,6 此时遍历1,0,2也不会影响 因为是把0移至原列表的末尾

nums=1,0,2,6,0 此时遍历1,0,2,6

while numsi==0 and i>0,其中一种情况 1,0,0

python 复制代码
class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        count = nums.count(0)
        length = len(nums)
        if count ==len(nums) or len(nums)==1:
            return nums
        i = len(nums)-1
        t = 0
        while nums[i]==0 and i>0:
            t+=1
            if nums[i-1]!= 0:
                #0都排在列表后边且连续排至末位
                if t== count:
                    return nums
                else:
                    count = count - t
                    break
            else:
                i-=1
        j = 0
        while j<i and count>0:
            if nums[j]==0:
                nums.append(nums.pop(j))
                count-=1
            else:
                j+=1

严谨点方法:

python 复制代码
class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        count = nums.count(0)
        length = len(nums)
        if count == len(nums) or len(nums)==1:
            return nums
        if nums[-1]== 0:
            i = len(nums)-1
            t = 0
            while nums[i]==0 and i>0:
                t+=1
                if nums[i-1]!= 0:
                #0都排在列表后边且连续排至末位
                    if t== count:
                        return nums
                    else:
                        count = count - t
                        break
                else:
                    i-=1
        else:
            i = len(nums)
        
        j = 0
        while j<i and count>0:
            if nums[j]==0:
                nums.append(nums.pop(j))
                count-=1
            else:
                j+=1
        return nums
相关推荐
Navigator_Z33 分钟前
LeetCode //C - 1300. Sum of Mutated Array Closest to Target
c语言·算法·leetcode
SZYSK35 分钟前
鸿蒙人脸识别算法放在终端里:和外挂授权 SDK 差在排障路径
物联网·算法·华为·harmonyos
程序猿乐锅1 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
lzqrzpt1 小时前
太阳能控制器选型要点:电路工艺与工程适配技术解析
python·1024程序员节
凯瑟琳.奥古斯特1 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun612 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
databook2 小时前
时间序列数据中,如何找出缺失值
python·数据分析
qz_Serene2 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节
小小龙学IT3 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节
Nuanyt3 小时前
Hot 100 刷题笔记 · 数组与哈希专题(3 题)
java·笔记·算法·leetcode·哈希算法·1024程序员节