1. 程式人生 > >LeetCode刷題Easy篇兩個二進位制字串相加,“和”也是二進位制字串

LeetCode刷題Easy篇兩個二進位制字串相加,“和”也是二進位制字串

題目

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

 

我的嘗試

我的方案:兩個指標,從尾部開始遍歷,取出當前元素求“與運算”,如果需要進位,設定addNumber=1,不需要則為0.

可能存在長度不同的情況,所以遍歷條件為p>=0||q>=0,最高位情況,單獨處理if addnumber不為0,發生最高位進位。完整程式碼如下:

leetcode上有的程式碼比較簡潔,利用了三元表示式,思路完全一樣,leetcode測試通過,而且我感覺我的程式碼更容易理解,重構後的程式碼雖然簡潔,但是不容易理解。

寫演算法的時候,大量時間花費在char的處理上,原來一直拿到的是char 1 對應的49,一直 49,48各種處理,不知道怎麼取出數字,看了別的資料發現可以這樣Character.getNumberValue。另外,可以利用“與”運算子。主題思路在掌握內容之中。為自己喝彩!!!

 

class Solution {
    public String addBinary(String a, String b) {
       int p=a.length()-1;
       int q=b.length()-1;
       char[] chara=a.toCharArray();
       char[] charb=b.toCharArray();
       int addNumber=0;
       StringBuilder stringBuilder=new StringBuilder();
       while (p>=0||q>=0){
           int  aCurrent=0;
           int  bCurrent=0;
           if (p<0) {
                 bCurrent=Character.getNumericValue(charb[q]);
           }
           else if (q<0) {
                 aCurrent=Character.getNumericValue(chara[p]);
           }
           else {
               aCurrent=Character.getNumericValue(chara[p]);
               bCurrent=Character.getNumericValue(charb[q]);
           }
           int  res=aCurrent^bCurrent^addNumber;
           //進位的判斷不對,比如0 0 加一個進位的情況,這個情況不需要進位
           if (aCurrent+bCurrent+addNumber>=2){
               //需要進位
               addNumber=1;
           }
           else{
               addNumber=0;
           }
           stringBuilder.append(res);
           p--;
           q--;
       }
        if (addNumber!=0){
            stringBuilder.append(1);
        }
        return stringBuilder.reverse().toString();
    }
}