我倒在了美團面試演算法題 字串大數相加

2021-10-10 09:49:10 字數 1832 閱讀 6145

看見中間的**編輯區,我笑了,難道?真的?演算法?

我的演算法,有點差呀。而且沒怎麼刷過題。

默默祈禱不要考演算法。

可就在我以為面試要結束的時候,該來的還是來了。

題目:

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

注意,不能把 string 轉換為 int 後直接相加。

面試官笑了,我也笑了,好,我寫一下。

我隱約記得是模擬人工手算:

一位一位來加,有進製就在左邊那位加個 1。

因為沒有刷過題,只能按我自己的思路去寫,越寫越亂,最後還是沒能寫出來。

面完後,我不禁陷入了沉思。

測試需要學演算法?部分需要。

哪些需要?大廠、高階職位、測試開發。

怎麼練?刷題。

**刷?力扣。

對這個演算法,首先要考慮的是,怎麼來遍歷這 2 個數,可以用 2 個指標,分別指向這 2 個數的尾部,邊計算邊向左移動。

數的長度可能會不一樣,短的那個數的指標就會先到達最左邊的頭部,為了能夠繼續計算,可以給缺失的位補 0。

加數長度不一致的問題就解決了。

指標的數相加後,可以通過除以 10 的餘數,來算出當前位的結果。

進製,則可以通過對 10 的整除數,來算。

例如:

指標指向的 2 個數是 5 和 6。

5 + 6 = 11,用 tmp 變數來存,tmp = n1 + n2 + carry,因為有可能右邊有進製,需要加上。

11 對 10 的整除數是 1,用 carry 來存進製。

11 除以 10 的餘數是 1,用 res 來存結果,需要在 res 最左邊新增 "1",把 「9084」 變為 「19084」。

最後分析**:

class solution:

# 加法函式,入參num1和num2,返回計算結果,str型別

def addstrings(self, num1: str, num2: str) -> str:

res = ""

# 定義i,j兩個指標,分別指向兩個數的尾部

# 定義進製,預設0

i, j, carry = len(num1) - 1, len(num2) - 1, 0

# 迴圈,直到2個指標都到達頭部

while i >= 0 or j >= 0:

# 如果沒有到達頭部,就通過-'0'轉為int

# 如果到達頭部了,就補0

n1 = num1[i] - '0' if i >= 0 else 0

n2 = num2[j] - '0' if j >= 0 else 0

# n1 + n2 + carry

tmp = n1 + n2 + carry

# 進製 = 對10的整除數

carry = tmp // 10

# 結果左邊新增除以10的餘數

res = str(tmp % 10) + res

# 每次計算後向左移動1位

i, j = i - 1, j - 1

# 2個指標都到達了頭部,如果還有進製,就在res左邊新增"1"

# 否則直接返回res

return "1" + res if carry else res

我倒在了美團面試演算法題 字串大數相加

看見中間的 編輯區,我笑了,難道?真的?演算法?我的演算法,有點差呀。而且沒怎麼刷過題。默默祈禱不要考演算法。可就在我以為面試要結束的時候,該來的還是來了。題目 給定兩個字串形式的非負整數 num1 和 num2,計算它們的和。注意,不能把 string 轉換為 int 後直接相加。面試官笑了,我也...

面試演算法 字串(二)

kmp演算法可以用來解決字串匹配問題。現在有兩個字串,str1長度為n和str2長度為m且n m,判斷是否存在str1中包含str2 也就是判斷str2是否是str1的子串 如果存在,則返回true,如果不存在則返回false。我們一般的思路是,從str1的第乙個字元開始,擷取和str2相同長度的子...

美團筆試題 字串的分割與排序

生活中經常有需要將多個字串進行排序的需要,比如將美團點評的部分業務名稱 外賣 打車 旅遊 麗人 美食 結婚 旅遊景點 教培 門票 酒店 用拼音表示之後按字母逆序排序。字母逆序指從z到a排序,比如對兩個字串排序時,先比較第乙個字母按字母逆序排z在a的前面,當第乙個字母一樣時再比較第二個字母按字母逆序排...