/**
* LeetCode-283. 移動零
* 連接:
* https://leetcode-cn.com/problems/move-zeroes/
* 題目:
* 給定一個數組 nums,編寫一個函數將全部 0 移動到數組的末尾,同時保持非零元素的相對順序。
* 說明:
* 1.必須在原數組上操做,不能拷貝額外的數組。
* 2.儘可能減小操做次數。
* 示例:
* 輸入: [0,1,0,3,12]
* 輸出: [1,3,12,0,0]
*/
public class MoveZero{
/**
* 方法一:
* 兩層for循環,第一個和第二個數判斷,第一個數爲0,則與第二個數換位置
* 互換後仍是0,再與第三個互換,直到非零爲止。
* @param nums
*/
public static void moveZero1(int[] nums) {
int temp;
for(int i = 0; i < nums.length-1; i ++){
for(int j = i + 1;j < nums.length ; j++){
if(nums[i] == 0 ){
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
/**
* 方法二:
* for循環把全部非零的數移動到前面,而後數組剩餘位置補0
* 使用指針i,指向須要插入的下標,使用指針j指向遍歷的下標。遍歷一遍,若是j指向的位置爲0,
* 則i不變,j++後移;若是j指向的位置不爲0,則將j位置的元素值賦值到i位置,而後i++。
* 參考連接:
* https://leetcode-cn.com/problems/move-zeroes/solution/javashi-yong-2ge-xia-biao-zhi-zhen-fu-zhi-zui-shao/
* @param nums
*/
public static void moveZero2(int[] nums){
// 定義填充非零數據下標
int i = 0;
for(int j = 0;j < nums.length;j++){
if(nums[j] != 0){
nums[i] = nums[j];
i++;
}
}
// 補0
for(int k = i;k < nums.length;k++){
nums[k] = 0;
}
}
public static void main(String[] args) {
int[] nums = new int[]{0,1,0,3,12};
// 方法一
// moveZero1(nums);
// 方法二
moveZero2(nums);
StringBuilder sb = new StringBuilder();
for (int num : nums) {
sb.append(num).append(",");
}
System.out.println(sb.toString());
}
}複製代碼
(完)java