Python算法题集_移动零

本文为Python算法题集之一的代码示例

题目283:移动零

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

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

本文给出四种解法,结果均正确,不过只有一个是合乎题意的

  1. Python3.7以上新特性,代码简洁优雅,结果正确,但技术过于先进,此题不认可

    from itertools import groupbydef move_zeros_to_end_ext3(nums):if len(nums) < 2:return numsreturn [i for k, g in groupby(nums) if k != 0 for i in g] + [i for k, g in groupby(nums) if k == 0 for i in g]print(move_zeros_to_end_ext3([0, 1, 0, 3, 12]))
    # 运行结果
    [1, 3, 12, 0, 0]
    
  2. 使用数组复制,结果正确,违反限制,此题不认可

    def move_zeros_to_end_ext2(nums):if len(nums) < 2:return numszeros = []non_zeros = []for num in nums:if num == 0:zeros.append(num)else:non_zeros.append(num)return non_zeros + zerosprint(move_zeros_to_end_ext2([0, 1, 0, 3, 12]))
    # 运行结果
    [1, 3, 12, 0, 0]
    
  3. 从后往前进行块移动,结果正确,步骤最长,超时失败

    def move_zeros_to_end_timeout(nums):if len(nums) < 2:return numsleft, right = len(nums) - 2, len(nums) - 1while right > 0:if nums[right] == 0:right -= 1left = right -1continuewhile left >= 0:if nums[left] == 0:for iIdx in range(right - left):nums[left+iIdx] = nums[left+iIdx+1]nums[right] = 0right -= 1left = right - 1continueleft -= 1right -= 1left = right - 1return numsprint(move_zeros_to_end_timeout([0, 1, 0, 3, 12]))
    # 运行结果
    [1, 3, 12, 0, 0]
    
  4. 使用零数量计数器,所有元素最多移动一次,结果正确,通过算法验证

    def move_zeros_to_end_ext1(nums):if len(nums) < 2:return numsiZeroCount = 0left, right = 0, len(nums) - 1while left <= right:if nums[left] == 0:iZeroCount += 1else:nums[left - iZeroCount] = nums[left]left += 1left -= iZeroCountwhile left <= right:nums[left] = 0left += 1return numsprint(move_zeros_to_end_ext1([0, 1, 0, 3, 12]))
    # 运行结果
    [1, 3, 12, 0, 0]
    

第四种解法效果还行,如图在这里插入图片描述

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT与生成式AI在教育领域的应用前景光明,但也伴随着挑战

随着ChatGPT和其他生成式AI技术&#xff0c;如GPT-3.5、GPT-4的出现&#xff0c;我们正见证教育领域一场前所未有的变革浪潮。这些技术不仅推动了教育方式的进步&#xff0c;也为学习者带来了全新的机遇和挑战。 NO.1 教育变革的新浪潮 生成式AI技术&#xff0c;特别是ChatGPT…

力扣每日一题 --- 972. 相等的有理数

本题中的一个难点是怎么判断是否相等&#xff0c;如果自己写判断的话是不是很麻烦&#xff0c;判断整数之后再去判断小数部分&#xff0c;那么我们这题的另一个难点就要登场了&#xff0c;第一个难点让本题的情况变得复杂&#xff0c;第二个难点让本题变得很难想到怎么判断&…

如何测试你的 Golang 代码

文章目录 简单概述最易想到的方法一个快速体验案例学会使用 go testing测试的编写规则灵活记忆 API 的使用 实践一个案例简洁紧凑的表组测试详细的日志输出灵活控制运行哪些测试总结参考 不论是开源项目&#xff0c;还是日常程序的开发&#xff0c;测试都是必不可少的一个环节。…

STM32-GPIO输出(HAL库)

STM32-GPIO 介绍 什么是GPIO&#xff1f; GPIO&#xff08;通用输入/输出&#xff09;是一种用于与外部设备进行数字通信的通用硬件接口。它允许微控制器或其他数字电路的引脚以灵活的方式配置为输入或输出&#xff0c;并在运行时进行动态控制。GPIO可用于连接和控制各种外围…

C# CefSharp 根据输入日期段自动选择日期

1&#xff0c;前言 搞这个Demo整整搞几天通宵&#xff0c;爆肝了。后做的效果出来&#xff0c;还是不错的。给小伙伴看看效果图。 2, 遇到的问题 日期之间相差多少个月数。开始时间框点击对应月份要点击多少次&#xff0c;结束时间框点击对应月份要点击多少次Xpath获取问题。…

使用NVIDIA TensorRT-LLM支持CodeFuse-CodeLlama-34B上的int4量化和推理优化实践

