剑指 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();
    }
}

 

posted @ 2023-01-30 17:38  忧愁的chafry  阅读(26)  评论(0编辑  收藏  举报