LeetCode 題庫練習 2

2022-02-28 11:08:09 字數 2641 閱讀 2964

題目:

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

題目中給出了鍊錶的定義,鍊錶有兩個成員,乙個 val 表示當前節點所儲存的值,next 表示指向的下乙個節點,顯然,當 next 為none時,說明鍊錶結束:

# definition for singly-linked list.

class listnode:

def __init__(self, x):

self.val = x

self.next = none

解法1:為了得到兩個數的和,可以先將兩個鍊錶表示的數字計算出來,得到和後再以鍊錶的形式返回。

解法2:每個鍊錶的節點都是從低位到高位的,直接將對應節點位置的兩數相加,存放到和的鍊錶中,若出現進製,則置進製標誌位為 1,當其中乙個鍊錶沒有更多的節點時,用 0 表示,最後以鍊錶的形式返回和。

我採用的是第 2 種方法:

nodestart = listnode(0)

result = nodestart

l1start = listnode(0)

l1start.next = l1

l2start = listnode(0)

l2start.next = l2

nextlevelup = false # carry flag

首先構造了nodestart = listnode(0)準備存放第乙個數,將結果 result 指向該節點,然後分別構造l1startl2start,分別指向傳入的兩個鍊錶(這裡的構造形式和後面的迴圈有關)。接著對每一位進行相加:

num1 = l1start.val if l1start is not none else 0

num2 = l2start.val if l2start is not none else 0

if nextlevelup:

num1 += 1

nextlevelup = false

num1 += num2

if num1 > 9:

nextlevelup = true

num1 -= 10

result.next = listnode(num1)

result = result.next

取出加數和被加數相應節點的數,分別設為 num1 和 num2,若上一次相加時,有進製發生,加將 num1 加 1,並加 num1 和 num2 相加,和儲存在 num1 中,若 num1 > 9,說明發生了進製,需要進行進製的處理。最後用 num1 構造乙個新的節點,移動 result 指標指向該節點。

這裡的**是在迴圈中執行的,當兩個鍊錶指標 l1start 和 l2start 的 next 都為 none 時,迴圈結束。

解題完整**:github 僅供參考。

上面的解題過程可以進一步優化,我們已經用 num1 來儲存最後的和了,可以再將 l1start 節點中的值修改成最後得到的 num1,這樣可以避免建立過多的新節點,減少記憶體使用。

鍊錶 listnode 中的每乙個節點實際上表示的是數字的每一位,根據加法的運算規則,對兩個鍊錶的每一位相加即可得到最終的和。

想象:對於每一位的加法來說,實際上可以同時計算幾個位數的加法,比如同時進行 4 對節點的相加,例如:1535 + 1329,若平行計算 4 位的加法,得到每一位上的和分別為 2 8 5 4,但最後一位出現進製,導致結果更新為 2864,或者 1545 + 1491,平行計算,得每一位上的和為 2 9 3 6,第 3 位出現進製,導致第 2 位進製,最終導致第 1 位進製,結果更新為 3036。用這樣的原理是不是就可以實現硬體級別的加速呢?

在 leetcode 題庫中的第 9 題,判斷乙個數字是否是回文數。在不將整數轉為字串的前提下,可以用上面的思想來進行解題。

方法:構造乙個陣列,陣列從 0 開始,儲存數字的低位到高位:

xlist = 

while x > 0:

x, tmp = divmod(x, 10)

如 13432,在陣列中就是 [1, 3, 4, 3, 2],然後判斷第 i 位,與第 xlistlen - 1 - i 位是否相等,若對於所有的 i 都相等,則該數字是回文數,否則就不是回文數。

xlen = len(xlist)

for i in range(xlen // 2):

if xlist[i] != xlist[xlen - 1 - i]:

return false

return true

事實上,構造陣列的那部分**就和將整數轉換為字串是一樣的效果,不過這裡是用求餘的方法得到各個位數上的數的。

LeetCode題庫練習之無重複字元的最長子串

參考自 題目描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。解題思路 運用滑動視窗的思想,從字串第乙個位置開始遍歷,當出現重複字元時,移除最左邊的字元。直至沒有重複的字元時停止。class solution lookup.insert s i maxstr max maxstr,...

Python 題庫練習七

what gets printed?nums set 1,1,2,3,3,3,4 print len nums 題目解析 這題考察set方法的特性 在jupter notebook中敲入相應 執行,看結果 nums set 1 1,2 3,3 3,4 print len nums 執行結果 4set...

leetcode題庫 回文數

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。輸入 121 輸出 true輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。輸入 10 輸出 false 解釋 從右向左讀,為 01 因此它不是乙個回文...