二进制求和

二进制求和

CategoryDifficultyLikesDislikes
algorithmsEasy (53.04%)1026-
Tags

math | string

Companies

facebook

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

1
2
输入:a = "11", b = "1"
输出:"100"

示例 2:

1
2
输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 10<sup>4</sup>
  • ab 仅由字符 '0''1' 组成
  • 字符串如果不是 "0" ,就不含前导零

Discussion | Solution

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
struct Solution;

// @lc code=start
use std::iter;

impl Solution {
    /// ## 解题思路
    /// - iterator
    pub fn add_binary(a: String, b: String) -> String {
        // 处理长度
        let (a, b) = match (a.len(), b.len()) {
            (la, lb) if la > lb => (a, b),
            _ => (b, a),
        };

        let a = format!("0{}", a);

        //
        let ab = a
            .chars()
            .rev()
            .zip(b.chars().rev().chain(iter::repeat('0')))
            .scan(0_u32, |carry, (x, y)| {
                let s = x as u32 + y as u32 + *carry % 2;
                *carry = s / 2;
                Some(char::from_digit(s % 2, 2))
            })
            .map(|c| c.unwrap_or('0'))
            .collect::<String>()
            .chars()
            .rev()
            .collect::<String>();

        if ab.len() > 1 && ab.starts_with('0') {
            String::from(&ab[1..])
        } else {
            ab
        }
    }
}
// @lc code=end

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test() {
        assert_eq!(
            Solution::add_binary("11".into(), "1".into()),
            "100".to_string()
        );
    }
}

updatedupdated2024-08-252024-08-25