程式碼隨想錄移除元素二刷

Bathwind_W發表於2024-07-20

程式碼隨想錄移除元素二刷

leetcode 27

在這裡插入圖片描述

這道題思路的話可以這樣去理解,用兩個指標,一個慢指標,一個快指標。先讓快指標往前面去探路,也就是去遍歷陣列,遇到不為val的值再去把該值賦值給nums[slow],slow指標+1,遇到為val的值,nums[slow]不做任何操作,繼續移動fast指標。具體程式碼如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow,fast = 0,0
        lenth = len(nums) - 1
        while fast <= lenth:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

因為還要返回元素的個數,所以返回slow即可。如何不理解為啥返回slow的話找個例子代入一下就可以看出來,

leetcode26

在這裡插入圖片描述
這道題初步分析也是移除元素,但與上道題不一樣是移除陣列中重複的元素,也就是跟上面一題的目標值是不一樣的。但其實思路還是一樣的:
仍舊是雙指標。slow剛開始不動,fast往後遍歷,遇到相同的值就直接pass掉。fast繼續向後找。遇到跟slowB不同的。slow先加1,在把這個fast的值賦值給nums[slow],再根據新的這個nums[slow]去判斷。
具體程式碼如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        slow,fast = 0,0
        lenth = len(nums) - 1
        while fast <= lenth:
            if nums[fast] != nums[slow]:
                slow += 1
                nums[slow] = nums[fast]
            fast += 1
        return slow + 1

leetcode283

在這裡插入圖片描述
其實這個思路也是採用快慢指標,再來分析下這道題目,要把0都放到陣列末尾。也就是把非0的挪到前面。所以判斷條件就是快指標往前探路,slow指向陣列中非0元素位置的索引,fast往前探路,遇到0忽略,然後將fast指向位置的值賦值給slow位置。同時原來fast指向的位置賦值為0.
如果陣列不存在0的話,slow始終等於fast,此時也就不需要進一步處理陣列。
只要陣列存在0的話,fast就要比slow多走,多走的中間一定都是0。所以fast就一直遍歷,遇到非0的就交換,直到遍歷完陣列。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        slow,fast = 0,0
        lenth = len(nums)
        while fast < lenth:
            if nums[fast] != 0:
                if slow!=fast:
                    nums[slow],nums[fast] = nums[fast],0
                slow += 1
            fast += 1

leetcode844


這道題其實用堆疊的思想是更容易做出來的。遇到非#加入堆疊裡面,遇到#就彈出,但是此時彈出一定要檢查堆疊還有沒有元素,否則就會報錯。以這樣的方式處理完這兩個陣列後。在比較兩個陣列是否相等即可。具體程式如下:

class Solution:
    def backspaceCompare(self, s: str, t: str) -> bool:
        del_s = []
        del_t = []
        for i in range(len(s)): 
            if s[i]!= '#':
                del_s.append(s[i])
            elif del_s:
                del_s.pop()
        for i in range(len(t)):
            if t[i]!= '#':
                del_t.append(t[i])
            elif del_t:
                del_t.pop()
        if del_s == del_t:
            return True
        return False 

leetcode977

在這裡插入圖片描述
這道題如何用庫函式的話就一句話就完事,直接整個陣列平方後排序就行。但是一般面試還是最好不要用庫函式把。雙指標思路就是:比較left指向和right指向的值哪個大,就放入新的陣列裡面,但是要倒著放,這樣最後就不用再反轉一遍陣列了。具體程式碼如下:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left, right =0,len(nums)-1
        result = [0]*len(nums)
        lenth = len(nums) - 1
        while left <= right:
            if nums[left]**2 > nums[right]**2:
                result[lenth] = nums[left]**2
                left += 1
                lenth -= 1
            else:
                result[lenth] = nums[right]**2
                right -= 1
                lenth -= 1
        return result

相關文章