#將一個數組中的零全部移到數組後,且原來的元素相對位置不變
給定一個數組 nums, 編寫一個函數將所有 0 移動到它的末尾,同時保持非零元素的相對順序。
例如, 定義 nums = [0, 1, 0, 3, 12],調用函數之後, nums 應爲 [1, 3, 12, 0, 0]。:
- 方法1
冒零法 - 方法2
指針法
方法1-冒零法
/*法1,採用的是冒泡的變體 思路:
- 1、採用冒泡排序
- 2、swape條件爲 元素不爲零即可
- 進一步優化,本題採用該方法
- 1、採用冒泡排序
- 2、添加遍歷是否結束的標誌位
*/
public static int[] BoubleArr(int[] arr){
boolean flage = false;//冒泡標誌位
for(int i=0;i<arr.length; i++){// 冒泡模板
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]!=0) {//判斷元素如果不爲零則 進行下一次循環
continue;
}else{
if(arr[j+1]!=0){// 交換元素,事實上我們不需要使用第三方變量因爲我們知道一個元素一定爲零
arr[j] = arr[j+1];
arr[j+1] = 0;
flage = true;
}
}
if(!flage){//標誌位爲false代表遍歷到了最後,直接結束
return arr;
}
}
}
return arr;
}
方法2-指針法
/*
- 指針法:
- 1、設置兩個指針pre post,從前向後移動兩個指針
- 2、pre移動到第一個0元素
- 3、post從pre的位置開始移動到第一個非零元素
- 4、交換pre和post角標所致的兩個元素
- 優化:
- 設置標誌位,標誌遍歷是否結束
- 條件是:如若post最後沒有遍歷到非零元素即跳出遍歷
- */
public static int[] f(int[] arr) {
int size = arr.length;
int pre = 0, post = 0;// 找到第一個爲零的座標,後者定位非零的角標
while (true) {
boolean flage = false;//判斷是否結束的標誌位
for (int j = pre; j < size; j++) {// 從前向後定位第一個爲零的數
if (arr[j] == 0) {
pre = j;
break;
}
}
for (int k = pre; k < size; k++) {// 從pre起始開始找到第一個非零元素
if (arr[k] != 0) {
post = k;
flage = true;
break;
}
}
if (!flage) {// 代表隨後找不到非零元素
break;
}
int swape = arr[pre];// 交換
arr[pre] = arr[post];
arr[post] = swape;
pre++;//改變pre的角標
}
return arr;
}