LeetCode283 移动零 的解题思路

115 阅读2分钟

题目要求

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

要求呈现的结果

image.png

为了完善代码的效果,检查实现效果的正确性,这边小编采用的是测试方法对问题进行分析

题目分析

在这道题中,咱们可以很形象的理解成,对一个数组进行整理,整理需要达到的效果呢就是0在后面,其他元素的相对位置不变并进行输出,好了,我们分析一下这个整理的过程需要怎么做

  1. 就像收拾房间一样,这个房间里面有东西我们才需要收拾,所以小编的第一步是先判断这个房间有没有东西。如果没有呢,就返回一个空,这样一来能够避免后续的无效移动。
  2. 形象的说的话,就像我们收拾家里卫生的时候,亟需摆放物品的位置有空地方我们会直接放上去,没有空地方我们会把暂时不需要的给安排到最受收拾,这边小编的思路也是这样的。
    • 倘若数组前面的元素有零,我们可以把后面的非零元素给通过循环覆盖掉前面是0的元素
    • 当然,我们同样需要把0给重新赋值到数组的尾部,这也仅仅需要一个循环来实现
  3. 为了看到代码的完整实现效果,这边小编会在方法最前面创建一个list集合,用来存储构造方法整理后的数组,就像我们收拾干净家里后拍照纪念一下
  4. 最后把list集合里的元素给重新还原给数组并返回,这就像是房间收拾好了,但是要给别人实时的展现出来,这个时候我们就可以一比一复刻一份,通过快递把这一份发送给想要让看到的人

好了,下面我们看一下小编是怎么收拾这个数组的 ``

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @program: src
 * @description: 力扣283题  移动零的题目学习
 * @create: 2022-10-10 13:15
 **/
public class LeetCode283YiDongLing {
    @Test
    public void test(){

        int[]nums = {0,3,0,5,60,6};
        int[]newness = moveZeroes(nums);
        System.out.println(Arrays.toString(newness));

    }

    public int[] moveZeroes(int[] nums) {
        List<Integer> list = new ArrayList<>();
//     如果数组的长度为空,直接返回null
        if (nums == null || nums.length == 0)
            return null;
//        定义一个移动指针
        int index = 0;
        //一次遍历,把非零的都往前挪
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0)
                nums[index++] = nums[i];

        }
        //后面的都是0,
        while (index < nums.length) {
            nums[index++] = 0;
        }
//        把数组添加到list集合当中
        for (int num : nums) {
            list.add(num);
        }
//        把集合中的元素转存到新的数组中并返回
        int indexi = 0;
        int []res = new int[list.size()];
        for (Integer integer : list) {
            res[indexi++] = integer;
        }
        return res;
    }
}

好了,小编的题目分享就结束啦,总得来说思路和方法呢用的没有那么干练,接下来小编会减低代码的时间复杂度,分享其他的解题思路的,最后希望小编的思路对你的解题想法有帮助 ,在与算法相伴的生活里不枯燥。