本文首发于 NVIDIA 一、概述 CodeFuse&#xff08;https://github.com/codefuse-ai&#xff09;是由蚂蚁集团开发的代码语言大模型&#xff0c;旨在支持整个软件开发生命周期&#xff0c;涵盖设计、需求、编码、测试、部署、运维等关键阶段。 为了在下游任务上获得更好的精…

MP4是什么文件格式?如何转换视频格式为MP4?

MP4文件格式&#xff0c;全称MPEG-4 Part 14&#xff0c;源自MPEG&#xff08;Moving Picture Experts Group&#xff09;对数字媒体压缩标准的不断迭代。其产生背景主要是为了适应数字娱乐时代对更高质量、更高效压缩的需求。MP4文件格式在视频、音频和字幕等多媒体元素的集成…

ps发现一张图片上我有些文字我希望扣出去

问: 上面这是在同一个图层中的,一张图片,但是我希望删除: 剩余__次抽奖这几个文字,怎么办? 回答: 选择 快速选择工具, 讲这几个字括起来, 右键选择删除后填充选区, 就实现了将这几个文字删除,

如何在一个集合对象中A排除另外一个集合对象B中A中拥有的数据通用思路,很精妙!

标题是什么意思呢&#xff1f; 假如我有一个集合对象A&#xff0c;数据有1,2,3,4,5,6 另外一个集合对象B&#xff0c;数据有2,4,5 那么在A中排除B拥有的数据就是 最终需要返回的结果就是1,3 那么我们一般一开始的想法其实就是在集合对象中A遍历取到每一个元素&#xff0c;然…

麒麟linux混血安装kali linux工具集合

因为日常要使用麒麟Linux办公&#xff0c;缺少常见的网络管理软件&#xff0c;尝试麒麟linux混血安装kali linux工具集合。 步骤1&#xff1a; 添加Kali的APT源&#xff1a; echo "deb http://http.kali.org/kali kali-rolling main non-free contrib" | sudo tee…

【吃灰开发板复活】DIY全志V3s随身终端屏幕适配,LVGL以及各种外设驱动移植教程

在上周的文章中介绍了一款因作者想要学习Linux而动手DIY的终端设备V3S-PI&#xff0c; 《梦回2004&#xff01;我用全志V3s做了个成本100元&#xff0c;功能媲美MP4的随身终端》&#xff1a;梦回2004&#xff01;我用全志V3s做了个成本100元&#xff0c;功能媲美MP4的随身终端…

[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

数据库缓存策略

数据库缓存策略 以下是数据库与缓存的五种常见策略。 1缓存旁路 缓存旁路&#xff08;Cache-Aside&#xff09; 在缓存旁路策略中&#xff0c;数据库缓存位于数据库旁边。当应用程序请求数据时&#xff0c;它会首先检查缓存 如果缓存中存在数据&#xff08;缓存命中&#xff…

c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

文章目录 1. 415. 字符串相加题目详情代码1思路1代码2思路2 2. 125. 验证回文串题目详情代码1&#xff08;按照要求修改后放到新string里&#xff09;思路1代码2(利用双指针/索引)思路2 3. 541. 反转字符串 II题目详情代码1思路1 4. 557. 反转字符串中的单词 III题目详情代码1&…

逆矩阵举例

考虑一个 22的矩阵A 和其逆矩阵A −1的情况&#xff1a; 要求A的逆矩阵&#xff0c;首先计算A的行列式∣A∣&#xff1a; 如果 ∣A∣≠0, 则 A 可逆&#xff0c;逆矩阵 A −1的计算如下&#xff1a; 举例&#xff0c;考虑矩阵&#xff1a; 计算行列式 ∣A∣(24)−(31)8−35…

精品基于Uniapp+springboot智慧校园管理系统App课程选课成绩

《[含文档PPT源码等]精品基于Uniappspringboot智慧校园管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

leaflet学习笔记-带过滤的图例(九)

前言 图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素&#xff0c;本文要介绍的图例组件还可以按需求过滤掉不用显示的要素&#xff0c;使地图的更能清晰的显示我们需要显示的内容 技术核心 说到过滤要素&#xff0c;第一时间想到的就是滑块组件…

一个大的rosbag数据包怎么分割成一个小的数据包?

文章目录 1. 按时间范围分割&#xff1a;2. 按照消息类型分割&#xff1a;3. 使用split命令&#xff1a;4. 使用Python脚本&#xff1a; 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c; rosbag是一个用于记录和回放ROS主题消息的工具。如果你有一个大的 rosbag数…

[C++] external “C“的作用和使用场景(案例)

C中extern "C"的作用是什么&#xff1f; 在 C 中&#xff0c;extern "C" 的作用是告诉编译器按照 C 语言的规范来处理函数名和变量名。这是因为 C 编译器会对函数名和变量名进行名称修饰(name mangling)&#xff0c;以区分不同的函数和变量。而在 C 语言中…