演算法刷題 筆記(Day2)

2021-10-23 21:16:10 字數 4347 閱讀 2861

題目描述:

判斷乙個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

解題思路(一):

1.回文數的先決條件x>0.

2.利用序列型別資料的性質,先轉字串再進行切片翻轉str[::-1].

題解**:

class

solution

:def

ispalindrome

(self, x:

int)

->

bool

:if x<0:

return

false

st =

str(x)

return st[::

]== st[::-1]

解題思路(二):

1.該方法中我們選擇將整個數字進行數學方法的翻轉,通過取整和取餘操作獲取整數中對應的數字進行比較。

需要注意的點是,在python中///的區別:

>>

>

print

("2/2 =",2

/2,"2//2 =",2

//2)2

/2=1.02//

2=1>>

>a,b =2/

2,2//

2>>

>

print

(type

(a),

type

(b))

<

class

'float'

>

<

class

'int'

>

題解**(方法二):

class

solution

:def

ispalindrome

(self, x:

int)

->

bool

: res=

0 tem=x

while tem>0:

res = res*

10+tem%

10 tem = tem//

10return res == x

題目描述:

給定乙個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。給出數字到字母的對映如下(與**按鍵相同)。注意 1 不對應任何字母。

解題思路:

1.根據題意數字到字母的對映,優先考慮字典儲存對映關係:

digi_match_alpha =

2.字母組合(排列組合),遞迴或者回溯,將每個數字看作一層,逐層遍歷數字對應的字母。當然還有其他方法。

回溯法-題解**:

class

solution

:def

lettercombinations

(self, digits:

str)

-> list[

str]

: res =

iflen

(digits)==0

:return res

digi_match_alpha =

defbacktrack

(strr,index)

:##回溯的終止條件

if index >

len(digits)-1

:return

digit = digits[index]

##當前的數字

alphas = digi_match_alpha[digit]

##當前數字對應的字母

for i in alphas:

backtrack(strr+i,index+1)

backtrack("",

0)return res

遞迴-題解**:

class

solution

:def

lettercombinations

(self, digits:

str)

-> list[

str]

: res =

iflen

(digits)==0

:return res

digi_match_alpha =

deffindalpha

(digits,index,s)

:##遞迴的終止條件

if index==

len(digits)

:return

digit = digits[index]

##當前的數字

alphas = digi_match_alpha[digit]

##當前數字對應的字母

for i in alphas:

findalpha(digits,index+

1,s+i)

findalpha(digits,0,

"")return res

題目描述:

給定乙個機票的字串二維陣列 [from, to],子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從 jfk(甘迺迪國際機場)出發的先生,所以該行程必須從 jfk 開始。

解題思路:

1.利用python的內建模組collectionsdefaultdict,構建鄰接表,將所有路徑存進鄰接表中。

d = collections.defaultdict(

list

)#鄰接表

for f, t in tickets:

d[f]

#路徑存進鄰接表

#或d[f] += [t]

2.對鄰接表進行排序(即自然排序),最後利用深搜進行路徑檢索,將路徑存放在乙個列表中。

for f in d:

d[f]

.sort(

)#鄰接表排序

ans =

defdfs

(f):

#深搜函式

while d[f]

: dfs(d[f]

.pop(0)

)#路徑檢索

ans.insert(

0, f)

#放在最前

題解**:

class

solution

:def

finditinerary

(self, tickets: list[list[

str]])

-> list[

str]

: d = collections.defaultdict(

list

)#鄰接表

for f, t in tickets:

d[f]

#路徑存進鄰接表

#或d[f] += [t]

for f in d:

d[f]

.sort(

)#鄰接表排序

ans =

defdfs

(f):

#深搜函式

while d[f]

: dfs(d[f]

.pop(0)

)#路徑檢索

ans.insert(

0, f)

#放在最前

dfs(

'jfk'

)return ans

知識點整理:

for f, t in tickets:

d[f]

# 路徑存進鄰接表d[f] += [t] type(t) ==

print

(d)

output:

defaultdict(

<

class

'list'

>

,)

Leetcode刷題之旅(Day2)

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

《演算法筆記》Day 2

全排列問題 include const int maxn 11 int n,p maxn hashtable maxn void generatep int index printf n return for int x 1 x n x int main void 推演 hashtable fals...

演算法與資料結構 刷題日記day2

拓撲序列,參考 拓撲序列 一棵二叉樹共有 25 個結點,其中 5 個是葉子結點,則度為 1 的結點數為?在任意一棵二叉樹中,度為 0 的葉子結點總是比度為 2 的結點多乙個。證明 一棵樹的節點數n 度為0的節點數n 0 度為1的節點數n 1 度為2的節點數n 2,即 n n 0 n1 n 2n n ...