二进制加法 | 循序递进---@二十一画

题目描述:二进制加法

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

输入为 非空 字符串且只包含数字 1 和 0。

示例 1:
输入: a = "11", b = "10"
输出: "101"


示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
 

提示:

每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。

分析:

题目中给定如下需求:

  1. 字符串非空且 只含 1 或 0
  2. a和b的长度在[1,10000] 也就是说远超一般整数范围内

方向:

  1. 可以通过调用java api直接转化为int,相加后再转化为 二进制返回结果【必须在int范围内】
  2. 就使用二进制,模拟十进制相加的方式,从后向前挨个遍历,全部相加后返回结果

代码:

第一版:
只能在传入值是在int范围内执行【也可以换成Long,但是作用不大】

image.png

描述:简单的写法,所有的过程都是通过调用java内部的api

class Solution {
    public String addBinary(String a, String b) {

        //01、将传入的值转化为十进制  valueOf 底层调用parseInt
        return Integer.toBinaryString(
            Integer.valueOf(a,2)+ Integer.valueOf(b,2)
        )
    }
}
第二版:

image.png

描述:模拟一下十进制加法的过程,实现二进制加法

class Solution {
    public String addBinary(String a, String b) {
    	  //01、计算a和b的长度,并求a和b的max_len
        //02、carry 为 当前的进位
        //03、builder 类似于我们的草稿纸😊,记录当前从后往前算出来的结果
        int a_len = a.length();
        int b_len = b.length();
        int max_len = Math.max(a_len,b_len);
        int carry = 0;
        StringBuilder builder = new StringBuilder();

        //04、从后向前遍历,如果a或者b 中长度不够,按照0来算
        for(int i=0;i<max_len;i++){
            // tmp值是当前上下位加起来的结果,因为charAt方法后的‘char’类型,不是‘int’类型,所以需要-‘0’取对应的int值
            int tmp = (a_len-i-1)>=0?(a.charAt(a_len-i-1)-'0'):0;
            tmp += (b_len-i-1)>=0?(b.charAt(b_len-i-1)-'0'):0;
            // tmp需要继续加进位值,之后取余的意思是满2进一,不满的话,就把当前结果作为该位的相加值
            builder.append((carry+tmp)%2);
            // carry需要更新,如果满2了,就重新设置进位,如果不满二那么进制为0
            carry = (carry+tmp)/2;
        }
        //05、遍历结束后,判断carry是否为1,是的话继续还需向左挪动一位设置为1,否则不操作
        if(carry==1)builder.append(carry);
        //06、因为builder是从低位向高位追加,所以这里反转打印,按照从高位到低位返回
        return builder.reverse().toString();
    }

    public static String first01(String a,String b){

        //01、将传入的值转化为十进制  valueOf 底层调用parseInt
        return Integer.toBinaryString(
            Integer.valueOf(a,2)+ Integer.valueOf(b,2)
        );  
      
    }
}

总结:

该题解法简单,问题是如何将代码书写的精炼且剪短。刚开始写的代码确实很乱,后来借鉴官方解释,将自己的代码进行精炼,发现确实好多了。

大家好,我是二十一画,感谢您的品读,如有帮助,不胜荣幸~😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值