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] + " ");
}
}
}
其中第一个方法是因为没有看清题目的要求,保持原始的非零元素顺序