python實現 判斷回文字串 回文鍊錶 回文數

2021-10-14 03:10:38 字數 4406 閱讀 9026

所謂回文字串,就是正讀和反讀都一樣的字串,比如「level」或者「noon」等等就是回文串。即是對稱結構

判斷回文字串

方法一:

def

is_palindrome

(s):

return

true

if s == s[::

-1]else

false

方法二:

def

is_palindrome

(s):

length =

len(s)

ifnot length:

# 空字串

return

true

mid_index = length //

2# 如果s長度為奇數則是中點,偶數則是後面那個中點

index =

0 status =

true

while index < mid_index:

if s[index]

== s[length -

1- index]

: index +=

1else

: status =

false

break

return status

判斷回文鍊錶

思路

注意事項:

快慢指標定位中點時要區分奇偶情況,奇數情況,中點位置不需要矯正,偶數情況,使用偶數定位中點策略,要確定是返回上中位數或下中位數

如果是返回上中位數,後半部分串頭取next,如果是返回下中位數,後半部分串頭既是當前節點位置,但前半部分串尾要刪除掉當前節點

**

'''

'''class

solution

(object):

defis_palindrome

(self, head: listnode)

->

bool

:if head is

none

:# 空

return

false

if head.

next

isnone

:# 1個節點

return

true

slow = fast = head

# 1. 定中點

while fast and fast.

next

: slow = slow.

next

fast = fast.

next

.next

# 快慢指標定位中點,此時fast已到達鏈尾,如果長度為奇數,則slow到達中心點,長度為偶數,則slow到達下中位點

# 2. 後半段倒置

pre =

none

# 倒置後的最後乙個節點必為none,以此確定第三步遍歷時的終點

cur = slow # 當前要倒置的第乙個節點

nxt = slow.

next

# 當前要倒置的節點的下乙個節點

while nxt:

# 只要沒有到達原鍊錶的終點就一直進行倒置

cur.

next

= pre # 將當前節點的下乙個節點指向"前"乙個節點,進行倒置

# 相鄰節點倒置完成後,向後整體偏移1個單位

pre = cur

cur = nxt

nxt = cur.

next

# 當前cur是最後乙個節點,需要和它前面的節點進行最後一次倒置,來完成整個後半段倒置

cur.

next

= pre

# 3. cur就是倒置完成後的後半段的頭節點,同時遍歷cur和head,如果遍歷完cur未出現不同的節點,則為回文鍊錶

while cur.

next

:if cur.val != head.val:

return

false

cur = cur.

next

head = head.

next

# 此時cur為後半段的最後乙個節點,還需要判斷此時的cur和head的值是否相同

return cur.val == head.val

測試

# head =none

head = listnode(1)

head.

next

= listnode(2)

head.

next

.next

= listnode(1)

print

(solution(

).is_palindrome(head)

)

判斷回文數

思路

映入腦海的第乙個想法是將數字轉換為字串,並檢查字串是否為回文。但是,這需要額外的非常量空間來建立問題描述中所不允許的字串。

第二個想法是將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是回文。 但是,如果反轉後的數字大於 int.max,我們將遇到整數溢位問題。

按照第二個想法,為了避免數字反轉可能導致的溢位問題,為什麼不考慮只反轉int 數字的一半?畢竟,如果該數字是回文,其後半部分反轉後應該與原始數字的前半部分相同。

例如,輸入 1221,我們可以將數字「1221」的後半部分從「21」反轉為「12」,並將其與前半部分「12」進行比較,因為二者相同,我們得知數字 1221 是回文。

讓我們看看如何將這個想法轉化為乙個演算法。

演算法

首先,我們應該處理一些臨界情況。所有負數都不可能是回文,例如:-123 不是回文,因為 - 不等於 3。所以我們可以對所有負數返回 false。

現在,讓我們來考慮如何反轉後半部分的數字。 對於數字 1221,如果執行 1221 % 10,我們將得到最後一位數字 1,要得到倒數第二位數字,我們可以先通過除以 10 把最後一位數字從 1221 中移除,1221 / 10 = 122,再求出上一步結果除以10的餘數,122 % 10 = 2,就可以得到倒數第二位數字。如果我們把最後一位數字乘以10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉後的數字。 如果繼續這個過程,我們將得到更多位數的反轉數字。

現在的問題是,我們如何知道反轉數字的位數已經達到原始數字位數的一半?

我們將原始數字除以 10,然後給反轉後的數字乘上 10,所以,當原始數字小於反轉後的數字時,就意味著我們已經處理了一半位數的數字。

**

class

solution

(object):

defis_palindrome

(self, num:

int)

->

bool

:# 當 x < 0 時,x 不是回文數

# 如果數字的最後一位是 0,為了使該數字為回文,則其第一位數字也應該是 0

# 只有 0 滿足這一屬性

if num <0or

(num %

10==

0and num !=0)

:return

false

reverted_num =

0while num > reverted_num:

reverted_num = reverted_num *

10+ num %

10 num /=

10# 當數字長度為奇數時,我們可以通過 revertednumber / 10 去除處於中位的數字。

# 例如,當輸入為12321時,在 while 迴圈的末尾我們可以得到 x = 12,revertednumber = 123,

# 由於處於中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除。

return num == reverted_num or num == reverted_num /

10# 測試

print

(solution(

).is_palindrome(0)

)print

(solution(

).is_palindrome(10)

)print

(solution(

).is_palindrome(

101)

)

回文字串判斷 遞迴實現

所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的。比如 level aaabbaaa 題目 判斷乙個字串是否為回文 解法 遞迴 遞迴的作用在於把問題的規模不斷縮少,直到問題縮少到能簡單地解決 問 如何縮少問題規模?答 通過觀察可以知道,乙個回文字串其中內部也是回文。所以,我們只需要以去...

python回文字串程式設計 P086 回文字串

所屬年份 2012.3 請編寫函式fun,該函式的功能是 判斷字串是否為回文,若是,則函式返回1,主函式中輸出 yes 否則返回0,主函式中輸出 no 回文是指順讀和倒讀都一樣的字串。例如,字串level是回文,而字串123312就不是回文。include define n 80 int fun c...

python 實戰38 回文字串

題目內容 給定乙個字串,判斷它是否是回文字串 即類似於peep,12321這樣的對稱字串 如果是輸出true,不是則輸出false。判斷過程中假定只考慮字母和數字字元,而且忽略字母的大小寫和其它符號 如空格 標點符號等 輸入格式 共一行,為乙個字串。輸出格式 共一行,為true或false。輸入樣例...