[LeetCode] 67. Add Binary 二进制数相加
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1
or 0
.
Example 1:
Input: a = "11", b = "1" Output: "100"
Example 2:
Input: a = "1010", b = "1011" Output: "10101"
解法: 从最低位加到最高位,当前位相加结果是%2,进位是/2,记得处理每一次的进位和最后一次的进位,最后反向输出字符。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Solution { public String addBinary(String a, String b) { StringBuilder sb = new StringBuilder(); int i = a.length() - 1 , j = b.length() - 1 , carry = 0 ; while (i >= 0 || j >= 0 ) { int sum = carry; if (j >= 0 ) sum += b.charAt(j--) - '0' ; if (i >= 0 ) sum += a.charAt(i--) - '0' ; sb.append(sum % 2 ); carry = sum / 2 ; } if (carry != 0 ) sb.append(carry); return sb.reverse().toString(); } } |
Java:
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 | public class AddBinary { public String addBinary(String a, String b) { StringBuilder result = new StringBuilder(); int pointerA = a.length()- 1 ; int pointerB = b.length()- 1 ; int carry = 0 ; while (pointerA>= 0 || pointerB>= 0 ){ int sum = carry; if (pointerA>= 0 ){ sum += (a.charAt(pointerA)- '0' ); pointerA--; } if (pointerB>= 0 ){ sum += (b.charAt(pointerB)- '0' ); pointerB--; } result.append(sum% 2 ); carry = sum/ 2 ; } if (carry!= 0 ){ result.append( '1' ); } return result.reverse().toString(); } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution: # @param a, a string # @param b, a string # @return a string def addBinary( self , a, b): result, carry, val = "", 0 , 0 for i in xrange ( max ( len (a), len (b))): val = carry if i < len (a): val + = int (a[ - (i + 1 )]) if i < len (b): val + = int (b[ - (i + 1 )]) carry, val = val / 2 , val % 2 result + = str (val) if carry: result + = str (carry) return result[:: - 1 ] |
Python:
1 2 3 4 5 6 7 8 9 10 | class Solution: def addBinary( self , a, b): if len (a) = = 0 : return b if len (b) = = 0 : return a if a[ - 1 ] = = '1' and b[ - 1 ] = = '1' : return self .addBinary( self .addBinary(a[ 0 : - 1 ],b[ 0 : - 1 ]), '1' ) + '0' if a[ - 1 ] = = '0' and b[ - 1 ] = = '0' : return self .addBinary(a[ 0 : - 1 ],b[ 0 : - 1 ]) + '0' else : return self .addBinary(a[ 0 : - 1 ],b[ 0 : - 1 ]) + '1' |
Python:
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 | class Solution( object ): def addBinary( self , a, b): """ :type a: str :type b: str :rtype: str """ res = '' carry = 0 i, j = len (a) - 1 , len (b) - 1 while i > = 0 or j > = 0 : su = carry if i > = 0 : su + = int (a[i]) if j > = 0 : su + = int (b[j]) carry = su / 2 res + = str (su % 2 ) i - = 1 j - = 1 if carry > 0 : res + = str (carry) return res[:: - 1 ] |
C++ 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Solution { public : string addBinary(string a, string b) { string res; size_t res_len = max(a.length(), b.length()) ; size_t carry = 0; for ( int i = 0; i < res_len; ++i) { const size_t a_bit_i = i < a.length() ? a[a.length() - 1 - i] - '0' : 0; const size_t b_bit_i = i < b.length() ? b[b.length() - 1 - i] - '0' : 0; size_t sum = carry + a_bit_i + b_bit_i; carry = sum / 2; sum %= 2; res.push_back( '0' + sum); } if (carry) { res.push_back( '0' + carry); } reverse(res.begin(), res.end()); return res; } }; |
C++ 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public : string addBinary(string a, string b) { string res = "" ; int m = a.size() - 1, n = b.size() - 1, carry = 0; while (m >= 0 || n >= 0) { int p = m >= 0 ? a[m--] - '0' : 0; int q = n >= 0 ? b[n--] - '0' : 0; int sum = p + q + carry; res = to_string(sum % 2) + res; carry = sum / 2; } return carry == 1 ? "1" + res : res; } }; |
Followup:
如果不是二进制相加,而是十六进制相加呢?只要把算法中的除2和余2换成16,并添加相应的十六进制字母就行了。
如果是带小数的?
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架