投机的解法
//给你两个二进制字符串,返回它们的和(用二进制表示)。
//
// 输入为 非空 字符串且只包含数字 1 和 0。
//
//
//
// 示例 1:
//
// 输入: a = "11", b = "1"
//输出: "100"
//
// 示例 2:
//
// 输入: a = "1010", b = "1011"
//输出: "10101"
//
//
//
// 提示:
//
//
// 每个字符串仅由字符 '0' 或 '1' 组成。
// 1 <= a.length, b.length <= 10^4
// 字符串如果不是 "0" ,就都不含前导零。
//
// Related Topics 数学 字符串
// ? 508 ? 0
package leetcode.editor.cn;
//Java:二进制求和
public class P67AddBinary {
public static void main(String[] args) {
Solution solution = new P67AddBinary().new Solution();
// TO TEST
System.out.println(Integer.toBinaryString(8));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String addBinary(String a, String b) {
int i = Integer.parseInt(b, 2);
int j = Integer.parseInt(a, 2);
return Integer.toBinaryString(i + j);
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
当然,人家肯定不是想考这个,这个解法局限在于解析范围,超过32位Integer解析不了,超过64位Long解析不了
那么老老实实算吧,十进制怎么算,二进制就怎么算
//给你两个二进制字符串,返回它们的和(用二进制表示)。
//
// 输入为 非空 字符串且只包含数字 1 和 0。
//
//
//
// 示例 1:
//
// 输入: a = "11", b = "1"
//输出: "100"
//
// 示例 2:
//
// 输入: a = "1010", b = "1011"
//输出: "10101"
//
//
//
// 提示:
//
//
// 每个字符串仅由字符 '0' 或 '1' 组成。
// 1 <= a.length, b.length <= 10^4
// 字符串如果不是 "0" ,就都不含前导零。
//
// Related Topics 数学 字符串
// ? 508 ? 0
package leetcode.editor.cn;
//Java:二进制求和
public class P67AddBinary {
public static void main(String[] args) {
Solution solution = new P67AddBinary().new Solution();
// TO TEST
String s = solution.addBinary("1010", "1011");
System.out.println(s);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String addBinary(String a, String b) {
if (a.length() < b.length()) {
String temp = a;
a = b;
b = temp;
}
while (b.length() < a.length())
b = "0" + b;
String res = "";
int carry = 0;
for (int i = a.length() - 1; i > -1; i--) {
int x = a.charAt(i) - '0';
int y = b.charAt(i) - '0';
int sum = x + y + carry;
res = sum % 2 + res;
carry = sum >= 2 ? 1 : 0;
}
return carry == 1 ? 1 + res : res;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
但由于存在大量字符串拼接,频繁创建字符串对象,跑起来就很慢,内存占用也挺高,所以,用StringBuilder试试,于是有了下面这种看起来优雅点,实际跑起来也要快点(不多)的写法
//给你两个二进制字符串,返回它们的和(用二进制表示)。
//
// 输入为 非空 字符串且只包含数字 1 和 0。
//
//
//
// 示例 1:
//
// 输入: a = "11", b = "1"
//输出: "100"
//
// 示例 2:
//
// 输入: a = "1010", b = "1011"
//输出: "10101"
//
//
//
// 提示:
//
//
// 每个字符串仅由字符 '0' 或 '1' 组成。
// 1 <= a.length, b.length <= 10^4
// 字符串如果不是 "0" ,就都不含前导零。
//
// Related Topics 数学 字符串
// ? 508 ? 0
package leetcode.editor.cn;
//Java:二进制求和
public class P67AddBinary {
public static void main(String[] args) {
Solution solution = new P67AddBinary().new Solution();
// TO TEST
String s = solution.addBinary("0", "0");
System.out.println(s);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String addBinary(String a, String b) {
int maxLen = a.length() > b.length() ? a.length() : b.length();
StringBuilder res = new StringBuilder();
int carry = 0;
for (int i = 0; i < maxLen; i++) {
//依次加a,b的当前位上的数
carry += i < a.length() ? a.charAt(a.length() - 1 - i) - '0' : 0;
carry += i < b.length() ? b.charAt(b.length() - 1 - i) - '0' : 0;
// res.append(carry % 2);
// 转字符添加貌似比直接添加int数字快点
res.append((char) (carry % 2 + '0'));
carry = carry >= 2 ? 1 : 0;
}
if (carry != 0)
res.append(1);
res.reverse();
return res.toString();
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
版权声明:本文为weixin_44373412原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。