zoukankan      html  css  js  c++  java
  • LeetCode 67. 二进制求和

    67. 二进制求和

    题目分析

    这个题很明显就是对字符串的每一个位进行操作,思想也很简单啊,主要还是考验代码风格吧。
    我们只需要从右到左每个位进行判断,然后填入新的字符串中,最后进行返回即可。

    实现代码

    class Solution {
        public String addBinary(String a, String b) {
            //先将字符串转化成字符数组,方便操作。
            char[] str_a = a.toCharArray();
            char[] str_b = b.toCharArray();
            int i = str_a.length-1;
            int j = str_b.length-1;
            int count = 0;
            //使用stringbuilder可以方便插入
            StringBuilder sb = new StringBuilder();
            //先对两者都有的部分进行加法操作。
            while(i >= 0 && j >= 0){
                //注意这里被坑了好久,获取当前位应该使用异或操作而不是或操作
                //例如1+1+0,或操作就会变成1,异或会变成0
                sb.insert(0, (str_a[i] - '0') ^ (str_b[j] - '0') ^ count);
                //求进位的时候反而是使用或操作,因为这里a,b,count三者之中有两个为1,就代表当前位产生了进位。
                count = ((str_a[i] - '0') & (str_b[j] - '0')) | ((str_a[i] - '0' & count) | (str_b[j] - '0' & count));
                i--;
                j--;
            }
            //处理较长字符串剩余的字符,同样要注意进位和加法之间的不同操作。
            while(i >= 0){
                sb.insert(0,(str_a[i] - '0') ^ count);
                count = (str_a[i] & count);
                i--;
            }
            while(j >= 0){
                sb.insert(0,(str_b[j] - '0') ^ count);
                count &= (str_b[j] - '0');
                j--;
            }
            //防止还有最高位进位的出现,这里无论0,1都加入,因为下面还会进行前置0的去除,所以问题不大。
            sb.insert(0,count);
            int index = 0;
            //注意这里只能遍历到倒数第二个位,因为测试用例中有0+0的情况,所以最少都要保留一个0.
            while(index < sb.length()-1 && sb.charAt(index) == '0'){
                index++;
            }
            //裁剪返回。
            return sb.toString().substring(index);
        }
    }
    

    上面这个写法是我自己写出来的,写的时间很长,并且代码的量也比较大,其实仔细看看我们这个代码里面还是有可以压缩的地方的,比如说我们三个while循环可以压缩成一个while循环,因为其实这里都是在干同样的事情。
    优化后的代码如下

    class Solution {
        public String addBinary(String a, String b) {
            int c = 0, i = a.length() - 1, j = b.length() - 1;
            StringBuilder sb = new StringBuilder();
            char[] charA = a.toCharArray();
            char[] charB = b.toCharArray();
            while (c > 0 || i >= 0 || j >= 0){
                int valA = i >= 0 ? charA[i--] - '0' : 0;
                int valB = j >= 0 ? charB[j--] - '0' : 0;
                int sum = valA + valB + c;
                c = sum >> 1;
                sb.append(sum % 2);
            }   
            return sb.reverse().toString();
        }
    }
    
  • 相关阅读:
    基于Windows Mobile 5.0的GPS应用程序开发
    iis6应用程序池被自动禁用问题 应用程序池'DefaultAppPool' 被自动禁用
    Axapta物流模块深度历险(八)
    AX的报表服务器(一)
    AX的企业门户(一)
    SQL Server2005 Reporting Services 管理站点
    SQL Server2005 Reporting Services的卸载
    耐心的解决问题
    危险操作符
    慢慢的坚持啊
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13180644.html
Copyright © 2011-2022 走看看