[leetcode]Move Zeroes

题目描述如下:

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.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [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.

需要注意的地方note已经说的很明白了,不能开新的数组(也就是只能对原数组进行操作),以及尽量减少移动操作

很自然地想到用双指针法,第一个指针index顺序下来,第二个指针firstZero始终指向最末尾一段连续0的第一个位置上,则移动的时候只需要改变[index,firstZero]这一段的数字即可,避免了每一次都需要把剩下整段数组移动,附上代码:

public class Solution {
            public void moveZeroes(int[] nums) {
            int index = 0, firstZero = -1, j;
            for(; index < nums.length; index ++){
                if(index == firstZero) break;
                if(nums[index] == 0){
                    if(firstZero == -1){
                        for(j = index + 1; j < nums.length; j++){
                            nums[j - 1] = nums[j];
                        }
                        nums[nums.length - 1] = 0;
                        firstZero = nums.length - 1;
                    }else{
                        for(j = index + 1; j < firstZero; j++){
                            nums[j - 1] = nums[j];
                        }
                        nums[firstZero - 1] = 0;
                        firstZero -= 1;
                    }
                    index -= 1;
                }
            }
        }
}

需要注意几个指针的操作:

  1. firstZero的初始值我这里把它定为-1,并且到遇到第一个0时将其值变为nums.length - 1;
  2. 按照我的写法,firstZero每一次的值是需要上移以为的;
  3. index的值需要减去1,从而避免连续两个0的情况,因此for循环这里要注意一下;
  4. 当两个指针相遇时结束

总的来说并不难,通过率也很高

题目链接:https://leetcode.com/problems/move-zeroes/

你可能感兴趣的:(LeetCode)