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

本文介绍了一种在原地移动数组中零元素至末尾的高效算法,通过快慢指针技巧,实现对非零元素的前移,同时保持操作次数最小。文章提供了详细的算法步骤及Java实现代码,展示了如何在不使用额外空间的情况下完成任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考自:https://blog.youkuaiyun.com/qq_38200548/article/details/80688630

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

  说明:

    1.必须在原数组上操作,不能拷贝额外的数组。
    2.尽量减少操作次数。
package suanfa;

public class demo2 {
    public static void main(String[] args) {
        //随便定义一个数组
        int[] arr={1,2,0,3,0,4,5,0};
        moveZeros(arr);
        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
    private static void moveZeros(int[] arr) {
        //定义了两个快慢指针
        int slow=0,fast=0;
        while(fast<arr.length) {
            if (arr[fast] != 0) {
                arr[slow] = arr[fast];
                slow++;
                fast++;
            } else {// 一旦这个数组上的数字是0,那么fast指针就需要往前走
                   // slow指针停留在0这个位置,在等待着fast发现了非0的数字将0位置的slow指针覆盖掉
                fast++;
            }
        }
        // slow跟fast相差了多少,就说明这个数组有多少个0,在上面填充完元素之后,
        // 就需要将漏掉的0补上
        for (int i = slow; i <arr.length ; i++) {
            arr[i]=0;
        }
    }
}

 

 
 

转载于:https://www.cnblogs.com/huozhonghun/p/9844340.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值