add binary java_LeetCode算法题-Add Binary(Java实现)
這是悅樂書的第157次更新,第159篇原創(chuàng)
01 看題和準(zhǔn)備
今天介紹的是LeetCode算法題中Easy級別的第16題(順位題號是67)。給定兩個二進(jìn)制字符串,返回它們的總和(也是二進(jìn)制字符串)。輸入字符串都是非空的,只包含字符1或0。 例如:
輸入:a =“11”,b =“1”
輸出:“100”
輸入:a =“1010”,b =“1011”
輸出:“10101”
本次解題使用的開發(fā)工具是eclipse,jdk使用的版本是1.8,環(huán)境是win7 64位系統(tǒng),使用Java語言編寫和測試。
02 第一種解法
二進(jìn)制數(shù)做加法時,是逢二進(jìn)一,因為最后返回的是二進(jìn)制字符串,所以可以不考慮溢出的風(fēng)險。
先來運(yùn)算一組簡單的數(shù)據(jù),使用提供的字符串“11”和“1”來演示。
“11”的最后一位是1,“1”的最后一位是1,兩者相加等于2,此時兩者的和的二進(jìn)制字符串表示為“12”。因為逢二進(jìn)一,所以最后一位變?yōu)?,向前進(jìn)1,變成了“20”。同理,繼續(xù)向前進(jìn)1,此時二進(jìn)制字符串變?yōu)榱恕?00”,也就是我們最后要的結(jié)果。
依據(jù)上面的計算過程,我們可以分以下幾個步驟來解題。
第一步,確定兩個字符串長度中的最大值。因為要從后往前依次獲取數(shù)字,循環(huán)的次數(shù)限制要以長度大的為準(zhǔn),長度小的默認(rèn)是用0替代。定義一個變量carry存儲上一次計算可能會遺留的值。創(chuàng)建一個StringBuilder對象,存儲每次計算后要插入的字符串。
第二步,定義一個變量sum存儲每次獲得的數(shù)的和,初始值指向carry。分別獲取兩個字符串最后一位字符的整數(shù),然后求和,對求得的和用2取余,然后將取余結(jié)果(0和1中的一個)插入第0個位置。
第三步,計算sum除以2的值,將其賦值給carry,接著循環(huán)第二步。
第四步,循環(huán)結(jié)束后,需要判斷下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 第二種解法
對于第一種解法,可以適當(dāng)再優(yōu)化下,大體邏輯一致,不過在使用StringBuilder存儲字符串的時候,使用的append方法,所以最后需要將其反轉(zhuǎn),才是最終我們需要的結(jié)果。
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 小結(jié)
以上就是全部內(nèi)容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點(diǎn)贊、留言、轉(zhuǎn)發(fā)就是對我最大的回報和支持!
總結(jié)
以上是生活随笔為你收集整理的add binary java_LeetCode算法题-Add Binary(Java实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 监控执行时间_java-监测方
- 下一篇: json解析详解 java_Java解析