程式碼隨想錄演算法訓練營第八天 | 344.反轉字串 541.反轉字串Ⅱ 卡瑪網:54.替換數字

Y荷兰豆Y發表於2024-06-12

344.反轉字串

題目:編寫一個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 s 的形式給出。
不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列、使用 O(1) 的額外空間解決這一問題。

解題:

思路:雙指標,秒了

點選檢視程式碼
class Solution:
    def reverseString(self, s: List[str]) -> None:
        left=0
        right=len(s)-1
        while left<right:
            s[left],s[right]=s[right],s[left]
            left+=1
            right-=1

541.反轉字串Ⅱ

題目:給定一個字串 s 和一個整數 k,從字串開頭算起,每計數至 2k 個字元,就反轉這 2k 字元中的前 k 個字元。
如果剩餘字元少於 k 個,則將剩餘字元全部反轉。
如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。

解題:

思路:2k補償進行遍歷。
報錯:1.使用s = ''.join(s_list)而不是直接str();2.轉化為list應放在最前面,否則每次在迴圈中,你將字串 s 轉換為列表 s_list,這樣導致每次交換都是從原始字串開始,而不是從上一次交換的結果繼續;3.轉化為str放在所有交換結束後,否則你在每次交換時都將 res 重新分配,這會導致最終結果只包含最後一次處理的部分。

點選檢視程式碼
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        s_list=list(s)
        for i in range(0,len(s),2*k):
            left=i
            right=min(i+k-1,len(s)-1)
            while left<right:
                s_list[left],s_list[right]=s_list[right],s_list[left]
                left+=1
                right-=1
        res=''.join(s_list)
        return res

卡瑪網:54.替換數字

題目:給定一個字串 s,它包含小寫字母和數字字元,請編寫一個函式,將字串中的字母字元保持不變,而將每個數字字元替換為number。 例如,對於輸入字串 "a1b2c3",函式應該將其轉換為 "anumberbnumbercnumber"。

解題:

思路:很多陣列填充類的問題,其做法都是先預先給陣列擴容帶填充後的大小,然後在從後向前進行操作。
這麼做有兩個好處:1.不用申請新陣列;2.從後向前填充元素,避免了從前向後填充元素時,每次新增元素都要將新增元素之後的所有元素向後移動的問題。
實際上,python可以對列表化的字串進行直接替換!

點選檢視程式碼
s=input()
lst = list(s) # Python裡面的string也是不可改的,所以也是需要額外空間的。空間複雜度:O(n)。
for i in range(len(lst)):
    if lst[i].isdigit():
        lst[i] = "number"
print(''.join(lst))

心得:

列表變成一串字串'abc':''.join(s_list)
列表變成一個個字元'a','b','c':str(s_list)
字串變成列表'a','b','c':list(s_str)

相關文章