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     }

 

 

posted @ 2017-10-15 08:50  daniel456  阅读(155)  评论(0编辑  收藏  举报