题目:给定两个 01 字符串 a
和 b
,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1
和 0
。
提示:
- 每个字符串仅由字符 '0' 或 '1' 组成。
- 1 <= a.length, b.length <= 10^4
- 字符串如果不是 "0" ,就都不含前导零。
1.考虑转换成int型做加法,最后再转换成string,但可能会有溢出(字符串过长时,表示的int型溢出)
2.模拟十进制算法,从后往前依次计算每一位加法的结果和进位,将结果保存到新的字符串中,再反转
题目进阶:
①数组形式的整数加减法
public List<Integer> addTwoNum(int[] nums1, int[] nums2) {
List<Integer> res = new ArrayList<>();
int carry = 0; //进位初始为0
int l1 = nums1.length - 1; //nums1的末位
int l2 = nums2.length - 1; //nums2的末位
while (l1 >= 0 || l2 >= 0) { //从后往前依次遍历
int x = l1 < 0 ? 0 : nums1[l1]; //若循环进行到超过数组长度时,默认此位为0
int y = l2 < 0 ? 0 : nums2[l2];
int sum = x + y + carry;
res.add(sum % 10); //将该位结果添加到res结果集中
carry = sum / 10; //求出进位
l1--;
l2--;
}
if (carry != 0) res.add(carry); //若最后一次计算仍产生进位,但此时已退出循环,则直接将进位添加到结果集
Collections.reverse(res);//将结果集反转
return res;
}
②字符串整数加减法
改动:1.获取某一位的值:num.charAt(l1)-'0' //ascII值相减后就是int型
2.add()函数改为append()函数
3.反转时直接res.reverse()
4.最后用toString()方法输出字符串
public String addStrings(String nums1, String nums2) {
StringBuilder res = new StringBuilder();
int carry = 0; //进位初始为0
int l1 = nums1.length() - 1; //nums1的末位
int l2 = nums2.length() - 1; //nums2的末位
while (l1 >= 0 || l2 >= 0) { //从后往前依次遍历
int x = l1 < 0 ? 0 : nums1.charAt(l1)-'0'; //若循环进行到超过数组长度时,默认此位为0
int y = l2 < 0 ? 0 : nums2.charAt(l2)-'0';
int sum = x + y + carry;
res.append(sum % 10); //将该位结果添加到res结果集中
carry = sum / 10; //求出进位
l1--;
l2--;
}
if (carry != 0) res.append(carry); //若最后一次计算仍产生进位,但此时已退出循环,则直接将进位添加到结果集
return res.reverse().toString();//将结果集反转
}
③ 字符串整数加减法(二进制),只需把10改成2
public String addStrings(String a, String b) {
StringBuilder res = new StringBuilder();
int carry = 0; //进位初始为0
int l1 = a.length() - 1; //nums1的末位
int l2 = b.length() - 1; //nums2的末位
while (l1 >= 0 || l2 >= 0) { //从后往前依次遍历
int x = l1 < 0 ? 0 : a.charAt(l1)-'0'; //若循环进行到超过数组长度时,默认此位为0
int y = l2 < 0 ? 0 : b.charAt(l2)-'0';
int sum = x + y + carry;
res.append(sum % 2); //将该位结果添加到res结果集中
carry = sum / 2; //求出进位
l1--;
l2--;
}
if (carry != 0) res.append(carry); //若最后一次计算仍产生进位,但此时已退出循环,则直接将进位添加到结果集
return res.reverse().toString();//将结果集反转
}