力扣热门100题之移动0【中等】

news2025/2/21 4:09:16

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?

解法1:先位移再补0

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let data={}
    let count=0;
    //记录每个索引位置前有几个0
    for(let i=0;i<nums.length;i++){
        if(nums[i]==0){
            count++;
        }
        data[i]=count;
    }
    //将当前位置及前面0的个数进行位移
    for(let i=0;i<nums.length;i++){
        if(nums[i]!=0){
            nums[i-data[i]]=nums[i];
        }
    }
    // //位移最后将对应个数位置置0
    for(let i=1;i<=data[nums.length-1];i++){
        nums[nums.length-i]=0;
    }
};

执行情况
在这里插入图片描述
解法2:记录0所在位置,后续非0与0所在位置进行交换。

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let j=[];
    for(let i=0;i<nums.length;i++){
        if(nums[i]==0){
            j.push(i);
        }
        if(nums[i]!=0&&j.length>0){
            nums[j.shift()]=nums[i];
            nums[i]=0;
            j.push(i);
        }
    }
};

在这里插入图片描述

继续优化,减少数组的shift操作,增加一个变量,记录使用到了哪一个索引了。

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let j=[];
    let objIndex=0;//该用哪一个索引了
    for(let i=0;i<nums.length;i++){
        if(nums[i]==0){
            j.push(i);
        }
        else if(nums[i]!=0&&j.length>objIndex){
            nums[j[objIndex++]]=nums[i];
            nums[i]=0;
            j.push(i);
        }
    }
};

执行情况
在这里插入图片描述

解法3: 滚雪球解法 0 会最终会和0挨在一起,记录挨在一起的0的个数 将非0提到0之前

	/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let zeroNum=0;
    for(let i=0;i<nums.length;i++){
        if(nums[i]==0){
            zeroNum++;
        }else{
            if(zeroNum>0){
                nums[i-zeroNum]=nums[i];
                nums[i]=0;
            }
        }
    }
};

执行情况:时间和内存综合下来还可以
在这里插入图片描述

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

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

相关文章

