415.文字列加算(Python)

2663 ワード

タイトル
難易度:★☆☆☆タイプ:文字列
2つの文字列形式の非負の整数num 1とnum 2を与え、それらの和を計算する.
に注意
num 1とnum 2の長いはいずれも5100未満である.num 1とnum 2はいずれも数字0-9のみを含む.num 1およびnum 2には、プリアンブルゼロは含まれません.ビルドされたBigIntegerライブラリを使用することはできません.入力した文字列を直接整数に変換することはできません.
に答える
この問題は私たちに小学校で学んだ複数の数の加算演算を実現させ、「問題371.2の整数の和と類似」という2つの問題を完成させ、2進数と10進数を用いて加算計算を行う流れを学んだ.2つの複数の数の加算の流れを振り返ることができます.
  • 最低位から、2つの数の対応するビットの数字を加算し、10を超えると、より高い位に1つ進みます.
  • 2 2 2つの数字の長さが異なると、そのうちの1つの数字がいくつかの高い位置に欠けている場合があり、これらの欠落したビットをゼロと見なす必要があります.
  • は、長い数字の最上位まで計算され、キャリーを考慮する.

  • アルゴリズムでは、次のことに注意する必要があります.
    1.文字と数値の関係を処理します.数値の計算には、単一の文字を対応する数値に変換する必要があります.ここではasciiコード方式を使用して、任意の数値文字num_を計算します.charの方式は、ord(num_char)−ord('0')、例えば文字'0'に対応する数字がord('0')−ord('0')=0である.
    2.遍歴順序について.入力数字は文字列形式で与えられ、最下位から最上位に計算するには、入力文字列を逆順序に調整する必要があります(インデックス時に逆順序にインデックスすることもできますが、これは面倒です).
    3.ループの方法について.ループの制御条件は最低ビットから2つの数の中で長い文字列の長さに遍歴する必要があり、入力する2つの数字の長さが異なる場合を考慮する必要があるので、2つの数字の対応するビットを逆順に抽出する場合は、入力数字がこのビットに数値があるかどうかを考慮する必要があり、ここでは、下付きインデックスと抽出した文字列の長さとの関係から判定する、いずれかの文字列にこのビットがない場合、現在のビットはゼロに設定されます.たとえば、「123」と「45」が加算され、百ビットに遍歴する必要があります.また、2つの数字から抽出された百ビットはそれぞれ「1」と「0」です.
    4.キャリーの役割を無視しないでください.各ビットの計算には、2つの数値対応ビットの値だけでなく、前のステップのキャリーも考慮する必要があり、現在のビットの計算結果は10より大きい可能性があり、この場合もより高い位置へのキャリーが必要である.また、ループループが終了した後も、まだキャリーがある場合は、キャリーをより高いレベルに追加する必要があります.たとえば「99」と「1」を加算すると、ループが終了した後、10桁の進位「1」を結果のより高い100桁に置く必要があります.
    コードは次のとおりです.
    class Solution(object):
        def addStrings(self, num1, num2):
            """
            :type num1: str
            :type num2: str
            :rtype: str
            """
            num1, num2 = num1[::-1], num2[::-1]                     #         
            len1, len2 = len(num1), len(num2)                       #        
            res = ''                                                #        
            carry = 0                                               #      
            for i in range(max(len1, len2)):                        #     
                n1 = ord(num1[i]) - ord('0') if i < len1 else 0     #          
                n2 = ord(num2[i]) - ord('0') if i < len2 else 0     #          
                s = n1 + n2 + carry                                 #         
                carry, r = s // 10, s % 10                          #        
                res = str(r) + res                                  #              
            if carry:                                               #         
                res = str(carry) + res                              #        
            return res                                              #       
    

    質問やアドバイスがあれば、コメントエリアへようこそ~