leetcode-java 二进制求和

二进制求和

题目描述:

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"
示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

问题分析:

	关于这个题,有两种大的解题思路:
		1,作为使用 java 解答的算法题,可以直接使用字符函数进行操作,借助 
				StringBuilder res = new StringBuilder();
				res.append(sum % 2);
				res.reverse().toString();
				三个函数,使用多种方法解答
		2,将字符串转化为数组,使用数组加减后,传递进位,得到最后的数组,进行 Arrays.toString()
		   但是不推荐使用,很麻烦,而且没有必要

代码展示(已验证):

//leetcode-java
class Solution {
    public String addBinary(String a, String b) {
        int m = a.length() - 1;
		int n = b.length() - 1;
		int key = 0;
		// 创建 res 对象
		StringBuilder res = new StringBuilder();
		// 借用 sum 处理 字符串
		while (m > -1 || n > -1) {
			int sum = key;
			sum += m > -1 ? a.charAt(m--) - '0' : 0;
			sum += n > -1 ? b.charAt(n--) - '0' : 0;
			res.append(sum % 2);
			key = sum / 2;
		}
		// 加上最后一个 key 值
		res.append(key == 0 ? "" : key);
		// 翻转后 以 String 形式 return
		return res.reverse().toString();
// 		int[] a1= new int[a.length()];
// 		int[] b1 = new int[b.length()];
		
// 		// 将字符串 倒序 放入数组
// 		int n1=0;
// 		for(int i=a.length()-1; i>=0; i--)		
// 			a1[i] = Integer.parseInt(String.valueOf(a.charAt(n1++)));
		
// 		int n2 =0;
// 		for(int j=b.length()-1; j>=0; j--)
// 			b1[j] = Integer.parseInt(String.valueOf(b.charAt(n2++)));
		
// 		int num = Math.min(a.length(), b.length());
// 		int num1 = Math.max(a.length(), b.length());

// 		int[] c = new int[num1];
// 		int key=0;
// 		for(int i=0; i< num; i++)
// 		{
// 			if(a1[i]+b1[i]+key >= 2)
// 			{
// 				c[i] = (a1[i]+b1[i]+key)%2;
// 				key = 1;
				
// 			}
// 			else
// 				{
// 					c[i] = a1[i]+b1[i]+key;
// 					key = 0;
// 				}
// 		}
		
// 		if(a.length() == b.length())
// 		{
// 			if(key == 1)
// 			{
// 				int[] d = new int[num1+1];
// 				int j=0;
// 				for(int i=num1-1; i>=0; i--)
// 				{
// 					d[j] = c[i];
// 					j++;
// 				}
// 				d[num1] = 1;
// 				return Arrays.toString(d);
// 			}
// 			else
// 			{
// 				int[] d = new int[num1];
// 				int j=0;
// 				for(int i=num1-1; i>=0; i--)
// 				{
// 					d[j] = c[i];
// 					j++;
// 				}
// 				return Arrays.toString(d);
// 			}
// 		}
// 		else if( a.length()>b.length() )
// 		{
// 			for(int j=num; j<num1; j++)
// 			{
// 				if(a1[j]+key >= 2)
// 				{
// 					c[j] = (a1[j]+key)%2;
// 					key = 1;
// 				}
// 				else
// 				{
// 					c[j] = a1[j] + key;
// 					key = 0;
// 				}
// 			}		
// 		}
// 		else if(a.length() < b.length())
// 		{
// 			for(int j=num; j<num1; j++)
// 			{
// 				if(b1[j]+key >= 2)
// 				{
// 					c[j] = (b1[j]+key)%2;
// 					key = 1;
// 				}
// 				else
// 				{
// 					c[j] = b1[j] + key;
// 					key = 0;
// 				}
// 			}		
// 		}

// 		// 将最后的进位,加进去
// 		if(key == 1)
// 		{
// 			int[] d = new int[num1+1];

// 			for(int i=0; i<num1; i++)
// 			{
// 				d[i] = c[i];
// 			}
// 			d[num1] = 1;
// 			// 需要一次翻转
// 			int[] e = new int[num1+1];
// 			int j=0;
// 			for(int i=num1; i>=0; i--)
// 				{
// 					e[j] = d[i];
// 					j++;
// 				}
// 			return Arrays.toString(e);
// 		}
// 		else
// 		{
// 			int[] d = new int[num1];
// 			for(int i=0; i<num1; i++)
// 				{
// 					d[i] = c[i];
// 				}
// 			//需要一次翻转
// 			int[] e = new int[num1];
// 			int j=0;
// 			for(int i=num1-1; i>=0; i--)
// 			{
// 				e[j] = d[i];
// 				j++;
// 			}
// 			return Arrays.toString(e);
// 		}
    }
}

泡泡:

解答这个题的时候,先用了 第二种方法,真的是做的欲哭无泪,到后来真正用java中函数写的时候,觉得真的是太浪费了,所以注意使用的
方法,以及这个方法的使用是否更简单,效率更高,当然,实践最能看出问题,哈哈。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值