283. 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.

读题

题目的意思是将一个数组中的0放在这个数组的尾部,并且要求保证非0数字的原始顺序不变,且不允许使用额外的空间

思路

使用两个指针,然后遍历数组,找到第一个0的位置,然后i指针继续走,当这个指针找到一个非0的元素的时候就与j指针所指的元素进行交换,j指针加一指向下一个为0的元素位置

题解

package com.xiaoysec;

public class Solution283 {
    public static void moveZeroes(int[] nums) {
        if (nums.length == 1)
            return;
        int j = nums.length - 1;
        // 从后往前找到一个不为0的位置
        for (int i = 0; i < j; i++) {
            while (nums[j] == 0)
                j--;
            if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                j--;
            }
        }
    }

    public static void moveZeroes2(int[] nums) {
        if (nums.length == 1)
            return;
        // 找到第一个0的位置
        int j = 0;
        int i = 0;
        for (; i < nums.length; i++) {
            if (nums[i] == 0) {
                j = i;
                break;
            }
        }
        i++;
        // 此时i和j在第一个0的位置
        while (j < i && i < nums.length) {
            // 非0数时交换
            if (nums[i] != 0) {
                nums[j] = nums[i];
                nums[i] = 0;
                j++;
            }
            i++;
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[] { 0, 1, 0, 3, 12 };
        Solution283.moveZeroes2(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

其中第一个方法是因为没有看清题目的要求,保持原始的非零元素顺序

你可能感兴趣的:(283. Move Zeroes)