每日一道Leetcode算法——移动零——2019.01.27

LeetCode每日两题01:移动零 (均1200道)方法:双指针 解题思路:我们创建两个指针i和j,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。解题思路:使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。...... 阅读详情

中文:
给定一个数组nums,写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序。
Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
注意:
您必须就地执行此操作,而无需复制阵列。
最小化操作总数。


解题思路:
方法一:
由于题干说您必须就地执行此操作,而无需复制阵列。
还要保持非0数据的相对位置。
所以采用类似冒泡排序的方法,如果值为0,则和其后面的数字交换位置,将0的数据冒泡到最后。
并在此基础上优化,减少外层循环次数,有几个0只需要循环几次。

 /**
     * 解题思路:
     * 由于题干说您必须就地执行此操作,而无需复制阵列。
     * 还要保持非0数据的相对位置。
     * 所以采用类似冒泡排序的方法,如果值为0,则和其后面的数字交换位置,将0的数据冒泡到最后。
     * 并在此基础上优化,减少外层循环次数,有几个0只需要循环几次。

     * @num 283
     * @param nums
     * @date
     */
    public static void moveZeroes(int[] nums) {
        //创建一个变量记录数组中值为0的个数
        int zeroNums = 0;
        //循环数组,确定数组中值为0的个数
        for (int z = 0; z < nums.length; z++) {
            if (nums[z] == 0) {
                zeroNums++;
            }
        }
        //冒泡排序外层为控制比较的轮数,由于有zeroNums个0,所以只需要循环zeroNums次
        for (int i = 0; i < zeroNums; i++) {
            //控制比较的次数
            for (int j = 0; j < nums.length - 1 - i; j++) {
                //当数值为0,则交换和后面数字位置
                if (nums[j] == 0) {
                    int mid = nums[j + 1];
                    nums[j + 1] = nums[j];
                    nums[j] = mid;
                }
            }
        }
    }

方法二: 

忽略题干不让复制数组,采用复制数组的方法进行处理。
0的数字记录一下,非0的记录在另外一个数组,重新拼接一下。
这样时间复杂度更好。 

package cn.leetcode.easy;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.
 * Example:
 * Input: [0,1,0,3,12]
 * Output: [1,3,12,0,0]
 * Note:
 * You must do this in-place without making a copy of the array.
 * Minimize the total number of operations.
 *
 * @author kimtian
 * @date 2019.01.27
 * @num 283
 */
public class MoveZeroes {

    /**
     * 忽略题干不让复制数组,采用复制数组的方法进行处理
     * 0的数字记录一下,非0的记录在另外一个数组,重新拼接一下
     * 这样时间复杂度更好。
     *
     * @param nums
     */
    public static void moveZeroes2(int[] nums) {
        //创建一个非0数组存放非0的数据
        List<Integer> unZeroList = new ArrayList<>();
        //循环数组
        for (int z = 0; z < nums.length; z++) {
            //如果值不为0,则在非0数组中添加该数据
            if (nums[z] != 0) {
                unZeroList.add(nums[z]);
            }
        }
        //循环原始数组,修改其值
        for (int j = 0; j < nums.length; j++) {
            //如果在非0数组的范围内,则将非0数组的相应值赋给它
            if (j < unZeroList.size()) {
                nums[j] = unZeroList.get(j);
            }
            //剩余末尾的其他位置赋值为0
            else {
                nums[j] = 0;
            }
        }
    }

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {
        int[] aa = new int[]{0, 1, 0, 3, 12};
        moveZeroes2(aa);
        System.out.println(Arrays.toString(aa));
    }
}

多出来的那一截:Java 堆外内存 OOM 的来源分账、分流排查与治理解析 Java进程的RES常比-Xmx多出一截,堆却平稳。本文把堆外内存拆成直接缓冲区、Unsafe、JNI本地库、线程栈、元空间与文件映射六类,用JDK 8与17的六组实验对照RSS、NMT、BufferPool三本账:clear()不释放内存;MaxDirectMemorySize默认约等于堆上限且只管直接缓冲区;禁用显式GC会让申请线程退避半秒后失败;未关闭的Deflater零GC下让RSS涨1GB;Netty池内泄漏GC救不回。最后给出定性、对账、定位的排查路线与预算、编码、监控三层治理。 阅读详情

相关推荐

STM32单片机:驱动ADS1115四个通道全开程序

本文介绍了德州仪器(TI)的ADS1115高精度16位模数转换器(ADC)及其应用实现。该芯片具有16位分辨率、可编程增益放大器(PGA)和低功耗特性,支持±0.256V至±6.144V量程。文章提供了完整的C语言驱动代码,包括初始化、配置寄存器读写、单次/连续转换模式设置、电压值读取等功能实现。代码通过I2C接口与ADS1115通信,支持多通道选择和不同PGA设置,可实现高精度模拟信号采集。该方案适用于需要精密测量的嵌入式系统,如传感器数据采集等应用场景。

weixin_42122070的博客 689

LeetCode简单题之移动零

