这是悦乐书的第157次更新,第159篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67)。给定两个二进制字符串,返回它们的总和(也是二进制字符串)。输入字符串都是非空的,只包含字符1或0。 例如:

输入:a =“11”,b =“1”

输出:“100”

输入:a =“1010”,b =“1011”

输出:“10101”

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

二进制数做加法时,是逢二进一,因为最后返回的是二进制字符串,所以可以不考虑溢出的风险。

先来运算一组简单的数据,使用提供的字符串“11”和“1”来演示。

“11”的最后一位是1,“1”的最后一位是1,两者相加等于2,此时两者的和的二进制字符串表示为“12”。因为逢二进一,所以最后一位变为0,向前进1,变成了“20”。同理,继续向前进1,此时二进制字符串变为了“100”,也就是我们最后要的结果。

依据上面的计算过程,我们可以分以下几个步骤来解题。

第一步,确定两个字符串长度中的最大值。因为要从后往前依次获取数字,循环的次数限制要以长度大的为准,长度小的默认是用0替代。定义一个变量carry存储上一次计算可能会遗留的值。创建一个StringBuilder对象,存储每次计算后要插入的字符串。

第二步,定义一个变量sum存储每次获得的数的和,初始值指向carry。分别获取两个字符串最后一位字符的整数,然后求和,对求得的和用2取余,然后将取余结果(0和1中的一个)插入第0个位置。

第三步,计算sum除以2的值,将其赋值给carry,接着循环第二步。

第四步,循环结束后,需要判断下carry是否等于0,因为carry最后一个计算sum/2得到的值有可能不等于0,如果不等于0,则将carry的值插入字符串第0个位置。

public String addBinary(String a, String b) {
int m = a.length();
int n = b.length();
int len = Math.max(m, n);
int carry = 0;
StringBuilder sb = new StringBuilder();
for (int i=0; i<len; i++) {
int sum = carry;
int num = 0;
if (m-1-i >= 0) {
num = a.charAt(m-1-i)-'0';
}
int num2 = 0;
if (n-1-i >= 0) {
num2 = b.charAt(n-1-i)-'0';
}
sum += num + num2;
sb.insert(0, sum%2+"");
carry = sum/2;
}
if (carry != 0) {
sb.insert(0, carry+"");
}
return sb.toString();
}

03 第二种解法

对于第一种解法,可以适当再优化下,大体逻辑一致,不过在使用StringBuilder存储字符串的时候,使用的append方法,所以最后需要将其反转,才是最终我们需要的结果。

public String addBinary2(String a, String b) {
StringBuilder sb = new StringBuilder();
int i = a.length() - 1;
int j = b.length() -1;
int carry = 0;
while (i >= 0 || j >= 0) {
int sum = carry;
if (j >= 0) {
sum += b.charAt(j--) - '0';
}
if (i >= 0) {
sum += a.charAt(i--) - '0';
}
sb.append(sum % 2);
carry = sum / 2;
}
if (carry != 0) {
sb.append(carry);
}
return sb.reverse().toString();
}

04 小结

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Add Binary(Java实现)的更多相关文章

  1. LeetCode算法题-Count Binary Substrings(Java实现)

    这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串 ...

  2. LeetCode算法题-Add Strings(Java实现)

    这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...

  3. LeetCode算法题-Add Digits(Java实现-3种解法)

    这是悦乐书的第199次更新,第207篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258).给定非负整数num,重复添加其所有数字,直到结果只有一位数 ...

  4. LeetCode算法题-Balanced Binary Tree(Java实现)

    这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...

  5. LeetCode算法题-Invert Binary Tree

    这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...

  6. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  7. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  8. LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

    这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...

  9. LeetCode算法题-Average of Levels in Binary Tree(Java实现)

    这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...

随机推荐

  1. python理解描述符(descriptor)

    Descriptor基础 python中的描述符可以用来定义触发自动执行的代码,它像是一个对象属性操作(访问.赋值.删除)的代理类一样.前面介绍过的property是描述符的一种. 大致流程是这样的: ...

  2. java 8 双冒号运算符

    前言 java8增加了双冒号运算符.lambda本质上都是语法糖,学习过C#委托.匿名委托再理解java8中的双冒号运算符就容易多了.双冒号就是把方法当作参数传递给需要的方法,或者说是传递到strea ...

  3. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  4. C#开发微信公众平台-就这么简单(附Demo)转载

    C#开发微信公众平台-就这么简单(附Demo)  来源:https://www.cnblogs.com/xishuai/p/3625859.html#!comments 写在前面 阅读目录: 服务号和 ...

  5. 先装IIS后装.Net Framework

    1.动态页面和静态页面的区别 动态页面(动态网站):通过C#代码(或别的语言)与服务器的交互的实现(比如新建一个ashx一般处理程序中的C#代码就可以和服务器实现交互,修改数据库,上传图片等都属于和服 ...

  6. [PHP] PHP在CLI环境下的错误日志

    1.display_errors = Off;//控制php是否输出错误;在生产环境中输出会泄露敏感信息;建议记录错误而不是将它们发送到STDOUToff :不显示任何错误;stderr :向STDE ...

  7. python基础学习(四)if判断语句

    if判断语句的基本语法 在python中,if判断的格式如下: if 条件: 条件成立时,执行的语句 ...... 注意:代码的缩进要使用一个tab键或者四个空格(建议使用四个空格,tab和空格最好不 ...

  8. DoTween 动画插件简单示例

    .doTween的静态方法 DOTween.To(() => maskImage.color, toColor => maskImage.color = toColor, , , , ), ...

  9. h5+js视频播放器控件

    由于h5兼容性问题,很多浏览器对于插入视频播放的支持都大不相同.火狐支持的比较完整,谷歌则支持的不是很好,很多功能都不能实现,这就需要我们去自制一个播放界面,去兼容不同的浏览器. 只插入一个视频时,浏 ...

  10. blfs(systemd版本)学习笔记-安装、配置和使用wpa_supplicant无线网络连接工具

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! wireless项目地址:http://www.linuxfromscratch.org/blfs/view/stable-sy ...