力扣第 67 題。給你兩個二進位字符串,返回它們的和(用二進位表示)。輸入為非空字符串且只包含數字 1 和 0。
示例1:
輸入: a = "11", b = "1"輸出: "100"示例2:
輸入: a = "1010", b = "1011"輸出: "10101"提示:
思路我們一般的情況下對十進位求和比較熟悉,其實二進位求和與十進位求和是類似的,十進位求和是遇 10 進 1。二進位求和是遇 2 進 1。我們可以從右往左遍歷二進位數值,然後將每個遍歷到的數據進行相加。就算是十進位數據,我們是從右往左逐位相加。因為逢 2 需要進 1 位。所以 1 + 1 = 2,要轉換為 0。並且將前一位進 1。前一位數據進行相加操作的時候,需要再額外加 1。
計算順序如下:
第一步:1 + 1 =2。需要將當前的值設置為 0,並且將前一位是否需要加 1 的臨時欄位設置為 1。
第二部:1 + 0 + 1 = 2。當前第一個二進位數是 1。第二個二進位數沒有值,就相當於 0。由於前一位相加之和是 2。需要前進一位,所以當前值需要加 1。計算結果為 2,需要將 2 轉換成 0。將額外相加的臨時值設置為 1。
判斷額外相加的值是否為 1,如果是 1 就將 1 加上,如果不為 1 就結束。
將現有結果反轉,得到最終數據。
例如 1010 + 1011:
和上面的步驟類型,要從右往左計算對應位置上面的和。因為逢 2 進 1。所以我們需要定義一個中間臨時值,用來標記當前操作的時候是否需要再額外加 1。
計算順序如下:
第一步:0 + 1 = 1。
第二步:1 + 1 = 2 ,轉換成 0,在前一位相加是否需要額外加 1 的值賦值為 1。
第三步:0 + 0 + 1 = 1。
第四步:1 + 1 =2,轉換為 0,在前一位相加是否需要額外加 1的值賦值為 1。
第五步:判斷額外相加的值是否為 1,如果是 1 就將 1 加上,如果不為 1 就結束。
第六步:將現有結果反轉,得到最終數據。
代碼實現
Go 語言版本實現如下:
Tips:為了方便閱讀,以上代碼全部以圖片格式展示,要下載源碼,請點擊左下角 閱讀原文 連結!