LeetCode之二进制字符串相加
2016-07-13 10:24
756 查看
刚开始刷leetcode,第一道题是给两个二进制的字符串,求这两个二进制相加以后的和,输出当然也是二进制的格式了。以下是题目:
解决这个问题,首先要自己模拟出二进制相加时的运算过程,首先计算的肯定是0号位,就是按照二进制中8,4,2,1这样排列时的最后一个。即首先计算a的最末位1和b的最末位1。1+1=2,在二进制计算中,应该表示为10,其中1是要进位的,即和两个二进制的1号位相加。
计算过程如下图(原谅我的灵魂画风。。):
具体代码如下:
首先获取二进制字符串的最后一位,相加,比如da=1,db=1,adv表示的是进位,所以刚开始adv初始为0,每次二进制位相加时就是da+db+adv,第一次运算过程就是d=1+1+0=2,但在实际算的过程中,结果的最后一位表示为0,所以代码中让取 d% 2 == 0 ? ‘0’ : ‘1’,此时进位为1,也就是d向右移一位,2向右移一位就是1啦,这样就得出了进位adv,到下次运算时,adv与二进制数一起相加。第二步是1号位相加,由于a有1号位,而b只有0号位,所以跳出while循环,在下一次计算中只有a的1号位和进位adv,如此循环往复即可。到最后,如果还有进位,代码处理的也很巧妙,直接在result结果后追加“1”。到最后把result转置即可。
题目很简单,讲的很啰嗦,其实只看代码就能看懂
/** * Given two binary strings, return their sum (also a binary string). * * For example, a = "11" b = "1" Return "100". */
解决这个问题,首先要自己模拟出二进制相加时的运算过程,首先计算的肯定是0号位,就是按照二进制中8,4,2,1这样排列时的最后一个。即首先计算a的最末位1和b的最末位1。1+1=2,在二进制计算中,应该表示为10,其中1是要进位的,即和两个二进制的1号位相加。
计算过程如下图(原谅我的灵魂画风。。):
具体代码如下:
public class AddBinary { public static String addBinary(String a, String b) { int i = a.length() - 1; int j = b.length() - 1; int da = 0; int db = 0; int adv = 0; StringBuffer result = new StringBuffer(); while (i >= 0 && j >= 0) { da = a.charAt(i--) == '0' ? 0 : 1; db = b.charAt(j--) == '0' ? 0 : 1; int d = da + db + adv; result.append(d % 2 == 0 ? '0' : '1'); adv = d >> 1; } if (i >= 0) { while (i >= 0) { da = a.charAt(i--) == '0' ? 0 : 1; int d = da + adv; result.append(d % 2 == 0 ? '0' : '1'); adv = d >> 1; } } else if (j >= 0) { while (j >= 0) { db = b.charAt(j--) == '0' ? 0 : 1; int d = db + adv; result.append(d % 2 == 0 ? '0' : '1'); adv = d >> 1; } } if (adv == 1) { result.append('1'); } return result.reverse().toString(); } public static void main(String args[]) { String consult=addBinary("11","1"); System.out.print("consult is "+consult); } }
首先获取二进制字符串的最后一位,相加,比如da=1,db=1,adv表示的是进位,所以刚开始adv初始为0,每次二进制位相加时就是da+db+adv,第一次运算过程就是d=1+1+0=2,但在实际算的过程中,结果的最后一位表示为0,所以代码中让取 d% 2 == 0 ? ‘0’ : ‘1’,此时进位为1,也就是d向右移一位,2向右移一位就是1啦,这样就得出了进位adv,到下次运算时,adv与二进制数一起相加。第二步是1号位相加,由于a有1号位,而b只有0号位,所以跳出while循环,在下一次计算中只有a的1号位和进位adv,如此循环往复即可。到最后,如果还有进位,代码处理的也很巧妙,直接在result结果后追加“1”。到最后把result转置即可。
题目很简单,讲的很啰嗦,其实只看代码就能看懂
相关文章推荐
- 生成一维条码和遮蔽层
- Chapter 17 Replication 复制
- String参数是传值还是传递引用的测试
- Python多进程并发(multiprocessing)
- PostgreSQL问题解决--- integer out of range
- Spring技术内幕(一):IOC容器
- 端口占用查杀
- hdu 1018
- 共享锁和排它锁
- spark新能优化之序列化
- 用tornado实现一个简单的websocket样例
- MVC 之 EF框架简介
- 面试经验
- 网络知识
- 在 Linux 下使用任务管理器
- Static关键字所有用法详解
- SSH问题总结(1)_Spring注入问题
- 2014 鞍山区域赛 C HDU5072 Coprime 莫比乌斯/容斥+同色三角形
- 【Unity3D自学记录】鼠标拖拽物体移动
- 如何设置感兴趣的区域ROI