leetcode 283.移动零

111 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

示例:

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

说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。

解题

1.使用双指针翻转数组.

不能使用额外的数组,那么指针在数组内部进行交换

通过两次翻转,将第一位的数字放到数组尾部.

注意点:进行翻转后,需要将当前指针向前返回一位.

public void moveZeroes(int[] nums) {
        int length = nums.length;
        // 用于记录0触发的次数,不用将最后的0放入翻转数组中
        int count = 0;
        for (int i=0;i < nums.length;i++) {
            int tempLength = length - count-1;
            // 设置循环的边界
            if (i == tempLength) {
                break;
            }
            // 当遇到0时,进行翻转,将0放到目前数组的最后,然后排除0的位置,再次进行翻转. 相当于把0从开头放到了最后
            if(0 == nums[i]) {
                reverse(nums,i,tempLength);
                reverse(nums,i,tempLength-1);
                count ++;
                // 由于0移动到后面之后,剩下的数自动向前移动了一位,并且i即将移动到下一位.
                // 需要让i下次还是指在本次的位置,因此要-1
                i--;
            }
            
        }
    }

    public void reverse(int[] nums,int begin,int end) {
        while (begin <= end) {
            int temp = nums[begin];
            nums[begin] = nums[end];
            nums[end] = temp;
            begin ++;
            end --;
        }
    }

image.png