題目 :
/**
* 283
*/
public class MoveZeros {
//時間複雜度:O(n)
//空間複雜度:O(n)
public void moveZeroes(int[] nums) {
int[] temp = new int[nums.length];
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
temp[j++]=nums[i];
}
}
for(int i=0;i<j;i++){
nums[i]=temp[i];
}
for(int i=j;i<nums.length;i++)
nums[i]=0;
}
//時間複雜度O(n)
//空間複雜度O(1)
public void moveZeroes2(int[] nums) {
int k=0;//nums[0,k)存放非0元素
//遍歷到i個元素後,保證[0,i]中所有的元素,都按順序排列在[0,k)中
for(int i=0;i<nums.length;i++){
//遇到非0元素就移到nums[k]的位置,不在乎是否覆蓋了0,
// 最後遍歷完了非0元素,補齊0
if(nums[i]!=0)
nums[k++]=nums[i];//此時第i個元素按順序放入了[0,k)中
}
//剩餘的位置補0
while(k<nums.length)
nums[k++]=0;
}
//非0元素與0元素交換,交換的過程中0元素自動到後面
public void moveZeroes3(int[] nums) {
int k=0;//nums[0,k)存放非0元素
//遍歷到i個元素後,保證[0,i]中所有的非0 元素,都按順序排列在[0,k)中
//同時,[k,i]爲0
for(int i=0;i<nums.length;i++){
if(nums[i]!=0) {
//數組全部是非0的
if(i!=k)
swap(nums,k++,i);//此時第i個元素按順序放入了[0,k)中
else
//i==k
k++;
}
}
}
private void swap(int[] nums, int k, int i) {
int tem = nums[k];
nums[k]=nums[i];
nums[i]=tem;
}
public static void main(String[] args) {
int arr[] = {0,1,0,3,12};
//new MoveZeros().moveZeroes(arr);
new MoveZeros().moveZeroes3(arr);
System.out.println(Arrays.toString(arr));
}
}