每天 3 分钟,走上算法的逆袭之路。

前文合集

每日一道 LeetCode 前文合集

代码仓库

GitHub: https://github.com/meteor1993/LeetCode

Gitee: https://gitee.com/inwsy/LeetCode

题目:数组加一

题目来源:https://leetcode-cn.com/problems/add-binary/

给你两个二进制字符串,返回它们的和(用二进制表示)。

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

示例 1:

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

示例 2:

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

提示:

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

解题过程

方案一:偷鸡方法

每天做题就像一个开盲盒的过程,没开始之前,永远都不知道会遇到什么样的题目。

这道题我第一眼看过去,二进制加法?不会,我才不要自己去写一个二进制加法出来, Java 给我们提供了现成的 math 函数包,是用来看的么?

果断第一个想法是先把二进制转成十进制,做完加法以后再转回去做输出。

我就是个小机灵鬼。

public String addBinary(String a, String b) {
return decimalToBinary(binaryToDecimal(a).add(binaryToDecimal(b)));
} // 定义二进制转十进制
private BigInteger binaryToDecimal(String binarySource) {
return new BigInteger(binarySource, 2);
} // 定义十进制转二进制
private String decimalToBinary(BigInteger decimalSource) {
return decimalSource.toString(2);
}

代码上还可以精简一点写成一行,我是怕有同学看不懂,另外定义了两个方法,比如:

public String addBinary(String a, String b) {
return (new BigInteger(a, 2).add(new BigInteger(b, 2))).toString(2);
}

结果扔到 LeetCode 上去运行,直接给我报了个编译错误。

这个意思应该是不支持 BigInteger() 函数,难道我在前面加个导包?

import java.math.BigInteger;

class Solution {
public String addBinary(String a, String b) {
return (new BigInteger(a, 2).add(new BigInteger(b, 2)).toString(2));
}
}

果然添加了导包以后就正常了,就是这个执行耗时有点惨不忍睹。

果然每次取巧的方案最后消耗时长都是最坑的,还是老老实实的想办法自己实现一下二进制加法吧。

方案二:二进制加法

二进制加法和十进制是一样的,都是从低位开始往高位运算,只不过十进制是满 10 进 1 ,而二进制是满 2 进 1 。

我们接下来要做的就是模拟一下二进制的加法过程,从低位开始计算,并且实现满 2 进 1 这个操作。

public String addBinary_1(String a, String b) {
StringBuilder sb = new StringBuilder();
// 定义进位
int pre = 0;
for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = pre;
if (i >= 0) sum += a.charAt(i) - '0';
if (j >= 0) sum += b.charAt(j) - '0';
// 当前位添加至 sb
sb.append(sum % 2);
// 计算进位
pre = sum / 2;
}
// 进位如果为 1 则添加到 sb 上
if (pre == 1) sb.append('1');
// 反转字符串输出
return sb.reverse().toString();
}

上面这个算法其中有一点需要注意,就是为什么要做 a.charAt(i) - '0' 这样一步操作,因为直接通过 a.charAt(i) 取出来的是当前字符的 ASCII 值, 0 的 ASCII 值是 48 ,而 1 的 ASCII 值是 49 ,用这两个值都去减 '0' ,正好得到了我们需要的 1 或者 0 。

其余的计算当前位是取模,计算进位是做除法,这两个就不多说了,很常规的用法。

每日一道 LeetCode (15):二进制求和的更多相关文章

  1. 每日一道 LeetCode (41):阶乘后的零

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  2. LeetCode:二进制求和【67】

    LeetCode:二进制求和[67] 题目描述 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11" ...

  3. 每日一道 LeetCode (3):回文数

    前文合集 每日一道 LeetCode 文章合集 题目:回文数 题目来源:https://leetcode-cn.com/problems/palindrome-number/ 判断一个整数是否是回文数 ...

  4. 每日一道 LeetCode (5):最长公共前缀

    前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee: https://gitee.com ...

  5. 每日一道 LeetCode (6):有效的括号

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  6. 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  7. 每日一道 LeetCode (9):实现 strStr()

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  8. 每日一道 LeetCode (10):搜索插入位置

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. 每日一道 LeetCode (14):数组加一

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

随机推荐

  1. P4158 [SCOI2009]粉刷匠(洛谷)

    今天A了个紫(我膨胀了),他看起来像个贪心一样,老师说我写的是dp(dp理解不深的缘故QWQ) 直接放题目描述(我旁边有个家伙让我放链接,我还是说明出处吧(万一出处没有了)我讲的大多数题目都是出自洛谷 ...

  2. 《python编程从入门到实践》2.3字符串

    书籍<python编程从入门到实践> 2.3字符串 知识模块 print()函数,函数名称突出为蓝色,输出括号内的变量或者字符创. 变量名的命名:尽量小写字母加下划线并且具有良好的描述性, ...

  3. three.js 将图片马赛克化

    这篇郭先生来说说BufferGeometry,类型化数组和粒子系统的使用,并且让图片有马赛克效果(同理可以让不清晰的图片清晰化),如图所示.在线案例点击博客原文 1. 解析图片 解析图片和上一篇一样 ...

  4. react实战 : react 与 canvas

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个正六边形组件,而这个用 SVG 和 canvas 都可以.我选择 canvas. 所以就变成了在 react 中使用 canv ...

  5. 分布式 ID 解决方案之美团 Leaf

    分布式 ID 在庞大复杂的分布式系统中,通常需要对海量数据进行唯一标识,随着数据日渐增长,对数据分库分表以后需要有一个唯一 ID 来标识一条数据,而数据库的自增 ID 显然不能满足需求,此时就需要有一 ...

  6. Nginx安全优化与性能调优

    目录 Nginx基本安全优化 隐藏Nginx软件版本号信息 更改源码隐藏Nginx软件名及版本号 修改Nginx服务的默认用户 修改参数优化Nginx服务性能 优化Nginx服务的worker进程数 ...

  7. zabbix修改默认密码

    1.mysql -u root -p 2.desc users; 3.select userid,alias,passwd from users; 4.update users set passwd= ...

  8. 02_Linux实操篇

    第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...

  9. Python模块_import语句_from...import 函数名_from ... import *

    Python模块:包含了所有定义的函数和变量的文件,后缀名为 .py 将某些方法存放在文件中,当某些脚本 或 交互式需要使用的时候,导入进去. 导入的文件,就称为模块.导入之后就可以使用导入的文件的函 ...

  10. 《闲扯Redis九》Redis五种数据类型之Set型

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...