LeetcCode 27:移除元素 Remove Element(python、java)

公衆號:愛寫bugjava

給定一個數組 nums 和一個值 val,你須要原地移除全部數值等於 val 的元素,返回移除後數組的新長度。python

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。數組

元素的順序能夠改變。你不須要考慮數組中超出新長度後面的元素。函數

Given an array nums and a value val, remove all instances of that value in-place and return the new length.this

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.spa

The order of elements can be changed. It doesn't matter what you leave beyond the new length.指針

示例 1:code

給定 nums = [3,2,2,3], val = 3,

函數應該返回新的長度 2, 而且 nums 中的前兩個元素均爲 2。

你不須要考慮數組中超出新長度後面的元素。

示例 2:索引

給定 nums = [0,1,2,2,3,0,4,2], val = 2,

函數應該返回新的長度 5, 而且 nums 中的前五個元素爲 0, 1, 3, 0, 4。

注意這五個元素可爲任意順序。

你不須要考慮數組中超出新長度後面的元素。

說明:ip

爲何返回數值是整數,但輸出的答案是數組呢?

請注意,輸入數組是以**「引用」**方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。

你能夠想象內部操做以下:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums 是以「引用」方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeElement(nums, val);

// 在函數裏修改輸入數組對於調用者是可見的。
// 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的全部元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

解題思路:

​ 只容許原數組修改,能夠用雙指針,左指針 i 自左向右,右指針 j 從右向左。若是索引 i 和 val 相等,則索引 i 獲得索引 j 的值,而且 j 前移一位。若是不相等,i 後移一位。

​ 由於要求是返回修改後的長度並只考慮該長度的數組,那麼就不用考慮該長度以後的數組,因此只需獲得索引 j 的值,不用再把索引 j 的值改成索引 i的值。

Java:

class Solution {
    public int removeElement(int[] nums, int val) {
        int i=0,j=nums.length-1;//i-左指針;j-右指針
        while (i<=j){
            if(nums[i]==val){
                nums[i]=nums[j];//獲得索引j的值,無需把索引j的值改成索引i的值
                j--;
            }else i++;
        }
        return j+1;
    }
}

Python3:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i=0
        j=len(nums)-1
        while i<=j:
            if(nums[i]==val):
                nums[i]=nums[j]
                j-=1
            else:i+=1
        return j+1

總結:

​ 這道題自己很簡單,只要搞清思路,一塊兒都會變得明瞭。

相關文章
相關標籤/搜索