剑指 Offer II 002. 二进制加法
题目:
思路:
【1】模拟二进制进行加减位移,要先拿出两个字符串的长度,然后从末尾开始相加到首部,由于记录的时候数组是先记录尾部的所以还要进行翻转,在转成字符串。
【2】另一种思路是,先转为十进制的整数,相加后再转回二进制,但是这个要考虑到溢出的问题,因为字符串的长度限制远大于Long类型转成二进制的长度。但是如果采用分割字符串的话其实也是可以,但是相对会麻烦很多。
代码展示:
转化为十进制的思路:
class Solution { public String addBinary(String a, String b) { long n1 = Long.parseLong(a,2); long n2 = Long.parseLong(b,2); long num = n1+n2; return Long.toBinaryString(num); } }
模拟二进制进行相加和位移:
//时间1 ms击败99.94% //内存40 MB击败88.54% //时间复杂度:O(n),这里的时间复杂度来源于顺序遍历 aaa 和 bbb。 //空间复杂度:O(1),除去答案所占用的空间,这里使用了常数个临时变量。 class Solution { public String addBinary(String a, String b) { StringBuffer buf = new StringBuffer(); int value=0,n=Math.max(a.length(),b.length()); for (int i = 0; i < n; i++){ value += i < a.length() ? (a.charAt(a.length()-1-i)-'0') : 0; value += i < b.length() ? (b.charAt(b.length()-1-i)-'0') : 0; buf.append((char)(value % 2 +'0' )); value/=2; } if (value>0){ buf.append('1'); } buf.reverse(); return buf.toString(); } }