ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode_字符串_简单_67.二进制求和

2021-09-20 23:31:02  阅读:152  来源: 互联网

标签:String 二进制 ans 字符串 length 67 carry LeetCode 进位


目录

1.题目

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。

示例 1:
输入: a = “11”, b = “1”
输出: “100”

示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”

提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 104
字符串如果不是 “0” ,就都不含前导零。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary

2.思路

(1)将字符串 a 和 b 转化成十进制数并求和,然后再转化为二进制数即可。不过当题目中字符串的长度非常大时,就有可能超过Java所能表示的范围,所以该思路具有一定的局限性。
(2)采用整数加法中列竖式的方法来求解本题,即将这两个二进制字符串从低位到高位逐位相加,并且记录相加过程中产生的进位,将其考虑到下一轮运算中即可。

3.代码实现(Java)

//(1)思路1
public String addBinary(String a, String b) {
    /*
        toBinaryString(int i):返回int变量的二进制表示的字符串
        Integer.parseInt(s,2):将字符串s转换为二进制的整数
    */
    return Integer.toBinaryString(Integer.parseInt(a,2)+Integer.parseInt(b,2));
}
//(2)思路2
public String addBinary(String a, String b) {
	//代码来自本题官方题解
	/*
		在使用 StringBuffer类时,每次都会对 StringBuffer对象本身进行操作,而不是生成新的对象,
		所以如果需要对字符串进行修改推荐使用StringBuffer,而此题可好需要需要对字符串进行修改。
	*/
    StringBuffer ans = new StringBuffer();
	//carry表示进位
    int n = Math.max(a.length(), b.length()), carry = 0;
    for (int i = 0; i < n; ++i) {
		//将a和b的最低位依次进行相加
        carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
        carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
		//将中间结果追加到ans之后
        ans.append((char) (carry % 2 + '0'));
		/* 
			进行上述的一次计算后,carry的可能取值为0、1或2
			1.carry=0,说明a、b当前位上的值均为'0',没有进位
			2.carry=1,说明a、b当前位上的值有一个位'0',有一个为'1',没有进位
			3.carry=2,说明a、b当前位上的值均为'1',产生进位
			当进行下一轮计算时,只有当carry=2时才产生了进位,此时需要使carry变成1,
			而其它情况下没有产生进位,则使carry变成0即可,而carry/=2正好满足要求
		*/
        carry/=2;
    }
	//如果进位大于0,则需要向高位添加一个"1"
    if (carry > 0) {
        ans.append('1');
    }
	/*
		reverse():将字符序列进行反转
		例如s="123",那么s.reverse()之后,s="321"
	*/
    ans.reverse();
	//以字符串的形式进行返回
    return ans.toString();
}

标签:String,二进制,ans,字符串,length,67,carry,LeetCode,进位
来源: https://blog.csdn.net/weixin_43004044/article/details/120337191

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有