字串打卡[1]

小齊今天進步了嘛~發表於2020-11-23

551. 學生出勤記錄. I

給定一個字串來代表一個學生的出勤記錄,這個記錄僅包含以下三個字元:

‘A’ : Absent,缺勤 ‘L’ : Late,遲到 ‘P’ : Present,到場
如果一個學生的出勤記錄中不超過一個’A’(缺勤)並且不超過兩個連續的’L’(遲到),那麼這個學生會被獎賞。

你需要根據這個學生的出勤記錄判斷他是否會被獎賞。

示例 1:

輸入: “PPALLP” 輸出: True

class Solution:
    def checkRecord(self, s: str) -> bool:
        anum = 0
        flag = 0
        for i in s:
            if i != 'L':
                flag = 0
                if i == 'A':
                    anum += 1
            else:
                if flag>>1:
                    return False
                flag += 1
            if anum>>1:
                return False
        return True
  • 單純匹配規則
  • 小錯誤: 最後一個anum的判斷應該放在最後或者判斷A的部分,而不是最前。如果放在最前,那麼類似‘‘AA’’這樣的字串就會判斷錯誤。

344. 反轉字串

編寫一個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 char[] 的形式給出。

不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列、使用 O(1) 的額外空間解決這一問題。

你可以假設陣列中的所有字元都是 ASCII 碼錶中的可列印字元。

示例 1:

輸入:[“h”,“e”,“l”,“l”,“o”] 輸出:[“o”,“l”,“l”,“e”,“h”]

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(len(s)>>1):
            s[i], s[n-i-1] = s[n-i-1], s[i]
  • 最簡單的思路,對稱交換

937. 重新排列日誌檔案

你有一個日誌陣列 logs。每條日誌都是以空格分隔的字串。

對於每條日誌,其第一個字為字母與數字混合的 識別符號 ,除識別符號之外的所有字為這一條日誌的 內容 。

除識別符號之外,所有字均由小寫字母組成的,稱為 字母日誌 除識別符號之外,所有字均由數字組成的,稱為 數字日誌
題目所用資料保證每個日誌在其識別符號後面至少有一個字。

請按下述規則將日誌重新排序:

所有 字母日誌 都排在 數字日誌 之前。 字母日誌 在內容不同時,忽略識別符號後,按內容字母順序排序;在內容相同時,按識別符號排序; 數字日誌
應該按原來的順序排列。 返回日誌的最終順序。

示例 :

輸入:[“a1 9 2 3 1”,“g1 act car”,“zo4 4 7”,“ab1 off key dog”,“a8 act
zoo”] 輸出:[“g1 act car”,“a8 act zoo”,“ab1 off key dog”,“a1 9 2 3
1”,“zo4 4 7”]

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        def rt(log):
            id_, content = log.split(' ', 1)
            return (0, content, id_) if content[0].isalpha() else (1,)
        return sorted(logs, key = rt)
  • 主要是學習python內建函式sorted,sort跟sorted的區別是sorted是返回值,不改變原來的list,sort是直接改。
  • 同時複習了深淺拷貝
  • 直接賦值:拷貝的是物件
# 直接賦值
a = [5]
b = a
a.append(3)
>>> b:[5,3]
# 深淺拷貝
import copy
# 淺拷貝
a = [1,2,[1,2,3]]
b = copy.copy(a)
# or
b = a.copy()
a.append(3)
>>> a: [1,2,[1,2,3],3]
>>> b: [1,2,[1,2,3]]
a[2].append(3)
>>> a: [1,2,[1,2,3,3],3]
>>> b: [1,2,[1,2,3,3]]
# 深拷貝
a = [1,2,[1,2,3]]
b = copy.deepcopy(a)
a.append(3)
a[2].append(3)
>>> a: [1,2,[1,2,3,3],3]
>>> b: [1,2,[1,2,3]]

824. 山羊拉丁文

給定一個由空格分割單詞的句子 S。每個單詞只包含大寫或小寫字母。

我們要將句子轉換為 “Goat Latin”(一種類似於 豬拉丁文 - Pig Latin 的虛構語言)。

山羊拉丁文的規則如下:

如果單詞以母音開頭(a, e, i, o, u),在單詞後新增"ma"。 例如,單詞"apple"變為"applema"。

如果單詞以子音字母開頭(即非母音字母),移除第一個字元並將它放到末尾,之後再新增"ma"。 例如,單詞"goat"變為"oatgma"。

根據單詞在句子中的索引,在單詞最後新增與索引相同數量的字母’a’,索引從1開始。
例如,在第一個單詞後新增"a",在第二個單詞後新增"aa",以此類推。 返回將 S 轉換為山羊拉丁文後的句子。

示例 1:

輸入: “I speak Goat Latin” 輸出: “Imaa peaksmaaa oatGmaaaa atinLmaaaaa”

class Solution:
    def toGoatLatin(self, S: str) -> str:
        slist = S.split(' ')
        for i in range(len(slist)):
            if slist[i][0].lower() in ['a','e','i','o','u']:
                slist[i] += 'ma'+'a'*(i+1)
            else:
                slist[i] = slist[i][1:]+slist[i][0]+'ma'+'a'*(i+1)
        return ' '.join(slist)
  • 就根據規則來。

415. 字串相加

給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和。

提示:

num1 和num2 的長度都小於 5100 num1 和num2 都只包含數字 0-9 num1 和num2 都不包含任何前導零
你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字串轉換為整數形式

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        list1 = list(num1)[::-1]
        list2 = list(num2)[::-1]
        if len(list1) < len(list2):
            list1,list2 = list2,list1
        n1 = len(list1)
        n2 = len(list2)
        tof = 0
        listsum = []
        for i in range(n2):
            tsum = int(list1[i])+int(list2[i])+tof
            listsum.append(str(tsum%10))
            tof = tsum//10
            #print(listsum)
        if n1-n2:
            for i in range(n2,n1):
                tsum = int(list1[i])+tof
                listsum.append(str(tsum%10))
                tof = tsum//10
        if tof:
            listsum.append('1')
            #print(listsum)
        return ''.join(listsum[::-1])
  • 先是想去獲得最長的list,然後把剩餘部分直接接到新的list裡面,即listsum,但是這樣會忽略掉進位,比如一個99999+9,前面就是一直要進位的,所以要注意。
  • 然後是想要去在range的時候從後往前加,但是有點問題。