937 重新排列日誌檔案(字串專題)

2021-10-04 04:47:31 字數 3986 閱讀 6724

字串是乙個由unicode字元構成的陣列,因此它和陣列是比較相似的。可以執行幾乎所有在陣列中使用的操作。string作為最常見的程式語言型別之一,也是演算法面試的考察重點之一。

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

思路:雙指標

1.兩個指標起始位置為兩個字串的末尾;

2.兩個指標的值相加,存入到新字串,同時向左移動兩個指標;

注意

1.兩個字串長度不同時,較短字串左端用0補位

2.結果是否還需進製

class

solution

(object):

defaddstrings

(self, num1, num2)

:"""

:type num1: str

:type num2: str

:rtype: str

"""res =

""#cnt表示進製符

i, j, cnt =

len(num1)-1

,len

(num2)-1

,0while i >=

0or j >=0:

#若當前字串掃瞄完畢,用0補位

a =int(num1[i]

)if i >=

0else

0 b =

int(num2[j]

)if j >=

0else

0 t = a + b + cnt

cnt =

1if t >

9else

0 res =

str(t %10)

+ res

i -=

1 j -=

1#通過cnt決定是否還需在左端加「1」

return

"1"+ res if cnt else res

題目:給定乙個非空字串s,最多刪除乙個字元。判斷是否能成為回文字串。

思路:雙指標

1.雙指標分別指向左、右端點;

2.若兩指標指向字元相等,此時是否滿足題意取決於剩餘字串;(i++,j--)。

3.若兩指標指向字元不等,此時只有兩種情況其中一種成立,返回true;

(1)去掉左指標指向的字元,剩餘部分是乙個回文字串。

(2)去掉右指標指向的字元,剩餘部分是乙個回文字串。

class

solution

(object):

defvalidpalindrome

(self, s)

:"""

:type s: str

:rtype: bool

"""#若s是回文串,返回true

if s == s[::

-1]:

return

true

i, j =0,

len(s)-1

while i <= j:

if s[i]

!= s[j]

:#a為刪掉第i個字元的剩餘字串

a = s[

:i]+ s[i+1:

]if a == a[::

-1]:

return

true

#b為刪掉第j個字元的剩餘字串

b = s[

:j]+ s[j+1:

]if b == b[::

-1]:

return

true

return

false

i +=

1 j -=

1

題目:給定乙個段落(paragraph)和乙個禁用單詞列表(banned)。返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。

禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。

思路:其實考察的是對字串的一些基本操作。

1. 將給定的paragraph切分,並且得到每個單詞的小寫形式。

2. 統計不在banned中的單詞的出現次數,返回出現次數最多的乙個。

split()方法:

1.語法:str.split(str = " ", num = string.count(str))

2.引數:str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、製表符(\t)等。

num -- 分割次數,預設為-1,即分隔所有。

class

solution

(object):

defmostcommonword

(self, paragraph, banned)

:"""

:type paragraph: str

:type banned: list[str]

:rtype: str

"""ban =

set(banned)

#將字串中的符號替換成空格

for c in

"?!,.;'"

: paragraph = paragraph.replace(c,

' ')

#將字串中字母小寫,且按空格切割

paragraph = paragraph.lower(

).split(

) dic =

max_n =

0 res =

""for i in paragraph:

if i not

in ban:

if i not

in dic:

dic[i]=1

else

: dic[i]+=1

if dic[i]

> max_n:

max_n = dic[i]

res = i

return res

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

對於每條日誌,其第乙個字為字母數字識別符號。然後,要麼:

我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識別符號後面至少有乙個字。

將日誌重新排序,使得所有字母日誌都排在數字日誌之前。字母日誌按內容字母順序排序,忽略識別符號;在內容相同時,按識別符號排序。數字日誌應該按原來的順序排列。

返回日誌的最終順序。

思路:利用sorted的自定義排序

sorted函式:對所有可迭代的物件進行排序操作

sort與sorted的區別:

class

solution

(object):

defreorderlogfiles

(self, logs)

:"""

:type logs: list[str]

:rtype: list[str]

"""#自定義排序函式

defn_f

(log)

:#將log按空格分隔為兩部分,第一部分為識別符號,第二部分為日誌內容

id_, r_log = log.split(

' ',1)

if r_log[0]

.isalpha():

#若是字母,則排序的順序是日誌內容-識別符號

return(0

, r_log, id_)

return(1

,0,0

)return

sorted

(logs, key= n_f)

937 重新排列日誌檔案

weekly contest 110的第一題 重新排列日誌檔案 你有乙個日誌陣列logs。每條日誌都是以空格分隔的字串。對於每條日誌,其第乙個字為字母數字識別符號。然後,要麼 我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識別符號後面至少有乙個字。將日誌重新排序,使得所有字母日誌都排在...

937 重新排列日誌檔案

題目描述 你有乙個日誌陣列 logs。每條日誌都是以空格分隔的字串。對於每條日誌,其第乙個字為字母與數字混合的 識別符號 除識別符號之外的所有字為這一條日誌的 內容 除識別符號之外,所有字均由小寫字母組成的,稱為 字母日誌 除識別符號之外,所有字均由數字組成的,稱為 數字日誌 題目所用資料保證每個日...

Leetcode 937 重新排列日誌檔案

你有乙個日誌陣列logs。每條日誌都是以空格分隔的字串。對於每條日誌,其第乙個字為字母數字識別符號。然後,要麼 我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識別符號後面至少有乙個字。將日誌重新排序,使得所有字母日誌都排在數字日誌之前。字母日誌按字母順序排序,忽略識別符號,識別符號僅用...