移動零
題目
移動零(力扣:283)
給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
說明:
必須在原數組上操作,不能拷貝額外的數組。
儘量減少操作次數。
分析
使用雙指針解決。
方法一:用2個指針i指向當前遍歷的節點,j指向已排好序的當前非零節點的後一位。i指針位置的當前節點,如果是非零,則交換i和j的位置。
方法二:第一次遍歷將非零節點都移動到數組的前面,並計算出非零節點的數量s,完成遍歷後,第二次遍歷從s開始一直到數組末尾,設置爲0即可。
代碼實現:方法一
/**
* 283. 移動零
* @param nums
*/
public void moveZeroes(int[] nums) {
if (nums == null){
return;
}
int i = 0, j = 0;
int tmp;
while (i <nums.length){
if (nums[i] != 0){
tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
j++;
}
i++;
}
}
代碼實現:方法二
/**
* 283. 移動零
*
* @param nums
*/
public void moveZeroes2(int[] nums) {
if (nums == null || nums.length <= 1) {
return;
}
int s = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[s] = nums[i];
s++;
}
}
for (int i = s; i < nums.length; i++) {
nums[i] = 0;
}
}