• LeetCode 67 Add Binary(二进制相加)(*)


    翻译

    给定两个二进制字符串,返回它们的和(也是二进制字符串)。
    
    比如,
    a = "11"
    b = "1"
    返回 "100".

    原文

    Given two binary strings, return their sum (also a binary string).
    
    For example,
    a = "11"
    b = "1"
    Return "100".

    分析

    我一開始写了这个算法,尽管实现了功能,只是不符合题目的用意。

    int ctoi(char c) {
        return (int)c - 48;
    }
    
    int pow2(int n) {
        int sum = 1;
        while ((n--) > 0)
            sum *= 2;
        return sum;
    }
    
    int btoi(string s) {
        int sum = 0, len = s.size();
        for (int i = 0; i < len; ++i) {
            sum += ctoi(s[i]) * pow2(len - i - 1);
        }
        return sum;
    }
    
    string itob(int n) {
        if (n == 0) return "0";
        string s = "";
        while (n >= 1) {
            if (n % 2 == 1)
                s += "1";
            else s += "0";
            n /= 2;
        }
        string newStr = "";
        for (int i = s.size() - 1; i >= 0; i--)
            newStr += s[i];
        return newStr;
    }
    
    string addBinary(string a, string b) {
        return itob(btoi(a) + btoi(b));
    }

    然后改了改,写出这么脑残的代码我自己都醉了……

    string addBinary(string a, string b) {
        if (a.size() < b.size()) swap(a, b);
        int len1 = a.size(), len2 = b.size();
        int comLen = len1 < len2 ? len1 : len2;
        int pos = 0;
        string str = "";
        for (int index1 = len1 - 1, index2 = len2 - 1; index1 > len1 - comLen, index2 >= 0; index1--, index2--) {
            if (pos == 0) {
                if (a[index1] == '1' && b[index2] == '1') {
                    str += "0";
                    pos = 1;
                }
                else if (a[index1] == '0' && b[index2] == '0') {
                    str += "0";
                }
                else {
                    str += "1";
                }
            }
            else if (pos == 1) {
                if (a[index1] == '1' &&b[index2] == '1') {
                    str += "1";
                    pos = 1;
                }
                else if (a[index1] == '0' && b[index2] == '0') {
                    str += "1";
                    pos = 0;
                }
                else {
                    str += "0";
                    pos = 1;
                }
            }
        }
    
        for (int index = len1 - comLen-1; index >= 0; index--) {
            if (pos == 0) {
                if (a[index] == '1') {
                    str += "1";
                }
                else {
                    str += "0";
                }
            }
            else if (pos == 1) {
                if (a[index] == '1') {
                    str += "0";
                    pos = 1;
                }
                else {
                    str += "1";
                    pos = 0;
                }
            }
        }
        if (pos == 1) str += "1";
        string newStr = "";
        for (int i = str.size() - 1; i >= 0; i--)
            newStr += str[i];
        return newStr;
    }

    转了一圈也没发现很简洁的代码,那就先这样了……

  • 相关阅读:
    深入理解redis数据类型
    js获取带#号链接后的参数
    js对象深拷贝与浅拷贝
    VUE + ElementUI 从搭建到运行
    python 输入一个整数,判断其是否既是3的倍数,又是5的倍数
    输入一个三位整数,顺序打印个位、十位、百位上的数
    python 输入三个整数,按照从小到大的顺序打印
    python 运算符与分支结构
    python 变量定义
    python 环境安装
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7152052.html
Copyright © 2020-2023  润新知