一、题目描述
二、解法
class Solution { public void moveZeroes(int[] nums) { if (nums == null || nums.length == 0) return; /** * 方法1: 双指针,两次遍历 -> 把非0的往前挪,然后补0 */ int index = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { nums[index++] = nums[i]; } } // nums中,[0...index)的位置均为非0元素, nums剩余位置补0 while (index < nums.length) { nums[index++] = 0; } /** * 方法2:双指针,一次遍历,交换 * 优化1:只当 i 和 index 不相等时才进行交换。应对全非0元素的特殊情况。 * 优化2:当i > index时,用赋值操作 代替 交换操作 */ /* int index = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { // swap(nums, i, index); // index++; // 优化1 if (i != index) { // swap(nums, i, index); // 优化2 nums[index] = nums[i]; nums[i] = 0; } index++; } } */ /** * 方法3:双指针,一次遍历 * 思路:把 i - j 看作另一个指针,它是指向第一个0的位置 */ /* int j = 0; // 统计0的个数 for (int i = 0; i < nums.length; i++) { if (nums[i] == 0) { j++; }else if (j != 0) { nums[i - j] = nums[i]; nums[i] = 0; } } */ } private void swap(int[] nums, int a, int b) { int temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; } }