1. 程式人生 > 其它 >LeetCode-027-移除元素

LeetCode-027-移除元素

移除元素

題目描述:給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入陣列。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-element/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:交換位置
  • 首先,如果陣列為空或者陣列的長度為0,直接返回0;
  • 然後,如果陣列不為空,遍歷陣列,count記錄和val值不相同的數目(也就是最後的返回值),index表示從0開始遍歷,reverseCount表示交換數字的次數,具體遍歷過程如下:
    • 當index對應的值不等於val時,count加1,並且index加1也就是往後移一位;
    • 當index對應的值等於val時,判斷index是否後面可遍歷的位數,如果是,則將index和可遍歷的最後一位交換數字,並且reverseCount+1,然後繼續遍歷;如果不是,則沒有可交換的位置,即已經遍歷完成。返回count值。
public class LeetCode_027 {
    public static int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int count = 0;
        int index = 0;
        int reverseCount = 0;
        while (index < nums.length - reverseCount) {
            if (nums[index] != val) {
                index++;
                count++;
            } else {
                if (index < (nums.length - 1 - reverseCount)) {
                    int temp = nums[index];
                    nums[index] = nums[nums.length - 1 - reverseCount];
                    nums[nums.length - 1 - reverseCount] = temp;
                    reverseCount++;
                } else {
                    break;
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{1};
        System.out.println(removeElement(nums, 1));
        System.out.println();
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }
}

【每日寄語】 昨天是歷史,明天是謎團,只有今天是天賜的禮物。