LeetCode-283. 移動零

/**
 * 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

相關文章
相關標籤/搜索