利用Graphics的CopyFromScreen实现简陋版的打印(C#)

前段时间&#xff0c;在做一个打印的需求&#xff0c;需要把Winform界面的控件及内容全部打印出来&#xff0c;但有一个比较坑的地方是&#xff0c;公司提供的打印API打印单选框&#xff0c;打印单选框时发现选框和内容总是有那么一点点不对齐&#xff0c;看着很别扭。不过客户…

【Linux】文件操作(一)

目录 预备知识 复习C语言文件接口 fopen() 写入类&#xff1a;fwrite()、fprintf()、fputs() 读取类&#xff1a;fgets() 系统接口 open() 一个参数如何传递多个选项&#xff1f; close() write() read() 预备知识 在正式讲解文件之前&#xff0c;我们需要有一些预…

C#中小数保留固定位数

我们写程序的时候&#xff0c;有时候数据想要对齐一点&#xff0c;如果小数位数不一样&#xff0c;自然就对不齐了。这里提供一个方法. 1.这里举例保留小数点后4位(不足4位后面补0)。 String result String.Format("{0:F4}", 123.456); 输出结果为result123.4560&a…

Linux离线安装mysql8.0+

文章目录 1.查看是否安装过MySQL2.MySQL卸载3.下载mysql4.上传mysql到指定目录5.解压MySQL安装包6.安装1.准备工作2.开始安装3.查看MySQL版本 7.修改my.cnf配置文件8.授权给mysql用户8.服务初始化10.启动MySQL11.登录12.修改密码13.设置远程登录1连接超时问题2确认网络3查看端口…

STL vector 详解

STL vector 详解 STL vector 详解 STL vector 详解一级目录二级目录三级目录 1. vector容器2. vector 容器的初始化函数1.初始化2.案例 3. vector的访问函数1. 成员函数访问2. 操作符[ ]访问3.案例 4. vector的插入函数1. 语法2. 案例 5. vector的删除函数1.语法2. 案例 6. vec…

Vue el-table 多表格联合显示、合并单元格

原型图 分析 先看内容是三个表&#xff0c;每个表的合并单元格都有点不同。 按照原型图给的内容&#xff0c;第一个是两列&#xff0c;有行合并和列合并&#xff0c;还有表头行合并。 现根据图造出mock数据&#xff0c;然后再写对应的代码。 export const columnVarsData {s…

数据结构day7(2023.7.21)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;折半查找/二分查找 1-------100 key8850---10075-100int arr[]{12,23,33,45,66,78,99};key7912,23,33,45,66,78,990 6low mid high66, 78, 99mid1 mid highlow99lowhigh…

进程间的通信之管道(匿名管道)

文章目录 进程间通信&#xff08;IPC&#xff09;管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信&#xff08;IPC&#xff09; inter process conmmunication &#x1f447;&#x1f447;&#x1f…

现场总线协议转换网关快速选型介绍

现场总线协议是一种用于设备间通信的标准化接口&#xff0c;它支持数字信号和信息在不同设备之间的传输&#xff0c;例如传感器、执行器、控制器等。捷米特总线协议网关支持Profinet/DeviceNet/EthernetIP/EtherCAT/RS485/Profibus/ModbusRTU/TCPIP/CAN/CANopen/CC-Link等工业网…

【教学类-36-09】20230722职业抽卡(midjounery-niji)(涂色、裁剪、游戏)

作品展示&#xff1a; 随机选学具&#xff0c;辨认职业名称、说说工作内容、涂色、裁剪、交换卡片等 灵感来源&#xff1a; 最近在网上搜索“midjounery 简笔画”&#xff0c;发现一条宝藏“关键词”——可以直接生成简笔画风格&#xff08;造型的外边框线加粗&#xff09;的样…

【Elasticsearch】ES简单快速入门

ES简单快速入门 概述 Elasticsearch是一个分布式全文搜索引擎 下载与安装 https://www.elastic.co/cn/downloads/elasticsearch下载之后 解压文件夹&#xff0c;进入bin目录&#xff0c;双击elasticsearch.bat文件 一开始初始化时间比较久&#xff0c;之后初始化之后&…

Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现

本文基于Istio 1.18.0版本进行源码学习 1、Pilot-Discovery工作原理 Pilot-Discovery是Istio控制面的核心&#xff0c;负责服务网格中的流量管理以及控制面和数据面之间的配置下发 Pilot-Discovery从注册中心&#xff08;如Kubernetes&#xff09;获取服务信息并汇集&#xff…

新版UI盲盒抽奖系统源码-带H5端小程序端可打包APP_带安装教程

新版UI盲盒抽奖系统源码-带H5端小程序端可打包APP,这套盲盒系统小白看了一下里面没有搭建教程的&#xff0c;但是盲盒的搭建方式都是差不多的这套就放给你们自己研究了&#xff0c;UI还是很好看的感兴趣可以自己搭建看看。

Vue中TodoList案例_勾选

与上一篇Vue中TodoList案例_添加有三个文件变化了 App.vue&#xff1a;中加了checkTodo方法 <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/&…

【Linux】信号保存信号处理

前言&#xff1a;对信号产生的思考 上一篇博客所说的信号产生&#xff0c;最终都要有OS来进行执行&#xff0c;为什么&#xff1f;OS是进程的管理者&#xff01;信号的处理是否是立即处理的&#xff1f;在合适的时候 -》那什么是合适的时候&#xff1f;信号如图不是被立即处理…

动态规划入门第3课,经典DP问题2 --- 背包问题

练习1 第1题 方案数 查看测评数据信息 给你n个整数&#xff0c;每个数可选或不选&#xff0c;要求选一些数&#xff0c;使它们的和为S&#xff0c;问有多少种方案&#xff1f; 输入格式 第一行&#xff1a;2个整数n和s&#xff0c;范围都在[1, 100]。 第二行&#xff1a;n个…

spring boot3 集成swagger3

快速开始 | Knife14j 官方的推荐 1. 设置pom.xml 主要是引入nexus-maven&#xff0c;com.github.xiaoymin 2个&#xff0c;cn.hutool&#xff0c;org.springframework <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://ma…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

【Hammerstein模型的级联】快速估计构成一连串哈默斯坦模型的结构元素研究(Matlab代码实现)

&#x1f4a5;1 概述 在许多振动应用中&#xff0c;所研究的系统略微非线性。Hammerstein模型的级联可以方便地描述这样的系统。Hammerstein提供了一种基于指数正弦扫描相位属性的简单方法。 构成一连串Hammerstein模型的结构元素可以在快速估计中起到关键的作用。Hammerstei…

260. 只出现一次的数字 III

题目描述&#xff1a; 主要思路&#xff1a; 首先通过抑或的方式可以将所有两个的数字全部排除&#xff0c;得到两个单个数字的异或值。 接下来将当前得到的异或值取最低一位的1。 分析异或值的每一位&#xff0c;为1的肯定是两个数中一个有一个没有。于是可以通过这一特性将两…