大前端

前端学习之家-大前端

【每日一题033】leetcode-67

目录

  • 题目
  • 思路
  • 相关思考
  • 代码(C++/力扣)

题目

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

思路

1.转化为数字做,但是溢出了…放弃
2.按照评论中模拟全加器进行加减

相关思考

int类型转换为char类型需要+‘0’转换,且需要考虑首位也产生进位的情况

代码(C++/力扣)

class Solution {
public:
    string addBinary(string a, string b) {
        string res="";
        int la=a.length(),lb=b.length(),lm=max(la,lb);
        //加前导零对齐
        for(int i=la;i<lm;i++) a="0"+a;
        for(int i=lb;i<lm;i++) b="0"+b;
        //进位
        int carry=0;
        //模拟全加器,分别计算结果和进位值
        for(int i=lm-1;i>=0;i--){
            /*两位是a,b,上一位进位是c0,这一位进位是c,结果是s
            **s=a^b^c0
            **c=a&b|(c0&(a^b))
            */
            char temp=(a[i]-'0')^(b[i]-'0')^(carry)+'0';
            carry=((a[i]-'0')&(b[i]-'0'))|(carry&((a[i]-'0')^(b[i]-'0')));
            res=temp+res;
        }
        //如果算完还有进位,需要补个1
        if(carry==1)
            res="1"+res;
        return res;
    }
};

发表评论:

Copyright Your WebSite.Some Rights Reserved.