前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-67. 二进制求和(java)

LeetCode-67. 二进制求和(java)

作者头像
bug菌
发布2023-05-27 15:23:53
1830
发布2023-05-27 15:23:53
举报

一、前言:

👨‍🎓作者:bug菌 ✏️博客:CSDN​、掘金等 💌公众号:​​猿圈奇妙屋​​ 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

二、题目描述:

题目:        给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 ​​1​​​ 和 ​​0​​。

具体请看如下示例:

示例 1:

代码语言:javascript
复制
输入: a = "11", b = "1"
 输出: "100"

示例 2:

代码语言:javascript
复制
输入: a = "1010", b = "1011"
 输出: "10101"

提示:

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

题目来源:​​LeetCode官网​​题目难度:⭐⭐

三、思路分析:

       上一题刚刷加一。这又出来一题二进制求和,思路相对还是比较清晰的,逢2进1嘛。整体思路就是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历两两计算,得到最终结果。

       不确定最后的结果是否会多出一位进位,所以根据进位标记进行判断: 

  •  定义一个进位标记flag,然后再进行值相加 sum = a.charAt(i) + b.charAt(i) + flag;此时sum就存在三种情况。
  • 当sum = 2,说明需要进位,flag  = 1,此时ans = ‘0’+ans;
  • 当sum = 3,说明不仅需要进位,flag = 1,此时ans= ‘1’ + ans;
  • 当sum为其他, 则不需要进位,flag = 0;ans = sum+ans;

四、算法实现:

补齐法_AC代码:

具体算法代码实现如下:

代码语言:javascript
复制
class Solution {
     public String addBinary(String a, String b) {
         String ans = "";
         //补0
         if (a.length() < b.length()) {
             String temp = a;
             a = b;
             b = temp;
         }
         //长度做差
         int len =  a.length() - b.length();
         //补零操作
         if (a.length() != b.length()) {
             for (int i = 0; i < len; i++) {
                 b = '0' + b;
             }
         }
         //标记是否需要进位
         int flag = 0;
         //进行叠加
         for (int i = a.length() - 1; i >= 0; i--) {
             int aNum = a.charAt(i) - '0';
             int bNum = b.charAt(i) - '0';
             int sum = aNum + bNum + flag;
             //需要进位且本身=0
             if (sum == 2) {
                 ans = "0" + ans;
                 flag = 1;
                 //需要进位,且本身=1
             } else if (sum == 3) {
                 ans = "1" + ans;
                 flag = 1;
             } else {
                 //不需要动
                 ans = sum + ans;
                 flag = 0;
             }
         }
         //确保最后一位需要进位
         if (flag == 1) {
             ans = "1" + ans;
         }
         return ans;
     }
 }

五、总结:

补齐法之leetcode提交运行结果截图如下:

LeetCode-67. 二进制求和(java)_字符串
LeetCode-67. 二进制求和(java)_字符串

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

       综上所示,与十进制数相加是一样的思路,逢十进一,与逢二进一,只要把握是否需要进位即可,不需要则直接拼接两数之和,需要再判断此刻是0还是1.

       再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

       好啦,以上就是本期的所有内容啦,咱们下期见咯。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言:
  • 二、题目描述:
  • 三、思路分析:
  • 四、算法实现:
  • 五、总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档