二进制求和

最近在做一些算法题目,就在这里做个记录。

题目:

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



思路:

1. 按位累加

2. 考虑进位

3. 结果长度是较长字符串长度或者较长字符串长度+1

不太会表达,直接贴源码了。

c++实现:

 1 class Solution {
 2 public:
 3     string addBinary(string a, string b) {
 4         int len_a = a.size();
 5         int len_b = b.size();
 6         if (len_a < len_b) {
 7             string tmp = a;
 8             a = b;
 9             b = tmp;
10         }
11         int len_l = a.size() - 1;  // length long
12         int len_s = b.size() - 1;  // length short
13         bool carry_flag = false;  // 进位标记
14         char* ret = new char[len_l + 2];
15         ret[len_l+1] = 0;
16         for (; len_s >= 0; len_s--, len_l--) {
17             /**
18                     三种情况
19                 1. a[len_s] == b[len_s] = ‘1‘  有进位
20                 2. a[len_s] != b[len_s] (0,1) or (1,0)
21                 3. a[len_s] == b[len_s] = 0
22             */
23             if (a[len_l] == b[len_s] && a[len_l] == ‘1‘) {
24                 if (carry_flag) {  // 如果已经有进位
25                     ret[len_l] = ‘1‘;
26                 } else {  // 如果没有进位
27                     ret[len_l] = ‘0‘;
28                     carry_flag = true;
29                 }
30             }
31             if (a[len_l] != b[len_s]) {
32                 if (carry_flag) {  // 如果有进位
33                     ret[len_l] = ‘0‘;
34                 } else {
35                     ret[len_l] = ‘1‘;
36                     carry_flag = false;
37                 }
38             }
39             if (a[len_l] == b[len_s] && a[len_l] == ‘0‘) {
40                 if (carry_flag) {
41                     ret[len_l] = ‘1‘;
42                 } else {
43                     ret[len_l] = ‘0‘;
44                 }
45                 carry_flag = false;
46             }
47         }
48         for (; len_l >= 0; len_l--) {
49             if (carry_flag) {
50                 if (a[len_l] == ‘1‘) {
51                     ret[len_l] = ‘0‘;
52                 } else {
53                     ret[len_l] = ‘1‘;
54                     carry_flag = false;
55                 }
56             } else {
57                 ret[len_l] = a[len_l];
58             }
59         }
60         string str_ret = "";
61         if (carry_flag) {
62             str_ret = "1" + string(ret);
63         } else {
64             str_ret = string(ret);
65         }
66         delete[] ret;
67         return str_ret;
68     }
69 };

Java实现:

注: Java代码不是自己写的了,在网上看到的,摘录在这里。

 1 public class Solution {
 2     public String addBinary(String a, String b) {
 3         if(a.length() < b.length()) {
 4             String temp = a;
 5             a =b;
 6             b = temp;
 7         }
 8         int la = a.length()-1;
 9         int lb = b.length()-1;
10         int carries = 0;  //进位
11         String res = "";  //结果值
12         while(lb >= 0) {  //先依据短字符串的长度依次计算
13             int sum = (int)(a.charAt(la)-‘0‘)+(int)(b.charAt(lb)-‘0‘)+carries;
14             res = String.valueOf(sum%2)+res;
15             carries =sum/2;
16             la--;
17             lb--;
18         }
19         while(la>=0){//再依据长字符串的长度依次计算
20             int sum = (int)(a.charAt(la)-‘0‘)+carries;
21             res = String.valueOf(sum%2)+res;
22             carries =sum/2;
23             la--;
24         }
25         if (carries==1){
26             res ="1"+res;//计算最后的进位
27         }
28         return res;
29     }
30 }

Python实现:

这段Python代码是同事写的,表示只有一句话啊,不过,我们一致认为,这不是正解。但是以后碰到进制转换可以使用这种。

1 class Solution(object):
2     def addBinary(self, a, b):
3         """
4         :type a: str
5         :type b: str
6         :rtype: str
7         """
8         return str(bin(int(a, 2) + int(b, 2)))[2:]

耗时都差不多

时间: 2024-10-16 08:52:56

二进制求和的相关文章

二进制求和(LintCode)

二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 细节出了好多问题,提交了好多次... 1 public class Solution { 2 /** 3 * @param a a number 4 * @param b a number 5 * @return the result 6 */ 7 public String addBinary(String a, String b) { 8 int c = 0; 9 int al =

lintcode 容易题:Add Binary 二进制求和

题目: 二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 解题: 和求两个链表的和很类似 考虑进位,考虑最后一项的进位 0+0 = 0 不需要进位 0+1 = 1 不需要进位 1+1 =0  进位 1 同时注意 低位进1,高位时1+1的情况,直接加就是3了,这个需要进位1 ,原位的结果也是1的情况 Java程序: public class Solution { /** * @param a a number * @param b a

【leetcode 简单】第十七题 二进制求和

实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842...,   由于返回类型是整数,小数部分将被舍去. #define PF(w) ((w)*(w)) int mySqrt(int x) { int start = 0; int end = x; double mid = 0; i

LeetCode67 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" //章节 - 数组和字符串 //三.字符串简介 //1.二进制求和 /* 算法思想: 这是常见题,思想大致相同.用两个指针分别

LintCode_408 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示). 思路 string s = ""; 目标字符串 cp 存储进位;取 0或1 sum = a[i] + b[i] + cp;分为四种情况 0   s += '0'; cp = 0; 1 s += '1'; cp = 0; 2 s += '0'; cp = 1; 3 s += '1'; cp = 1; C++实现 string addBinary(string& a, string& b) { // Write your

408 二进制求和

原题网址:https://www.lintcode.com/problem/add-binary/description 描述 给定两个二进制字符串,返回他们的和(用二进制表示). 您在真实的面试中是否遇到过这个题?  是 样例 a = 11 b = 1 返回 100 标签 二进制 字符串处理 思路1:直接按位相加,代码优化见:https://www.cnblogs.com/grandyang/p/5790441.html   大神就是大神,膜拜之 代码: string addBinary(st

Leetcode 67 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 解题思路 先将字符串转换为整数再转化为十进制数,进行相加后,再转换回二进制数 def addBinary(a, b): x=i

【leetcode 简单】第十六题 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" class Solution: def addBinary(self, a, b): """ :

leetcode 67. 二进制求和(Add Binary)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 解法: class Solution { public: str

【每天一题】LeetCode 67. 二进制求和

开源地址:https://github.com/jiauzhang/algorithms 题目描述 * https://leetcode-cn.com/problems/add-binary * 给定两个二进制字符串,返回他们的和(用二进制表示). * 输入为非空字符串且只包含数字 1 和 0. * * 示例 1: * 输入: a = "11", b = "1" * 输出: "100" * * 示例 2: * 输入: a = "1010