加载中...
剑指 Offer II 002-二进制加法
发表于:2021-12-03 | 分类: 简单
字数统计: 1.1k | 阅读时长: 5分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/JFETK5

中文题目

给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。

输入为 非空 字符串且只包含数字 1 和 0

 

示例 1:

输入: a = "11", b = "10"
输出: "101"

示例 2:

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

 

提示:

  • 每个字符串仅由字符 '0''1' 组成。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 "0" ,就都不含前导零。

 

注意:本题与主站 67 题相同:https://leetcode-cn.com/problems/add-binary/

通过代码

高赞题解

刷题的过程中,类似的题目最好是一起来刷,这样效果非常的好!!!

不信的话,你往下看!!!

一个思路轻而易举的解决以下 5 道算法面试题:

  1. leetcode 989 号算法题:数组形式的整数加法
  2. leetcode 66 号算法题:加 1
  3. leetcode 415 号算法题:字符串相加
  4. 剑指 offer 002 号算法题:二进制求和
  5. leetcode 2 号算法题:两数相加

文末有题解链接~~~

注意:在看这道题解之前,请确保你已经看到了 leetcode 415 号算法题:字符串相加 的题解

题目解读

如果你对本题的题目已经理解,下面的视频可以跳过:

13_67_二进制求和.mp4

思路讲解 + 代码实现

请看下面的视频:

14_67_代码实现.mp4

代码如下:

[]
public String addBinary(String a, String b) { StringBuilder res = new StringBuilder(); int carry = 0; int l1 = a.length() - 1; int l2 = b.length() - 1; while (l1 >= 0 || l2 >= 0) { int x = l1 < 0 ? 0 : a.charAt(l1) - '0'; int y = l2 < 0 ? 0 : b.charAt(l2) - '0'; int sum = x + y + carry; res.append(sum % 2); carry = sum / 2; l1--; l2--; } if (carry != 0) res.append(carry); return res.reverse().toString(); }
[]
public: string addStrings(string num1, string num2) { string res = ""; int i1 = num1.length() - 1, i2 = num2.length() - 1; int carry = 0; while (i1 >= 0 || i2 >= 0) { int x = i1 >= 0 ? num1[i1] - '0' : 0; int y = i2 >= 0 ? num2[i2] - '0' : 0; int sum = x + y + carry; res.push_back('0' + sum % 2); carry = sum / 2; i1--; i2--; } if (carry != 0) res.push_back('0' + carry); reverse(res.begin(), res.end()); return res; }
[]
def addStrings(self, num1: str, num2: str) -> str: res = '' i1, i2, carry = len(num1) - 1, len(num2) - 1, 0 while i1 >= 0 or i2 >= 0: x = ord(num1[i1]) - ord('0') if i1 >= 0 else 0 y = ord(num2[i2]) - ord('0') if i2 >= 0 else 0 sum = x + y + carry res += str(sum % 2) carry = sum // 2 i1, i2 = i1 - 1, i2 - 1 if carry != 0: res += str(carry) return res[::-1]
[]
var addStrings = function(num1, num2) { let res = '' let i1 = num1.length - 1 let i2 = num2.length - 1 let carry = 0 while (i1 >= 0 || i2 >= 0) { const x = i1 >= 0 ? num1[i1] - '0' : 0 const y = i2 >= 0 ? num2[i2] - '0' : 0 const sum = x + y + carry res += (sum % 2) carry = Math.floor(sum / 2) i1-- i2-- } if (carry) res += carry return res.split("").reverse().join("") };
[]
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { dummy := &ListNode{Val: -1} curr, carry := dummy, 0 for l1 != nil || l2 != nil { x, y := 0, 0 if l1 != nil { x = l1.Val } if l2 != nil { y = l2.Val } sum := x + y + carry curr.Next = &ListNode{Val: sum % 10} // bug 修复:视频中忘了加上这一步 curr = curr.Next carry = sum / 10 if l1 != nil { l1 = l1.Next } if l2 != nil { l2 = l2.Next } } if carry != 0 { curr.Next = &ListNode{Val: carry} } return dummy.Next }

在刷题的时候:

  1. 如果你觉得自己数据结构与算法基础不够扎实,那么请点这里,这里包含了一个程序员 5 年内需要的所有算法知识

  2. 如果你感觉刷题太慢,或者感觉很困难,或者赶时间,那么请点这里。这里用 365 道高频算法题,带你融会贯通算法知识,做到以不变应万变

  3. 回溯、贪心和动态规划,是算法面试中的三大难点内容,如果你只是想搞懂这三大难点内容 请点这里

以上三个链接中的内容,都支持 Java/C++/Python/js/go 五种语言

接下来可以一起刷下面的 5 道算法题了:

  1. leetcode 989 号算法题:数组形式的整数加法
  2. leetcode 66 号算法题:加 1
  3. leetcode 415 号算法题:字符串相加
  4. leetcode 67 号算法题:二进制求和
  5. leetcode 2 号算法题:两数相加

统计信息

通过次数 提交次数 AC比率
11940 21309 56.0%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
剑指 Offer II 003-前 n 个数字二进制中 1 的个数
下一篇:
剑指 Offer II 082-含有重复元素集合的组合
本文目录
本文目录