iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

leetcode 30天 不中斷解題挑戰系列 第 6

Day6 leetcode 隨機挑題 (前綴和、字串處理)

  • 分享至 

  • xImage
  •  

首先是 1480. Running Sum of 1d Array (easy)
https://leetcode.com/problems/running-sum-of-1d-array/

他會給予一個串列nums,計算出前綴和~
恩恩,標準練手用的基礎題目。

想法上就很簡單

  1. 製造一空串列ans,並儲存nums裡的第一個值
  2. 從索引值1開始迭代nums,加上ans裡的最後一個值,append到ans裡
    所以變成以下這個東西
class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        ans = [nums[0]]
        c = 0
        for i in nums[1:]:
            ans.append(ans[c]+i)
            c+=1
        return ans

但後來思考一下,其實不需要這麼麻煩,可以直接家回原串列就好,因此就改成下面這樣

class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        for i in range(1,len(nums)):
            nums[i] += nums[i-1]
        return nums

下一題 724. Find Pivot Index (easy)
https://leetcode.com/problems/find-pivot-index

這題也是在講前綴和,不過相較而言比較難了。
題目會給一個串列nums,要從nums裡面找到一個索引值,能夠讓串列左邊和與串列右邊和相等(不含該索引值的值)。
想法:

  1. 先算出前綴和,並列成一串列prefix,前面補0(因可能有右邊和為0的可能性)
  2. 迭代prefix,如果目前位置(i)的值等於最後一個值扣掉下一個值(i+1),那i即為答案(因為前面有補0了)
  3. 但由於有可能左邊和為0的狀況,所以需要多加一個if判斷
  4. 都不是就是-1
class Solution:
    #直接做出前綴和,然後慢慢比較
    def pivotIndex(self, prefix: List[int]) -> int:
        for i in range(1,len(prefix)):
            prefix[i] += prefix[i-1]
        prefix = [0] + prefix
        for i in range(len(prefix)-1):
            if prefix[i]  == prefix[-1] - prefix[i+1]:
                return i
        if prefix[-2] == 0:
            return len(prefix)
        return -1

寫完這個之後,我就想試著寫個白癡方法,但沒意外TLE

class Solution:
    #白癡寫法,TLE
    def pivotIndex(self, nums: List[int]) -> int:
        numsL = len(nums)
        L,R = 0,0
        for i in range(numsL):
            L = sum(nums[:i])
            R = 0 if i+1 == numsL else sum(nums[i+1:])
            if L == R:
                return i
        return -1

不過也因此想到一個應該是更快的方法,可以少迭代一次
直接算出總和,慢慢用扣的就可以得到答案了。

class Solution:
    #但老實說,可以只做一層for迴圈即可
    def pivotIndex(self, nums: List[int]) -> int:
        L,R = 0, sum(nums)
        for i in range(len(nums)):
            R -= nums[i]
            if L == R:
                return i
            L += nums[i]
        return -1

下一題 205. Isomorphic Strings (easy)
https://leetcode.com/problems/isomorphic-strings/

這題個人覺得有點小麻煩。
簡單來說有兩個字串s跟t,是否有辦法用相同的規律將s裡的字母替換成t(例如:egg可以換成add)。

那我看到的第一個反應就是用dict解決吧

  1. 首先比較s與t的長度,不相同可以直接return 0
  2. 迭代s與t,s的字母當key,t的字母當val
  3. 迭代的過程中進行比較,若從dict裡讀取的值與t字母不一樣,就return 0
  4. 最後要檢查val裡的東西是否有重複的
class Solution:
    #利用dict的特性s的值當key,t的值當val
    #最後要檢查一次val裡的值有沒有重複的
    def isIsomorphic(self, s: str, t: str) -> bool:
        a = {}
        if len(s) != len(t):
            return 0
        for i in range(len(s)):
            if s[i] not in a:
                a[s[i]] = t[i]
            else:
                if a[s[i]] != t[i]:
                    return 0
        if len(set(a.values())) != len(a):
            return 0
        return 1

下一題 392. Is Subsequence (easy)
https://leetcode.com/problems/is-subsequence

給予兩個字串s,t,s是否為t的子序列(順序一樣即可)
想法,由於順序要一樣,因此比較過的字母的前面就不需要做比較:
我一開始想複雜了,也有可能是半夜想睡覺了,寫出這個鬼東西

class Solution:
    #題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
    #一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
    def isSubsequence(self, s: str, t: str) -> bool:
        s,t = list(s),list(t)
        index = 0
        for i in range(len(s)):
            if s[i] in t[index:]:
                temp = t[index:].index(s[i])
            else:
                return 0
            # print(temp)
            index += temp
            t[index] = 0
        return 1

但老實說越看越不對勁,為什麼,我不直接切掉就好....因此稍微改了一下。

class Solution:
    #題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
    #一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
    #正常寫法
    def isSubsequence(self, s: str, t: str) -> bool:
        for i in s:
            temp = t.find(i)
            if temp != -1:
                t = t[temp+1:]
            else:
                return 0
        return 1

簡潔滿多的,但後來稍微看了一下其他人的寫法,看到以下寫法。

class Solution:
    #題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
    #一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
    #指標
    def isSubsequence(self, s: str, t: str) -> bool:
        sL,j = len(s),0
        for i in range(len(t)):
            if j<sL and t[i]==s[j]:
                i+=1
                j+=1
        return j==sL

直接利用兩個變數去進行對齊的動作即可,相較而言速度快了許多,畢竟原方法還要切來切去根本浪費效能。

以上就是這次練習到的題目,多謝指教


上一篇
Day5 leetcode隨機選題 (字串處理、矩陣、BST)
下一篇
Day7 leetcode 隨機挑題 (鏈結串列、Simulation)
系列文
leetcode 30天 不中斷解題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言