LeetCode 67. Add Binary 二进制求和 (Java)

题目:

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:
Input: a = “11”, b = “1”
Output: “100”

Example 2:
Input: a = “1010”, b = “1011”
Output: “10101”

解答:

解法一:

首先想到了用以下方法,思路为:
(1)对字符串等长位数进行求和,使用temp表示进位数。
(2)每一对应位的真实求和current= 进位数+a字符串同位置的值+b字符串同位置的值
(3)进位数 temp= current/2
(4)结果值result = 进位值temp与之前的结果值result拼接

class Solution {
    public String addBinary(String a, String b) {
        //调整字符串a、b的顺序,使a字符串始终是最长的
        if(a.length()<b.length()){
            String c=a;
            a=b;
            b=c;
        }
        int al=a.length()-1;
        int bl=b.length()-1;
        int current=0;  //当前位加和
        int temp=0;  //进位数
        String result="";   //最终计算结果
        while(bl>=0){
        	//ASCII码相减,char'0'的十进制数值为48,(a.charAt(al) -'0') 算出a字符串在al位置的十进制数值,将字符串类型转换成int类型
            current=(a.charAt(al)-'0')+(b.charAt(bl)-'0')+temp;
            temp=current/2;
            result=current%2+result;
            al--;
            bl--;
        }
        while(al>=0){
            current=(a.charAt(al)-'0')+temp;
            temp=current/2;
            result=current%2+result;
            al--;
        }   
        if(temp==1){
            result=temp+result;
        }
        return result;
    }
}

其中要注意char数据类型的计算
char类型是可以运算的,因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待

char m='a';            //a

char m='a'+'b';        //? (char类型相加,提升为int类型,输出对应的字符,a和b分别对应的数值为97和98,相加等于195,其对应的字符为?)

int m='a'+'b';         //195(没有超出int范围,直接输出195)

char m=197;            //?(输出字符编码表中对应的字符)

char m='197;           //报错,因为有单引号,表示是字符,只允许放单个字符。

char m='a'+1;          //b(提升为int,计算结果98对应的字符是b)

char m='中'+'国';       //42282

char m='中'+'国'+'国'+'国';      //报错(int转char有损失,因为结果已经超出char类型的范围)

int m='中'+'国'+'国'+'国';       //86820

char m='中'+1;         //丮(1是int,结果提升为int,输出对应的字符)

char m='中'+"国";      //报错,String无法转换为char。

System.out.println('中'+"国");  //中国,没有变量附值的过程。String与任何字符用“+”相连,转换为String。

用单引号’ '标识,只能放单个字符。
char+char,char+int——类型均提升为int,附值char变量后,输出字符编码表中对应的字符。

char a = 97;                //为char类型变量 a 赋值常量值 97。

char b = 'a'+3;            //d(97+3=100,ASCII对应的字符为d)

char c = a+3;              //报错,无法从int类型转换为char类型

char c=(char)(a+3);        //d  
//(可以认为' a '=97),常量(97)与常量(3)运算得到一个新的常量(100),常量赋值给变量(b),不存在强制转换,只要这个接受变量(b)的类型范围大于这个常量即可。而变量声明时需要定义数据类型(例:char a),内存就为这个变量划分一个char类型大小的空间,其中变量(a)的值是可变的,而常量(3)的值是不变的,两个运算得到的还是一个变量,本例中(a+3)是int类型的变量,而int类型变量(a+3)赋值给char类型变量(c)需要强制转换,因此会报错。

在jvm内存机制中,char类型数据运算是将字符在ASCII表对应的整数以int类型参与运算

解法二:

参考他人解法,一个稍微优化的解法:
使用一个while循环完成所有的相加操作,当a或者b的长度>=0时,当短的加完的时候,两个if会只相加长的剩余二进制,另外一个if不执行。

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer sb=new StringBuffer();
        int al=a.length()-1;
        int bl=b.length()-1;
        int temp=0;   //进位
        while(al>=0||bl>=0){
            int sum=temp;
            if(al>=0){
                sum+=a.charAt(al)-'0';
                al--;
            }
            if(bl>=0){
                sum+=b.charAt(bl)-'0';
                bl--;
            }
            sb.append(sum%2);
            temp=sum/2;
        }
        if(temp==1){
            sb.append(1);
        }
        return sb.reverse().toString();
    }
}

StringBuffer的append()方法
StringBuffer其实是动态字符串数组,append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号,跟String不同的是StringBuffer是放一起的。String1+String2 和Stringbuffer1.append(“yyyy”)虽然打印效果一样,但在内存中表示却不一样。
String1+String2 存在于不同的两个地址内存
Stringbuffer1.append(Stringbuffer2)放在一起
StringBuffer的reverse()方法
public StringBuffer reverse()将此字符序列用其反转形式取代。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值