剑指 Offer II 002. 二进制加法

题目:给定两个 01 字符串 ab ,请计算它们的和,并以二进制字符串的形式输出。

输入为 非空 字符串且只包含数字 10

提示:

  • 每个字符串仅由字符 '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();//将结果集反转
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值