題目
給你兩個二進制字符串,返回它們的和(用二進制表示)。
輸入爲 非空 字符串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1"
輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"
提示:
每個字符串僅由字符 '0' 或 '1' 組成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前導零。
解題思路
- 將兩個數根據最長的那個數的長度轉化爲char[]
- 從後向前遍歷,通過識別兩個數該位數以及進位變量中1的個數來確定改值以及下一個進位值
- 通過最後一個進位符加上char list 爲返回值
/**
* @author ffzs
* @describe
* @date 2020/6/23
*/
public class Solution {
public static String addBinary(String a, String b) {
char[] aChar, bChar;
int len = Math.max(a.length(), b.length());
if (a.length() > b.length()) {
aChar = a.toCharArray();
bChar = charList(b, a.length() - b.length(), len);
}
else if (a.length() == b.length()) {
aChar = a.toCharArray();
bChar = b.toCharArray();
}
else{
bChar = b.toCharArray();
aChar = charList(a, b.length() - a.length(), len);
}
char[] res = new char[len];
int next = 0;
for (int i = len-1; i >= 0; --i) {
int sum = aChar[i] + bChar[i] + next - 2 * '0';
res[i] = (char)(sum % 2 + '0');
next = sum / 2;
}
StringBuilder sb = new StringBuilder();
if (next == 1) sb.append('1');
sb.append(res);
return sb.toString();
}
private static char[] charList (String s, int start, int len) {
char[] seq = new char[len];
for (int i = 0; i < len; i++) {
if (i < start) seq[i] = '0';
else seq[i] = s.charAt(i-start);
}
return seq;
}
public static void main(String[] args) {
String a = "1010", b = "1011";
System.out.println(addBinary(a, b));
}
}
優化
- ab都通過自己編寫的方法進行轉化,減少代碼量
/**
* @author ffzs
* @describe
* @date 2020/6/23
*/
public class Solution {
public static String addBinary(String a, String b) {
int len = Math.max(a.length(), b.length());
char[] aChar = charList(a, len - a.length(), len);
char[] bChar = charList(b, len - b.length(), len);
char[] res = new char[len];
int next = 0;
for (int i = len-1; i >= 0; --i) {
int sum = aChar[i] + bChar[i] + next - 2 * '0';
res[i] = (char)(sum % 2 + '0');
next = sum / 2;
}
StringBuilder sb = new StringBuilder();
if (next == 1) sb.append('1');
sb.append(res);
return sb.toString();
}
private static char[] charList (String s, int start, int len) {
char[] seq = new char[len];
for (int i = 0; i < len; i++) {
if (i < start) seq[i] = '0';
else seq[i] = s.charAt(i-start);
}
return seq;
}
public static void main(String[] args) {
String a = "1010", b = "1011";
System.out.println(addBinary(a, b));
}
}
還可以直接將a,b轉成int[],0代表’0’, 1代表’1’,生成結果字符串的時候再轉回來,可能還會簡單點,不試了