文章目录
- 题目描述
- 解题方法
- 模拟
- java代码
- 复杂度分析
- 相似题目
题目描述
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
提示:
- 1 <= a.length, b.length <= 104
a
和b
仅由字符'0'
或'1'
组成- 字符串如果不是
"0"
,就不含前导零
解题方法
模拟
这道题和第66题相似。按照二进制的规则模拟加法,从低位开始,两个二进制数低位相加超过2后,向高位进1,该位的值取模余2后的值,然后高位相加再加进位,依次类推往后遍历;若遍历的过程中有一个二进制数已经遍历完,则只需要将没遍历完的二进制数和进位相加,直到遍历到末尾。此时若还有进位1,则结果补充一个高位1。
java代码
public String addBinary(String a, String b) {List<Integer> list = new ArrayList<>();// 把位数多的二进制数赋值给a,位数小的二进制数赋值给b,方便后续运算if (a.length() < b.length()) {String str = a;a = b;b = str;}int maxLength = a.length();int minLength = b.length();char c = '0';// 进位int add = 0;for (int i = 0; i < maxLength; i++) {int num1 = a.charAt(a.length() - 1 - i) - c;// i < minLength时,a和b相加再加进位if (i < minLength) {int num2 = b.charAt(b.length() - 1 - i) - c;int sum = num1 + num2 + add;add = sum / 2;list.add(sum % 2);} else {int sum = num1 + add;add = sum / 2;list.add(sum % 2);}}// add = 1时,需要加一个高位1if (add == 1) {list.add(add);}StringBuilder result = new StringBuilder();for (int i = list.size() - 1; i >= 0; i--) {result.append((char) (list.get(i) + (int) c));}return result.toString();
}
复杂度分析
时间复杂度: O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)), m m m和 n n n分别为两个二进制字符串的长度,二进制相加的过程中需要遍历完两个字符串。
空间复杂度: O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),需要留出空间存储运算后的结果,运算后的结果接近 O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n))级别的存储空间。
相似题目
[leetcode] 66. 加一
- 个人公众号
- 个人小游戏