• [LeetCode]Add Binary


    题目:给定两个二进制数字字符串A、B,计算出A+B并返回和值的字符串

    算法一:最原始的办法,模拟二进制的运算,因考虑到给定的二进制字符串非常长,所以使用Java的BigInteger实现

    import java.math.BigInteger;
    
    public class Solution {
        /**
         * Convert binary number to BigInteger.
         * @param binary
         * @return
         */
        public BigInteger convertBinaryToBigInteger(String binary) {
            BigInteger factor  = BigInteger.ONE;
            BigInteger convert = BigInteger.ZERO;
            
            int length = binary.length();
            for (int i=length-1; i>=0; --i) {
                long num = (long)(binary.charAt(i)-'0');
                convert = convert.add(factor.multiply(BigInteger.valueOf(num)));
                
                factor = factor.shiftLeft(1);
            }
    
            return convert;
        }
        
        /**
         * Convert BigInteger to binary number.
         * @param c
         * @return
         */
        public String convertBigIntegerToBinary(BigInteger c) {
            if (c.equals(BigInteger.ZERO)) {
                return "0";
            }
            
            String res = new String();
            BigInteger factor = BigInteger.valueOf(2L);
            while (!c.equals(BigInteger.ZERO)) {
                res += c.mod(factor).toString();
                c = c.divide(factor);
            }
            
            return new StringBuffer(res).reverse().toString(); 
        }
        
        /**
         * Add Two given binary number and return the binary number of their sum.
         * @param a
         * @param b
         * @return
         */
        public String addBinary(String a, String b) {
            BigInteger aBigInteger = convertBinaryToBigInteger(a);
            BigInteger bBigInteger = convertBinaryToBigInteger(b);
            
            return convertBigIntegerToBinary(aBigInteger.add(bBigInteger));
        }
    }

    算法二:利用异或运算,这样的方法更加优雅

    public String addBinary(String a, String b) {
            String convert = new String();
            char[] aArray = a.toCharArray();
            char[] bArray = b.toCharArray();
            
            int aByte  = 0;
            int bByte  = 0;
            int carry  = 0;
            int aIndex = aArray.length - 1;
            int bIndex = bArray.length - 1;
            while (aIndex>-1 || bIndex>-1 || carry>0) {
                aByte = aIndex > -1 ? Character.getNumericValue(aArray[aIndex--]) : 0;
                bByte = bIndex > -1 ? Character.getNumericValue(bArray[bIndex--]) : 0;
                
                convert += String.valueOf(aByte ^ bByte ^ carry);
                carry = (aByte + bByte + carry) > 1 ? 1 : 0;
            }// end of while
            
            return new StringBuffer(convert).reverse().toString();
        }

  • 相关阅读:
    EF4.1中诡异的GUID为空问题
    asp.net mvc3 Razor引擎中@使用规则小记
    【推荐】JS面象对象编程视频教程
    【转】【More Effective C#】IEnumerable和IQueryable的那点事
    【你有更好的算法吗?】合并重叠时间段算法
    jquery处理textarea中的手动换行
    实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
    架设自己的NuGet服务器
    C#中用SelectSingleNode方法解析带有多个命名空间的XML文件
    解析入口参数为实体的表达式树
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4302246.html
Copyright © 2020-2023  润新知