zoukankan      html  css  js  c++  java
  • 【Add binary】cpp

    题目:

    Given two binary strings, return their sum (also a binary string).

    For example,
    a = "11"
    b = "1"
    Return "100".

    代码:

    class Solution {
    public:
        string addBinary(string a, string b) {
                std::string result;
                std::string::reverse_iterator ia = a.rbegin();
                std::string::reverse_iterator ib = b.rbegin();
                int carry = 0;
                for ( int sum=0, part_a=0, part_b=0; ia!=a.rend() || ib!=b.rend(); ia==a.rend()? a.rend() : ++ia, ib==b.rend()? b.rend() : ++ib )
                {
                    part_a = ia==a.rend() ? 0 : *ia-'0';
                    part_b = ib==b.rend() ? 0 : *ib-'0';
                    sum = part_a + part_b + carry;
                    result.insert(result.begin(), sum%2+'0');
                    carry = sum/2;
                }
                if ( carry==1 ) result.insert(result.begin(), '1');
                return result;
        }
    };

    tips:

    1. 熟悉string的一些方法:rbegin rend insert

    2. 熟悉int与其对应的char的转换方法。

    顺道复习了一下c++ primer plus上类型转换的章节:

    1. 赋值时进行转换: 变量类型不一样,可能产生潜在的丢失或者失去精度。

    2. 表达式中的转换

    3. 传参时类型转换

    4. 强制类型转换

    另外,

    part_a = ia==a.rend() ? 0 : *ia-'0'; (int)

    result.insert(result.begin(), sum%2+'0'); (char)

    同样是int与char之间的加减运算,为什么返回的类型不一样呢?

    猜测应该是这样的:运算时都转化成ASCII码的值进行加减;最后如果要求是int的就保持int型,需要是char的就转换成char型。

    c++ primer plus (第四版) 45~47讲解了这种转换。

    '0'可以理解为字符常量,在内存中就是按照整型存的。

    又试验了一下

    char c = 65+1;

    int i = 65+1;

    cout << c << endl;

    cout << i << endl;

    输出结果是:

    B

    66

    通过这个例子就可以记住char的一些性质了

    另外,通过这个例子,复习了单双引号的不同:c++中char常量用单引号括起;双引号表示字符串,二者差别还是很大的。

    PS:之前还傻搜字符跟整形转换... c++中将char在内存中存成了整型,正是因此带来了极大的便利,可以很轻松的通过加减来灵活处理字符。

    那么,如果是中文或者日文这种不止256个字符的语系呢?可以有wchar_t类型(本质就用来编码的bits比8位多了)

    wchar_t a = L'A' (前缀L表示宽字符常量)

    ========================================

    第二次过这道题,复习了一下digit跟char的一些操作运算。

    class Solution {
    public:
        string addBinary(string a, string b) {
                const int len_a = a.size();
                const int len_b = b.size();
                vector<char> ret;
                int i_a = len_a-1;
                int i_b = len_b-1;
                int carry = 0;
                while ( i_a>=0 || i_b>=0 )
                {
                    int part1 = i_a>=0 ? a[i_a] : '0';
                    int part2 = i_b>=0 ? b[i_b] : '0';
                    int tmp_sum = (part1-'0') + (part2-'0') + carry;
                    carry = tmp_sum / 2;
                    int curr = tmp_sum % 2;
                    ret.insert(ret.begin(), curr+'0');
                    i_a = i_a>=0 ? i_a-1 : i_a;
                    i_b = i_b>=0 ? i_b-1 : i_b;
                }
                if (carry==1) ret.insert(ret.begin(), carry+'0');
                return string(ret.begin(),ret.end());
        }
    };
  • 相关阅读:
    NSCache
    编译器 perforSelecter时 警告去除
    常用git命令
    LINUX系统自动化部署shell脚本
    个人工作总结10
    个人工作总结09
    个人工作总结-8
    个人工作总结07
    第八周学习进度
    对搜狗输入法的一些评价
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4481085.html
Copyright © 2011-2022 走看看