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


話說之前換工作的時候,我經歷了一次美團的視頻面試。

不像騰訊面試有自家軟件,美團面試是在第三方網頁上進行的,長這樣:

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

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

默默祈禱不要考算法。

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

題目:

給定兩個字符串形式的非負整數 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

參考資料:力扣 415. 字符串相加

最后的最后,希望大家都能找到滿意的工作,拿到超高的薪資。我也會繼續向大廠努力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM