1. 程式人生 > >【LeetCode】二進位制求和

【LeetCode】二進位制求和

給定兩個二進位制字串,返回他們的和(用二進位制表示)。

輸入為非空字串且只包含數字 1 和 0

示例 1:

輸入: a = "11", b = "1"
輸出: "100"

示例 2:

輸入: a = "1010", b = "1011"
輸出: "10101"

import java.util.*;

public class Main {

    public static void main(String[] args)
    {

        Scanner sc=new Scanner(System.in);
        String str1=sc.next();
        String str2=sc.next();

        System.out.println(Solution.addBinary(str1,str2));

    }

}


class Solution {

    public static String addBinary(String a, String b) {

        String res="";    //記錄結果
        int sum=0;        //記錄單個數位上的和
        int lenA=a.length()-1;    //串a的索引        
        int lenB=b.length()-1;    //串b的索引
    
        while (lenA>=0||lenB>=0)    //當a串和b串都沒檢索到最首位,迴圈執行
        {
            if (lenA>=0)         //如果a串沒檢索到首位
            {
                //記錄當前位的和(前一位的進位+a串當前位)
                sum+=Integer.parseInt(a.substring(lenA,lenA+1));
                lenA--;        //索引前移
            }
            if (lenB>=0)
            {
                //記錄當前位的和(前一位的進位+a串當前位+b串當前位)    
                sum+=Integer.parseInt(b.substring(lenB,lenB+1));
                lenB--;        //索引前移
            }

            if (sum==0||sum==1)//如果前一位的進位+a串當前位+b串當前位=0或1,則不進位
            {
                res=sum+res;    
                sum=0;        //進位置為0
            }
            else if (sum==2)//如果前一位的進位+a串當前位+b串當前位=2,則進位
            {
                res="0"+res;//當前位結果為0
                sum=1;       //進位置為1
            }
            else if (sum==3)//如果前一位的進位+a串當前位+b串當前位=3,則進位
            {
                res="1"+res;//當前位結果為1
                sum=1;        //進位置為1
            }


        }

        if (sum==1)        //如果最高位有進位1
            res="1"+res;    //則在結果最前面新增1
        return res;
    }
}

思路:從末尾數位開始加,如果當前位相加結果為0或1,則不存在進位,直接將當前位結果新增到結果串中;如果當前位結果為2,則有進位,將0新增到結果中,並記錄進位1;如果當前位結果為3,則有進位,將1新增到結果中,並記錄進位1;知道兩個串檢索完成,如還有進位,則在結果前新增1.