二進制求和
題目描述:給你兩個二進制字符串盗温,返回它們的和(用二進制表示)霎迫。
輸入為 非空 字符串且只包含數(shù)字 1 和 0爽室。
示例說明請見LeetCode官網(wǎng)。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-binary/
著作權歸領扣網(wǎng)絡所有已维。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權行嗤,非商業(yè)轉(zhuǎn)載請注明出處。
解法一:分組處理
由于過長的字符串直接轉(zhuǎn)成int值會報錯垛耳,因為超出了int值的上線栅屏,所以采取分段處理的方式,從后往前堂鲜,每30位相加栈雳,利用了
Integer.parseInt(String, 2)
方法將字符串二進制數(shù)轉(zhuǎn)成10進制的int值,然后利用Integer.toBinaryString(int)
方法將相加后的值再轉(zhuǎn)成二進制字符串缔莲,然后把分段的字符串加起來哥纫,就是最后的結(jié)果。做的過程中有幾點要考慮:
- 第一痴奏,每段相加時蛀骇,考慮是否有進位,如果有進位读拆,用addOne表示進位數(shù)擅憔,值為1,在下一分段相加時把addOne加上建椰;
- 第二雕欺,當每段相加的結(jié)果長度小于30位時岛马,需要在前面補0棉姐,補到30位屠列。
public class LeetCode_067 {
public static String addBinary(String a, String b) {
int addOne = 0;
String result = "";
while (a.length() > 30 || b.length() > 30) {
String aStr;
String bStr;
if (a.length() > 30) {
aStr = a.substring(a.length() - 30, a.length());
a = a.substring(0, a.length() - 30);
} else {
aStr = a;
a = "0";
}
if (b.length() > 30) {
bStr = b.substring(b.length() - 30, b.length());
b = b.substring(0, b.length() - 30);
} else {
bStr = b;
b = "0";
}
String temp = Integer.toBinaryString(Integer.parseInt(aStr, 2) + Integer.parseInt(bStr, 2) + addOne);
if (temp.length() > 30) {
addOne = 1;
temp = temp.substring(1, temp.length());
} else {
if(temp.length() < 30) {
int zeroCount = 30 - temp.length();
for(int i = 0; i < zeroCount; i++) {
temp = "0" + temp;
}
}
addOne = 0;
}
result = temp + result;
}
return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2) + addOne) + result;
}
public static void main(String[] args) {
String a = "1001101011011010000010111010100111001000100001111110011111001010100101111";
String b = "111000011000010000001100001001010011000101000000001111101101000100000000100100001100010000111001000";
System.out.println(addBinary(a, b));
}
}
【每日寄語】 天可補,荷【兀可填笛洛,南山可移。日月既往乃坤,不可復追苛让。