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]
.
给定一个数字数组,写一个方法将所有的“
0
”移动到数组尾部,同时保持其余非零元素的相对位置不变。
例如,给定nums = [
0
,
1
,
0
,
3
,
12
],在调用你的函数之后,nums应该变为[
1
,
3
,
12
,
0
,
0
]。
备注:
你必须就地完成,不得复制该数组。
最小化总共的操作数。
方法一:
1 public void moveZeroes(int[] nums) { 2 int zeroIndex = 0; 3 int nonZeroIndex = 0; 4 int size = nums.length; 5 6 while(zeroIndex<size && nonZeroIndex<size){ 7 while(zeroIndex<size && nums[zeroIndex]!=0) zeroIndex++; 8 while(nonZeroIndex < size && (nums[nonZeroIndex]==0 || nonZeroIndex<zeroIndex)) nonZeroIndex++; 9 10 //swap the value 11 if(zeroIndex<size && nonZeroIndex<size){ 12 nums[zeroIndex++] = nums[nonZeroIndex]; 13 nums[nonZeroIndex++] = 0; 14 } 15 } 16 }
方法二
1 private int findValue(int[] nums, int start, boolean isZero) { 2 if (start >= nums.length || start < 0) return -2; 3 for (int i = start; i < nums.length; i++) { 4 if (isZero) { 5 if (nums[i] == 0) 6 return i; 7 } else { 8 if (nums[i] != 0) 9 return i; 10 } 11 } 12 return -2; 13 } 14 15 public void moveZeroes(int[] nums) { 16 int length = nums.length; 17 int zero = -2; 18 int number = -2; 19 if (length == 0) return; 20 zero = findValue(nums,0,true); 21 if (zero == -2) { 22 return; 23 } 24 number = findValue(nums,zero,false); 25 if (number == -2) { 26 return; 27 } 28 29 while (zero < number) { 30 nums[zero] = nums[number]; 31 nums[number] = 0; 32 zero = findValue(nums,zero+1,true); 33 if (zero == -2) { 34 break; 35 } 36 number = findValue(nums,zero+1,false); 37 if (number == -2) { 38 break; 39 } 40 } 41 }