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

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50623435 翻译给定两个二进制字符串,返回它们的和(也是二进制字符串)。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50623435

翻译

给定两个二进制字符串,返回它们的和(也是二进制字符串)。

例如,
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;
}

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

目录
相关文章
|
8月前
|
Java 编译器
LeetCode 190. 颠倒二进制位
LeetCode 190. 颠倒二进制位
50 0
【LeetCode-每日一题】-67. 二进制求和
【LeetCode-每日一题】-67. 二进制求和
Leetcode 236. Lowest Common Ancestor of a Binary Tree
根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定义没什么好解释的,主要是这道题的解法。
47 0
|
5月前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
7月前
|
存储 SQL 算法
LeetCode题目67:二进制求和
LeetCode题目67:二进制求和
|
7月前
|
算法 Java Go
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
99 2
|
7月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
8月前
【力扣】67. 二进制求和
【力扣】67. 二进制求和
|
8月前
LeetCode[题解] 2864. 最大二进制奇数
LeetCode[题解] 2864. 最大二进制奇数
40 0
|
8月前
|
算法 Java 编译器
☆打卡算法☆LeetCode 190. 颠倒二进制位 算法解析
☆打卡算法☆LeetCode 190. 颠倒二进制位 算法解析