【LeetCode】67. 二进制求和

题目链接

https://leetcode-cn.com/problems/add-binary/submissions/

注意点

最高位相加后可能产生进位,也要计算在内。

解法

解法1:逐位相加

按照一般的加法运算方式考虑,从最高位开始,将两个字符串的值相加。

这里涉及到两个主要的问题:

1.两个字符串位数不同怎么办?

2.数字和字符的转换问题。

对于第一个问题,可以用一个问号表达式解决

int aa=i>=0 ? a[i--]-'0':0;//不用根据位数讨论的方法
int bb=j>=0 ? b[j--]-'0':0;

这个问号表达式的含义就是,如果当前遍历的序号为负值,说明已经完成了最高位的计算,将该位赋值0,参与计算。

对于第二个问题,一开始考虑的时候有点脑筋转不过来的嫌疑,总想着从一而终,因为最后需要的是字符串的形式,那就干脆不转数字,用字符串相加减,判断进位,但实际上,做运算的时候还是把字符转换为数字比较容易判断进位,加入结果的时候再变为字符形式。

执行用时 :
4 ms
, 在所有 C++ 提交中击败了
83.50%
的用户

内存消耗 :
6.7 MB
, 在所有 C++ 提交中击败了
100.00%
的用户

class Solution {
public:
    string addBinary(string a, string b) {
        int jinwei=0;
        string res="";
        int i=a.size()-1,j=b.size()-1;
        while(i>=0 || j>=0){
            int aa=i>=0 ? a[i--]-'0':0;//不用根据位数讨论的方法
            int bb=j>=0 ? b[j--]-'0':0;
            res+=(aa+bb+jinwei)%2+'0';
            jinwei=(aa+bb+jinwei)/2;
        }
        if(jinwei!=0) res+="1";//最后可能还有进位
        reverse(res.begin(),res.end());
        return res;
    }
};

遇到问题

1.两个字符串位数不同怎么办?

2.数字和字符的转换问题。

小结

掌握不用分类讨论的位数相加;字符和数字相互转换的快捷模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值