LeetCode算法题-Add Binary(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Count Binary Substrings(Java实现)
这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串 ...
- LeetCode算法题-Add Strings(Java实现)
这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...
- LeetCode算法题-Add Digits(Java实现-3种解法)
这是悦乐书的第199次更新,第207篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258).给定非负整数num,重复添加其所有数字,直到结果只有一位数 ...
- LeetCode算法题-Balanced Binary Tree(Java实现)
这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...
- LeetCode算法题-Invert Binary Tree
这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)
这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
随机推荐
- 简单说明CGI和动态请求是什么
1. CGI是什么 CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意. 我们知道,web服务器所处理的内容都是静态的,要想处理动态内容 ...
- iOS 快速排序
一.快速排序概念及其思想 快速排序(QuickSort),又称为交换排序,是分治算法的一种,快速排序采用分治的策略. 1.分治法的基本思想: 将原问题分解为若干个规模更小但结构和原问题相似的子问题.递 ...
- .Net EF6+Mysql 环境搭建
由于一直使用的数据库是mysql,之前所用的orm都是轻量级的例如 dapper 这些的,然后想用ef配置一下mysql,总共时间花了差不多2天,才将坑填完,写个博客将流程记录一下 给后来者少掉点坑. ...
- Pyinstaller如何将资源文件一起打包至exe中
基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源 官方说明:https:// ...
- Spring核心——设计模式与IoC
“Spring”——每一个Javaer开发者都绕不开的字眼,从21世纪第一个十年国内异常活跃的SSH框架,到现在以Spring Boot作为入口粘合了各种应用.Spring现在已经完成了从web入口到 ...
- 捕获未处理的Promise错误
译者按: 通过监听unhandledrejection事件,可以捕获未处理的Promise错误. 原文: Tracking unhandled rejected Promises 译者: Fundeb ...
- redux 入门
背景: 在react中使用redux 重点:不要滥用redux,如果你的页面非常简单,没有 那么多的互动,那么就不要使用redux,反而会增加项目的复杂性. 如果你有以下情况,则可以考虑使用redux ...
- Ext数字格式化
Ext.util.Format.number(v,format) v :要进行格式化的值format:格式化字符串 0与#的区别:0:在小数位数不够时会补零#:在小数位数不够时不会补零 Ext ...
- 原生JS实现随着鼠标滚动到元素位置触发对应css3动画,简单易用滚动监测
预览链接:http://www.vanwee.cn/%E6%BB%9A%E5%8A%A8%E7%9B%91%E5%90%AC/ <style> body{overflow-x: hidde ...
- vue2+webpack 移动生态 常用依赖
1.脚手架:官方的vue-cli已经很方便了 2.路由:vue-router : https://router.vuejs.org/zh-cn/essentials/named-routes.html ...