408. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示) 样例 a = 11 b = 1 返回 100 非常惭愧还不是自己想来的算法,注意到几点: 1.数字字符减去‘0’可以得到其对应的int值。 2.可以先都加上(无非加上得到0,1,2)然后逐位进行进位处理. 下面的程序就是这样的一种思路,这里发现一个自己没注意的点,导致一些数据通过不了,如果是三种或三种以上互斥的情况,要用if-else语句的话中间都要用else if,因为else值匹配离其最近的if。比如

if (case 1)
    {---- ; }
if(case 2)
{------;}
else 
{------;}
//这里的else就可能包含了case1的情况,如果在if里面返回函数值可能还觉察不到这个问题,但是如果知识一般的判断和处理数据,这个问题就很严重。

code:

  string addBinary(string &a, string &b) {
       int size_a=a.size();
       int size_b=b.size();
       if(size_a<=0||size_b<=0)
       {
           return string();
       }
        resortString(a);   //重排字符串使得低位在前
        resortString(b);
        string res;   //存放结果
        int i=0;
        int carry=0; //进位标志
        for(i=0;i<size_a&&i<size_b;i++)  //把相同的位先加上
        {
            res+='0'+(a[i]-'0')+(b[i]-'0');   //前面的那个‘0’保证加完还是字符
            
        }
        for(;i<a.size();i++)
        {
            res+=a[i];
        }
        for(;i<b.size();i++)
        {
            res+=b[i];
        }
        //到这里就都加上了,加完以后每一位上可能是0,1,2.
        //下面要处理进位了,
        for(i=0;i<res.size();i++)
        {
            int temp=res[i]-'0'+carry;   
            //这里是不同的情况,进位之后可能是2,或者3,也可能是1,0
            if(temp==2)   //进位之后本位是0了
            {
                carry=1;
                res[i]='0';   
               
            }
            else if(temp==3)   //进位之后本位是1,这个else特别重要,如果是这种好几种情况的话一定要每次都加上else
            {
                carry=1;
                res[i]='1';
            }
            else{
                carry=0;
                res[i]=temp+'0';  //不进位,两种情况,tem=1或者0,直接赋值就可以
            }
        }
        if(carry==1)  //如果最后一位还有进位,那么再加上一个1
        {
            res+='1';
        }
        resortString(res);
        return res;
        
        // write your code here
        
    }
    
    void resortString(string &a)    //重排字符串
    {
        for(int i=0;i<a.size()/2;i++)
        {
            swap(a[i],a[a.size()-1-i]);
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 55. 比较字符串

    比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母 样例 给出 A = "ABCD" B = "ACD",返回 tru...

    和蔼的zhxing
  • 4. 丑数 II 暴力遍历找规律利用set暴力去重排序。

    设计一个算法,找出只含素因子2,3,5 的第 n 小的数。 符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12... 样例 如果...

    和蔼的zhxing
  • 剑指offer刷题记(C++版本)

    也算是临时抱佛脚了吧,3月之前刷了lintcode100多道题吧,后来发文章什么的就放下了,最近秋招在即在牛客网上想着把剑指offer这本书刷完,尽量早刷完吧,...

    和蔼的zhxing
  • HDU 1525 Euclid's Game

    ShenduCC
  • 【Go 语言社区】Go语言Slice去重

    package main import ( "fmt" ) func main() { a := []int{2, 1, 2, ...

    李海彬
  • PYTHON 自动化运维 -- 绘制数据库表空间变化图

    已oracle为例(sql语句见文末:根据自己的修改,比如PDB名字,保存的位置等):

    大大刺猬
  • linux/shell:列出所有ip地址及对应的物理网卡

    基本的思路就是用route命令列出所有的网卡名,然后再用ifconfig配合字符串匹配找出对应的ip地址,示例如下:

    用户1148648
  • 09年8月14日 ECUST ACM 练习赛总结

    今天在湖南的OJ上做题,发现不到两小时,他服务器就挂了,但是发现他和POJ上的一些题一样而且是连号的,就到POJ上继续了,我们队出了6题。

    owent
  • PAT 甲级 1019 General Palindromic Number(简单题)

    1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制...

    ShenduCC
  • 源码阅读--Collections.sort

    这是一个boolean值。说白了就是,如果用户指定归并排序那就归并排序,否则就是ComparableTimSort。归并排序比较常见,就不讲了。贴一下Compa...

    提莫队长

扫码关注云+社区

领取腾讯云代金券