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元素移动到数组的末尾,不改变其他元素的顺序;不能 copy 数组,最小化的操作

自己的思路

交换冒泡

public static void moveZeroes(int[] nums) {

boolean hasChange = false;
do {
hasChange = false;
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 0 && nums[i + 1] != 0) {
nums[i] = nums[i + 1];
nums[i + 1] = 0;
hasChange = true;
}
}
} while (hasChange);
System.out.println(Arrays.toString(nums));
}

与0换位置,参考了别人的想法

public static void moveZeroes2(int[] nums) {
int firstZoneIndex = -1;
for (int i = 0; i < nums.length; i++) {
if (firstZoneIndex != -1) {
// 发现了过0
if (nums[i] != 0) {
nums[firstZoneIndex] = nums[i];
nums[i] = 0;
firstZoneIndex++;
}
} else {
// 没有发现过0
if (nums[i] == 0) {
firstZoneIndex = i;
}
}
}
System.out.println(Arrays.toString(nums));
}

别人的算法

public void moveZeroes(int[] nums) {
int i = 0;
int j = 0;
while (j < nums.length) {
if (nums[j] != 0) {
if (j != i) {
nums[i++] = nums[j];
nums[j] = 0;
} else {
++i;
}
}
++j;
}
}