JAVA实现算法题-移动零

题目

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

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

实现思路

大概思路如下图:
在这里插入图片描述
由图可知,数组的第一个位置就是0,根据题目要求我们要将它移动到数组的末尾。这里采用的是将数组里的元素(从0的位置开始)进行两两比较,如果0的下一个位置上的数非零,那么就将0与下一个位置上的数互换,换完后的位置上的0再与下一个位置上数进行比较,如果下一个位置上是非零就再互换位置,直到0被换到数组的末尾位置。这里循环4次,将数组里第一个位置上的0换到了数组的末尾。

那么数组中第一个0被换到了末尾,还剩一个0,如图:
在这里插入图片描述
这个思路也是一样的,要注意此时只要循环三次,因为已经有一个0到了末尾,那么就是数组里的元素逐个进行判断:如果是0就与下一个元素换位置,直到换到数组末尾。显然要使用嵌套for循环(两层),图片所示为内层循环,外层循环只要循环数组的长度次就行了。

完整代码如下:

import java.util.Arrays;

/**
 * @author link
 * @date 2021/6/7 - 10:53
 */
public class MoveZero {
    public static void main(String[] args) {
        int []nums={0,1,0,3,12};
        new MoveZero().move(nums);
    }

    private void move(int[] nums) {
        int temp;//用来储存交换的元素
        for (int i = 0; i <nums.length ; i++) {//数组里的每个数都进行判断因此外层循环次数为数组的长度次
                for (int j = 0; j < nums.length - i - 1; j++) {//因为外层循环完每完成一次就有一个0到了数组末尾,因此可以少换一次位置,循环次数就少一次
                    if (nums[j] == 0 && nums[j + 1] != 0) {//0的下一个位置上的数任然是0,这就没必要再换位置了,因此为了提高效率加上 nums[j + 1] != 0
                        //交换位置
                        temp = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = temp;
                    }
            }
        }
        System.out.println(Arrays.toString(nums));//输出最终数组
    }
}

注意事项

1.因为有可能0的下一个位置上的数任然是0,这就没必要再换位置了,因此为了提高效率加上 nums[j + 1] != 0,如果满足这个条件就互换位置。
2.这里交换的原则选择使用第三方变量,先使用变量temp储存nums[j] (就是0元素),再将nums[j+1] (0下一个位置上的元素)赋值给nums[j],此时0元素就被下一个位置上的元素替换了,再将之前储存的temp赋给nums[j+1] 此时就完成了交换。

这个方法效率上应该不如别的方法好,还有待改进,欢迎各位大佬指点,讨论。只是针对这道题有不同的方法与思路。

  • 24
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Link♛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值