add binary java_LeetCode算法题-Add Binary(Java实现)
這是悅樂書的第157次更新,第159篇原創
01 看題和準備
今天介紹的是LeetCode算法題中Easy級別的第16題(順位題號是67)。給定兩個二進制字符串,返回它們的總和(也是二進制字符串)。輸入字符串都是非空的,只包含字符1或0。 例如:
輸入:a =“11”,b =“1”
輸出:“100”
輸入:a =“1010”,b =“1011”
輸出:“10101”
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
二進制數做加法時,是逢二進一,因為最后返回的是二進制字符串,所以可以不考慮溢出的風險。
先來運算一組簡單的數據,使用提供的字符串“11”和“1”來演示。
“11”的最后一位是1,“1”的最后一位是1,兩者相加等于2,此時兩者的和的二進制字符串表示為“12”。因為逢二進一,所以最后一位變為0,向前進1,變成了“20”。同理,繼續向前進1,此時二進制字符串變為了“100”,也就是我們最后要的結果。
依據上面的計算過程,我們可以分以下幾個步驟來解題。
第一步,確定兩個字符串長度中的最大值。因為要從后往前依次獲取數字,循環的次數限制要以長度大的為準,長度小的默認是用0替代。定義一個變量carry存儲上一次計算可能會遺留的值。創建一個StringBuilder對象,存儲每次計算后要插入的字符串。
第二步,定義一個變量sum存儲每次獲得的數的和,初始值指向carry。分別獲取兩個字符串最后一位字符的整數,然后求和,對求得的和用2取余,然后將取余結果(0和1中的一個)插入第0個位置。
第三步,計算sum除以2的值,將其賦值給carry,接著循環第二步。
第四步,循環結束后,需要判斷下carry是否等于0,因為carry最后一個計算sum/2得到的值有可能不等于0,如果不等于0,則將carry的值插入字符串第0個位置。
public String addBinary(String a, String b) {
int m = a.length();
int n = b.length();
int len = Math.max(m, n);
int carry = 0;
StringBuilder sb = new StringBuilder();
for (int i=0; i
int sum = carry;
int num = 0;
if (m-1-i >= 0) {
num = a.charAt(m-1-i)-'0';
}
int num2 = 0;
if (n-1-i >= 0) {
num2 = b.charAt(n-1-i)-'0';
}
sum += num + num2;
sb.insert(0, sum%2+"");
carry = sum/2;
}
if (carry != 0) {
sb.insert(0, carry+"");
}
return sb.toString();
}
03 第二種解法
對于第一種解法,可以適當再優化下,大體邏輯一致,不過在使用StringBuilder存儲字符串的時候,使用的append方法,所以最后需要將其反轉,才是最終我們需要的結果。
public String addBinary2(String a, String b) {
StringBuilder sb = new StringBuilder();
int i = a.length() - 1;
int j = b.length() -1;
int carry = 0;
while (i >= 0 || j >= 0) {
int sum = carry;
if (j >= 0) {
sum += b.charAt(j--) - '0';
}
if (i >= 0) {
sum += a.charAt(i--) - '0';
}
sb.append(sum % 2);
carry = sum / 2;
}
if (carry != 0) {
sb.append(carry);
}
return sb.reverse().toString();
}
04 小結
以上就是全部內容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!
總結
以上是生活随笔為你收集整理的add binary java_LeetCode算法题-Add Binary(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 监控执行时间_java-监测方
- 下一篇: java多态强制类型转换_java多态和