字串是乙個由unicode字元構成的陣列,因此它和陣列是比較相似的。可以執行幾乎所有在陣列中使用的操作。string作為最常見的程式語言型別之一,也是演算法面試的考察重點之一。
題目:給定兩個字串形式的非負整數num1和num2,計算它們的和。
思路:雙指標
注意:1.兩個指標起始位置為兩個字串的末尾;
2.兩個指標的值相加,存入到新字串,同時向左移動兩個指標;
1.兩個字串長度不同時,較短字串左端用0補位
2.結果是否還需進製
題目:給定乙個非空字串s,最多刪除乙個字元。判斷是否能成為回文字串。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
思路:雙指標
1.雙指標分別指向左、右端點;
2.若兩指標指向字元相等,此時是否滿足題意取決於剩餘字串;(i++,j--)。
3.若兩指標指向字元不等,此時只有兩種情況其中一種成立,返回true;
(1)去掉左指標指向的字元,剩餘部分是乙個回文字串。
(2)去掉右指標指向的字元,剩餘部分是乙個回文字串。
題目:給定乙個段落(paragraph)和乙個禁用單詞列表(banned)。返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。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
禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。
思路:其實考察的是對字串的一些基本操作。
split()方法:1. 將給定的paragraph切分,並且得到每個單詞的小寫形式。
2. 統計不在banned中的單詞的出現次數,返回出現次數最多的乙個。
1.語法:str.split(str = " ", num = string.count(str))
2.引數:str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、製表符(\t)等。
num -- 分割次數,預設為-1,即分隔所有。
題目:你有乙個日誌陣列logs。每條日誌都是以空格分隔的字串。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
對於每條日誌,其第乙個字為字母數字識別符號。然後,要麼:
我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識別符號後面至少有乙個字。
將日誌重新排序,使得所有字母日誌都排在數字日誌之前。字母日誌按內容字母順序排序,忽略識別符號;在內容相同時,按識別符號排序。數字日誌應該按原來的順序排列。
返回日誌的最終順序。
思路:利用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。每條日誌都是以空格分隔的字串。對於每條日誌,其第乙個字為字母數字識別符號。然後,要麼 我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識別符號後面至少有乙個字。將日誌重新排序,使得所有字母日誌都排在數字日誌之前。字母日誌按字母順序排序,忽略識別符號,識別符號僅用...