leetcode之Add Binary

版权所有:Leetcode

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

For example,
a = "11"
b = "1"
Return "100".

方法一:
Runtime:  392 ms
直接将运算结果保存到较长的字符串中。
step1:主要计算长度等于较短的字符串长度的位数,将较短的字符串与较长的字符串相加,结果存放在较长字符串中
step2:主要计算较长字符串比较短字符串多出来的部分
step3:主要处理进位,若有进位则增加存放结果的较长字符串的长度
由于计算是从最低位算起的,而01字符串的最低位在最右边,所以需要先反转字符串,最后再将结果反转回去。
涉及到字符串修改,益用StringBuffer
public class Solution {
	public String addBinary(String a, String b) {
		StringBuffer minlen = new StringBuffer(a).reverse();
		StringBuffer maxlen = new StringBuffer(b).reverse();
		
		if(a.length() > b.length()){
			StringBuffer tmp = minlen;
			minlen = maxlen;
			maxlen = tmp;
		}
		//step 1
		boolean carry = false;
		for(int i=0;i < minlen.length();i++){
			if(carry == false){
				if(minlen.charAt(i) != maxlen.charAt(i)){
					maxlen.setCharAt(i, '1');
				}else if(minlen.charAt(i) == '0'){
					maxlen.setCharAt(i, '0');
				}else{
					maxlen.setCharAt(i, '0');
					carry = true;
				}

			}else{
				if(minlen.charAt(i) != maxlen.charAt(i)){
					maxlen.setCharAt(i, '0');
				}else if(minlen.charAt(i) == '0'){
					maxlen.setCharAt(i, '1');
					carry = false;
				}else{
					maxlen.setCharAt(i, '1');
				}
			
			}
		}
		//step 2
		for(int i = minlen.length();i < maxlen.length();i++){
			if(carry == true){
				if(maxlen.charAt(i) == '1'){
					maxlen.setCharAt(i, '0');
				}else{
					maxlen.setCharAt(i, '1');
					carry = false;
				}
			}else{
				break;
			}
		}
		//step 3
		if(carry == true)
			maxlen.append('1');
		
		return maxlen.reverse().toString();
	}

}

方法二:
Runtime:  428 ms
结果存储在新的字符串中
public class Solution {
	public String addBinary(String a, String b) {
		a = new StringBuffer(a).reverse().toString();
		b = new StringBuffer(b).reverse().toString();
		String sum = "";
		boolean carry = false;
		for(int i=0;i < a.length() && i < b.length();i++){
			if(carry == false){
				if(a.charAt(i) != b.charAt(i)){
					sum = "1" + sum;
				}else if(a.charAt(i) == '0'){
					sum = "0" + sum;
				
				}else{
					sum = "0" + sum;
					carry = true;
				}
			}else {
				if(a.charAt(i) != b.charAt(i)){
					sum = "0" + sum;
				
				}else if(a.charAt(i) == '0'){
					sum = "1" + sum;
					carry = false;
				}else{
					sum = "1" + sum;
				}
			}
		}
		
		int minlen = a.length(), maxlen =  b.length();
		String exceed = null;
		if(minlen > b.length()){
			minlen = b.length();
			maxlen = a.length();
			exceed = a.substring(minlen);
		}else
			exceed = b.substring(minlen);
		
		StringBuffer sbexceed = new StringBuffer(exceed);
		if(carry == true){
			
			for(int i=0;i < sbexceed.length();i++){
				if(carry == true)
					switch(sbexceed.charAt(i)){
						case '0':{sbexceed.setCharAt(i, '1');carry = false;break;}
						case '1':{sbexceed.setCharAt(i, '0');break;}
					}
				else
					break;
			}
		}
		
		exceed = sbexceed.reverse().toString();
		if(carry == true)
			exceed = "1" + exceed;
		sum = exceed.toString() + sum;
		
		return sum;
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值