LeetCode刷题(31)~二进制求和【字符串易错!】

举报
海轰Pro 发表于 2021/08/06 00:46:23 2021/08/06
【摘要】 题目描述 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = "11", b = "1" 输出: "100" 12 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 12 提示: 每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。1 <...

题目描述

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

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

示例 1:

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

  
 
  • 1
  • 2

示例 2:

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

  
 
  • 1
  • 2

提示:

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

解答

代码

class Solution {
public: string addBinary(string a, string b) { int i = a.length() - 1; int j = b.length() - 1; int carry = 0; string builder; //循环相加两个字符串相同长度的低位数部分 while (i >= 0 && j >= 0) { int sum = carry; sum += a.at(i--) - '0';//将char类型的1转化为int类型的1 sum += b.at(j--) - '0'; carry = sum / 2; //是否进位 builder+=to_string((sum % 2)); } // 如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分 while (i >= 0) { int sum = carry + a.at(i--) - '0'; carry = sum / 2; builder+=to_string(sum % 2); } // 如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分 while (j >= 0) { int sum = carry + b.at(j--) - '0'; carry = sum / 2; builder+=to_string(sum % 2); } //如果 carry 不等于0 还有个进位数没加进去,需要补充 if (carry == 1) { builder+=to_string(carry); } //反转字符串获得正常结果 reverse(builder.begin(),builder.end()); return builder; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

运行结果
在这里插入图片描述
代码(巧妙!!!)

string addBinary(string a, string b) { string result=""; // 反转 a、b reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); // 求出a b 较长字符串的长度 int n=max(a.size(),b.size()); // 进位 初始为0 int count=0; for(int i=0;i<n;++i) { // 这一步非常巧妙 // i<a.size()? (a[i]=='1'):0 // 若i<a.size(),  返回  a[i]=='1' ,若符合相等,则直接返回数字1 反之 返回数字0 // 若i>=a.size() 就返回0 其实就是填充0 只是并不是真正的填充,只是计算的时候加上0 // 非常好的一个写法 count+= i<a.size()? (a[i]=='1'):0; count+= i<b.size()? (b[i]=='1'):0; // 计算结果 并 更新进位 result+=(count%2)? '1':'0'; count/=2; } // 如最后进位为1 就需要在字符串最后加上‘1’ 即可 if(count==1) result+='1'; // 记得再反转回去 reverse(result.begin(),result.end()); return result; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行结果
在这里插入图片描述

C++测试代码

#include <iostream>
#include<vector>
#include<unordered_map>
#include<stack>
#include <algorithm>
using namespace std;
// 方法一
string addBinary_1(string a, string b) { int i = a.length() - 1; int j = b.length() - 1; int carry = 0; string builder; //循环相加两个字符串相同长度的低位数部分 while (i >= 0 && j >= 0) { int sum = carry; sum += a.at(i--) - '0';//将char类型的1转化为int类型的1 sum += b.at(j--) - '0'; carry = sum / 2; //是否进位 builder+=to_string((sum % 2)); } // 如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分 while (i >= 0) { int sum = carry + a.at(i--) - '0'; carry = sum / 2; builder+=to_string(sum % 2); } // 如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分 while (j >= 0) { int sum = carry + b.at(j--) - '0'; carry = sum / 2; builder+=to_string(sum % 2); } //如果 carry 不等于0 还有个进位数没加进去,需要补充 if (carry == 1) { builder+=to_string(carry); } //反转字符串获得正常结果 reverse(builder.begin(),builder.end()); return builder; }
// 方法二 将短的字符串填充0 再依次相加 巧妙
string addBinary_2(string a, string b) { string result=""; // 反转 a、b reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); // 求出a b 较长字符串的长度 int n=max(a.size(),b.size()); // 进位 初始为0 int count=0; for(int i=0;i<n;++i) { // 这一步非常巧妙 // i<a.size()? (a[i]=='1'):0 // 若i<a.size(),  返回  a[i]=='1' ,若符合相等,则直接返回数字1 反之 返回数字0 // 若i>=a.size() 就返回0 其实就是填充0 只是并不是真正的填充,只是计算的时候加上0 // 非常好的一个写法 count+= i<a.size()? (a[i]=='1'):0; count+= i<b.size()? (b[i]=='1'):0; // 计算结果 并 更新进位 result+=(count%2)? '1':'0'; count/=2; } // 如最后进位为1 就需要在字符串最后加上‘1’ 即可 if(count==1) result+='1'; // 记得再反转回去 reverse(result.begin(),result.end()); return result; }
int main()
{ string a="100"; string b="010"; cout<<addBinary_2(a,b)<<endl; return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
参考:https://leetcode-cn.com/problems/add-binary/solution/er-jin-zhi-qiu-he-by-leetcode-solution/

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/107899472

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。