首页 > 其他分享 >283. 移动零

283. 移动零

时间:2023-10-21 13:35:28浏览次数:17  
标签:nums 元素 len range moveZeroes 数组 283 移动

目录

题目

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

    请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

法一、暴力法

  • 遍历找到零元素,并暂时保存,然后在零元素往后的都前移一位,最后在给最后一位赋给暂存的值
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        for i in range(n):
            if nums[i] == 0:
                
                for j in range(i+1,n):
                    nums[j-1] = nums[j]
                    j += 1
            nums[n-1] = 0
            i +=1
  • 错误:当测试用例刚好有两个挨着的0元素时就会报错。
  • 原因:当遇到第一个0元素时,0元素后面的依次往前一位,最后一位补0,然后进行i+1进行判断,此时,第二个0元素补在了一个0元素原来的位置,i+1直接跳过了第二个0元素的判断,导致出错。
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        i = 0
        while i < n:
            if nums[i] == 0:
                for j in range(i+1, n):
                    nums[j-1] = nums[j]
                nums[n-1] = 0
                if nums[i] != 0 and i > 0:
                    i += 1
                else:
                    i = i
                    if i < 0:  # 处理i小于0的情况
                        i = 0
            else:
                i += 1
  • 超出时间限制
  • 该方法没有成功解决问题,欢迎大家多多指教

法二、双指针

class Solution:
    def moveZeroes(self, nums):
        i = 0
        j = 0
        n = len(nums)
        
        for i in range(n):#把数组中不是0元素的往前移
            nums[j] = nums[i]
            if nums[i] != 0:#当元素不为0时j才往后移一位,,是0时不动等着nums[j] = nums[i]不为0的替代
                j += 1  #j最终停在最后一个不为0的元素
        
        while j < n:#剩余的位置全部补0
            nums[j] = 0
            j += 1

法三、pop+append

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        n = len(nums)
        i = 0
        while i < n:
            if nums[i] == 0:
                nums.pop(i)#将其从数组中移除
                nums.append(0)#将零追加到数组的末尾
                n -= 1#由于零元素已经被移动到末尾,所以数组的长度 n 减 1
            else:#如果当前元素不是零
                i += 1#则将索引 i 的值增加 1,以继续下一轮迭代

标签:nums,元素,len,range,moveZeroes,数组,283,移动
From: https://www.cnblogs.com/lushuang55/p/17777357.html

相关文章

  • 现代无线移动通信学习
    一、绪论1.1、无线移动通信发展历程  20世纪五六十年代,贝尔实验室蜂窝概念:分出多个小区,每个小区一个基站,相同的频段可以在相距较远的小区间重复使用,小区间干扰处理技术使得相同的频段可以在相邻的小区间重复使用。  第一代移动通信系统是模拟通信系统,形成于20世纪80年代,采......
  • C#实现鼠标进入按键范围后按键自动窗体内位置移动
    新建winform窗体程序添加button控件 在事件中选择MouseEnter 代码如下privatevoidbutton_MouseEnter(objectsender,EventArgse){//给按钮一个新的坐标//这个按钮活动的最大宽度就是窗体的宽度减去按钮的宽度intx=this.ClientSize.Width-button.Widt......
  • HTML5+CSS3+移动web 前端开发入门笔记(一)
    千古前端图文教程千古前端图文教程git的使用Git是一个分布式版本控制系统,它的作用主要包括以下几个方面:版本管理:Git可以跟踪文件的修改历史,记录每次提交的内容、时间和作者等信息。通过Git,开发人员可以轻松地查看和比较不同版本之间的差异,回滚到历史版本或者创建新的分支。多人协作......
  • 2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一
    2023-09-30:用go语言,给你一个整数数组nums和一个整数k。nums仅包含0和1,每一次移动,你可以选择相邻两个数字并将它们交换。请你返回使nums中包含k个连续1的最少交换次数。输入:nums=[1,0,0,1,0,1],k=2。输出:1。答案2023-09-30:步骤描述:1.定义一个函数minMoves......
  • 移动PDA离线车辆盘点系统
    0、背景多年前公司搞车辆租赁,有许多车辆被停放在多层地下停车场,每月需要人工盘点,纸质文档查找登记非常麻烦,所以业务部门迫切需要一个移动盘点设备,但是地下停车场网络很糟糕,此盘点系统需要支持离线盘点。1、设计该系统分为前台客户端和后台管理端:前台主要是用户登录、盘底计划下载,......
  • 一篇文章解密如何轻松实现移动应用的电子和手绘PDF签名功能!
    对PDF文件签名是移动设备上越来越普遍的使用需求,本文将描述自动生成/“手绘”签名与如何使用DevExpressOfficeFileAPI组件来实现在.NETMAUI应用程序中快速合并签名/签名支持之间的区别。DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化......
  • HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
    HTML中列表的作用HTML中的列表(List)用于呈现按照一定逻辑关系组织的信息,以便用户更好地理解和识别。列表可以分为有序列表、无序列表和定义列表三种类型。有序列表(OrderedList):用于表示按照一定顺序排列的项目,每个项目都有对应的标记。常见的例子包括步骤、流程等。无序列表(Unordere......
  • HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
    HTML中列表的作用HTML中的列表(List)用于呈现按照一定逻辑关系组织的信息,以便用户更好地理解和识别。列表可以分为有序列表、无序列表和定义列表三种类型。有序列表(OrderedList):用于表示按照一定顺序排列的项目,每个项目都有对应的标记。常见的例子包括步骤、流程等。无序列表(Unordere......
  • Tita 升级| 移动端 OKR 列表全新升级
    升级详情Tita-OKR和新绩效一体化管理平台1. OKR 列表全新升级全新页面布局,上下级支撑、评分一目了然  对齐支持点击查看详细信息,并修改对齐2.一键更新完成度、权重、信心指数目标、关键成果均可点击进度进行快速更新进度、进展与切换更新方式关键成果支持点击......
  • 如何将没有复制或移动构造函数的对象放入vector容器
    正文直接说答案,这个问题无法实现。原因是因为std::vector容器的插入一定会调用类对象的构造函数或者移动构造函数。说一下为什么会有这个问题,因为不想用指针,我想直接通过类对象本身的RAII机制来实现的资源的控制,智能指针是一个解决方案,不过智能指针是写起来很繁琐,终究比不上值类......