题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 来源:力扣(LeetCode) 解题思路   此题可以用“冒泡”来解决遍历当前数组当遇到不是0的数字就将它往前“冒”,直到碰到非零数字或者左括号。 class Solution: def moveZeroes(self, nums: List[int])

Lonery的博客 977

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 459

Leecode初级算法——移动零

Leecode初级算法——移动零

LxinY213的博客 443

【配环境】ubuntu18.04 3080ti显卡+cuda+cudnn+torch

1.打开系统设置中的software & updates点击 System Settings,选择 Additional Drivers 标签,下面会列出当前显卡可用的驱动版本。 注意:3080ti建议不要安装最新版本驱动 点击Apply Changes即可安装; 注意:3080ti只能装cuda11.x 修改软连接修改系统使用的cuda 卸载老版本cuda 重新查询看是否卸载成功 显卡驱动及CUDA Toolkit最高对应版本 查询驱动版本............

sinat_41670685的博客 3911

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9641

重排问题(非零元素排序前后相对位置不变)

给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变2、不能使用额外存储空间例子如下输入 0、3、0、2、1、0、0输出 0、0、0、0、3、2、1 关注题目要求:非零元素排序前后相对位置不变, 只要求的是非零元素而已 是不是想起了之前的一道题目,不改变正负数之间相对顺序重新排列数组.时间O(N...

weixin_30832405的博客 812

QT/C++实现健壮HTTP POST客户端:从基础到异常处理与性能优化

HTTP协议作为客户端与服务器通信的基石,其POST方法在数据提交、API交互等场景中扮演着核心角色。其工作原理基于请求-响应模型,通过封装TCP连接与协议细节,为应用层提供了简洁的数据传输接口。在C++桌面与嵌入式开发中,直接使用底层Socket实现HTTP不仅复杂且易出错,而利用框架进行高级封装能显著提升开发效率与代码健壮性。QT框架的`QNetworkAccessManager`等组件正是为此设计,它通过信号槽机制提供异步网络编程模型,有效管理连接与协议解析。一个健壮的HTTP客户端需要妥善处理网络波

weixin_29176179的博客 383

283. 移动零

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 class Solution { public: void moveZeroes(vector<int>& num...

460

MS1826A HDMI 多功能视频处理器 HDMI4进1出画面分割芯片

基本介绍 MS1826A 是一款多功能视频处理器,包含 4 路独立 HDMI 音视频输入通道、1 路 HDMI 音视 频输出通道以及 1 路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字库定 制型 OSD;可处理隔行和逐行视频或者图形输入信号;有四路独立视频播放引擎可支持视频多路 播放。该产品提供了高质量的视频输出,有解隔行输入、视频增强,以及帧率转换的处理能力。 功能特征 视频输入输出  四路独立 HDMI 输入通道  一路 HDMI 输出通道  最高支持 4K@3

qq_45645383的博客 1779

BAPI创建委外采购订单

使用BAPI BAPI_PO_CREATE1创建委外采购订单,组件为手工输入时,有几个点需要注意: 1、已通过CS01创建过BOM的物料,创建时会自动带出components。如果要修改当前组件清单,可以通过设置pocomponents-change_id = 'E’来实现 lv_sline = lv_sline + 1. ls_pocomponents-po_item = l_ebelp + 10. ls_pocomponents-ITEM_NO = l

Buffalo_soldier的博客 3260

leetcode初级算法之————移动零

leetcode初级算法之————移动零

m0_62327900的博客 624

uniapp - 实现扫码功能自定义扫描二维码/条码界面+手电筒轻触照亮+扫码屏幕添加手动输入框,手机扫描二维码并跳转过程,调用手机原生摄像头进行扫码且自动识别执行事件(uniApp安卓苹果App端)

uniapp,app端,安卓app,苹果ios,uniapp扫码识别,二维码展示和扫码,uniapp如何实现扫码功能,uni-app实现扫码功能,二维码和一维码/条码扫描,UniApp实现扫描二维码,uniapp开发原生app页面的扫码功能,自定义扫码界面,uniapp怎么调用扫一扫功能,app自定义扫码界面,uniapp 自定义扫一扫页面,扫码手电筒功能,自定义扫描框,扫码报错怎么办,扫码黑屏,扫一扫摄像头黑屏,uniapp扫码原生插件,最新扫码组件,连续扫码,uniapp APP扫码,扫码后如何处理跳转

✅ 精选推荐文章 1万+

【算法千题案例】⚡️每日LeetCode打卡⚡️——51.移动零

算法题打卡:移动零。没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。所以说,树倒了,没有一片雪花是无辜的

努力前行,总会成为自己心中的那道光 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Hot100算法刷题集】双指针-01-移动零(含置零思路、移动思路、偏移量思路、冒泡法)

🏠关于专栏:专栏用于记录LeetCode中Hot100专题的所有题目🎯每日努力一点点,技术变化看得见。

Jammingpro 1344

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

每日一道Leetcode算法—— Single Number——2019.01.25

题目: 中文: 给定一个非空的整数数组,除了一个元素外,每个元素都会出现两次。找出只出现一次的唯一元素。 注意: 您的算法应具有线性运行时复杂性。你能不用额外的内存来实现吗?  Example 1: Input: [2,2,1] Output: 1Example 2: Input: [4,1,2,1,2] Output: 4 英文: Given a non-empty array...

third_的博客 322

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

每日一道Leetcode算法——Sort Array By Parity——2019.01.31

中文: 给定一个非负整数数组A,返回一个由A的所有偶数元素组成的数组,后跟A的所有奇数元素。 您可以返回满足此条件的任何答案数组。   Example 1: Input: [3,1,2,4] Output: [2,4,3,1] The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted. Note: ...

third_的博客 189

每日一道Leetcode算法—— Maximum Width Ramp——2019.01.20

中文: 给定整数数组A,斜坡是元组(i,j),其中i &lt;j且A [i] &lt;= A [j]。这种斜坡的宽度是j-i。 在A中找到斜坡的最大宽度。如果不存在,则返回0。 Example 1: Input: [6,0,8,2,1,5] Output: 4 Explanation: 最大宽度斜坡达到 (i, j) = (1, 5): A[1] = 0 and A[5] = 5. ...

third_的博客 377

算法每日一题 Day01|双指针解决移动零问题

本文介绍了移动零问题的双指针解法。题目要求将数组中的零元素移动到末尾,同时保持非零元素顺序。解法使用两个指针:cur遍历数组,dest标记已处理区间的末尾。通过将数组划分为非零区、零区和未处理区,在遍历过程中交换元素位置实现移动。关键点在于指针边界条件的处理。代码使用Java实现,通过交换操作完成原地调整。该问题属于数组处理中的双指针应用,展示了如何在不使用额外空间的情况下对数组进行重排操作。

2301_77311065的博客 276

力扣算法题

力扣排名前200题目1 前50新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 分享下力扣出现概率前200题目 1 前50 1 两数之和 简单 2 两数相加 中等 5 最长回文子串 中等 3 无重复字符的

qq_19375579的博客 756

LeetCode算法,每日一题,冲击阿里巴巴,day3

大连跨海大桥夜景 算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。 1、LeetCode 268.丢失的数字 题目 给定一个包含 [0, n]中n个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 进阶: 你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题? 小编菜解 private static int test01(int[]...

学Java,找哪吒 4369

每日一道leetcode(2026.04.01):机器人碰撞

现有 n 个机器人,编号从 1 开始,每个机器人包含在路线上的位置、健康度和移动方向。 给你下标从 0 开始的两个整数数组 positions、healths 和一个字符串 directions(directions[i] 为 'L' 表示 向左 或 'R' 表示 向右)。 positions 中的所有整数 互不相同 。 所有机器人以 相同速度 同时 沿给定方向在路线上移动。如果两个机器人移动到相同位置,则会发生 碰撞 。

Rosen's 393

每日一道Leetcode算法——如何判断一个链表是否有环,并求出环的入口和环的长度——2019.01.12

判断一个链表是否有环有两种办法: 一种最经典是定义两个指针,一个指针每次向前走一步,一个指针每次向前走两步,如果两个指针最终重合。则证明有环。 一种是创建一个hash表,将每次走过的结点放入hash表中,如果结点在hash表中,则表示存在环。 判断链表的入口: 假设两个指针第一次相遇点为m,此时令一个指针从头结点向下走,每次走一步,令另一个指针从相遇点往下走,每次走一步,两个指针相遇的位置...

third_的博客 903

每日一题 -- LeetCode (三十一)

JavaScript / TypeScript for LeetCode 当前进程: 开始时间:2020.6.27 结束时间:undefined GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode 参考视频:https://www.bilibili.com/video/BV1wA411b7qZ 1、题目要求 ( LeetCode-第283题 ) 移动零 给定一个数组 nums,编写一个函数将所有 0

weixin_47771057的博客 184

542. 01 矩阵 每日一题 Java

542. 01 矩阵 以前用C++做过类似的题,当时的思路也是bfs,不过这一次直接将未标记的位置标记为r+c,这个值是不可能达到,这样就省下了一个位图矩阵的空间。 package updateMatrix; import java.util.LinkedList; import java.util.Queue; public class Solution { public stati...

Cyan1956的博客 270

刷爆力扣的第一天(lc01,lc02,lc03)

这个专题我会不断地更新我刷题的经过,每道题每行代码,我都带上自己的理解,希望能对uu们有帮助,同时,也会再继续温习左神的算法视频,把里面的精髓全部总结到这个专题上,没时间看视频的uu,希望能帮助你通过我的专题,也掌握一些刷题的技巧~

优快云_my111的博客 440
上一篇: 每日一道Leetcode算法—— Two Sum——2019.01.22
下一篇: 每日一道Leetcode算法——383.赎金信——2019.01.28
田小江爱分享
博客等级 码龄10年 34粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值