LeetCode题练习与总结:二进制求和--67

2024-04-16 06:04

本文主要是介绍LeetCode题练习与总结:二进制求和--67,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

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

示例 2:

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

提示:

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

二、解题思路

  1. 首先,我们需要理解二进制加法的基本原则。二进制加法类似于十进制加法,但是只有两个数字(0和1)参与计算。当两个位相加等于2时,我们需要进位,进位规则与十进制加法相同。
  2. 为了处理不同长度的输入字符串,我们需要先对较短的字符串进行补全。我们可以通过在字符串前面添加'0'来实现,直到两个字符串长度相同。
  3. 接下来,我们从两个字符串的末尾开始,逐位相加,并记录下每次相加是否产生进位。
  4. 最后,如果最后还有进位未处理,需要将其作为结果字符串的首位。

三、具体代码

public class Solution {public String addBinary(String a, String b) {// 确保a是较长的字符串if (a.length() < b.length()) {String temp = a;a = b;b = temp;}// 对较短的字符串b进行补全int diff = a.length() - b.length();StringBuilder sb = new StringBuilder();for (int i = 0; i < diff; i++) {sb.append('0');}sb.append(b);// 翻转字符串,便于从末尾开始相加a = new StringBuilder(a).reverse().toString();sb.reverse();// 初始化结果字符串和进位StringBuilder result = new StringBuilder();int carry = 0;// 逐位相加for (int i = 0; i < a.length(); i++) {int sum = carry + (a.charAt(i) - '0') + (sb.charAt(i) - '0');carry = sum / 2;result.append(sum % 2);}// 处理最后的进位if (carry != 0) {result.append(carry);}// 翻转结果字符串,得到最终答案return result.reverse().toString();}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 翻转字符串操作 asb 各需要 O(n) 的时间,其中 n 是字符串 a 的长度。
  • 补全字符串 b 需要 O(n) 的时间。
  • 逐位相加的过程需要 O(n) 的时间,因为它需要遍历两个字符串的所有字符。
  • 最后,翻转结果字符串 result 需要 O(n) 的时间。
  • 综上所述,主要的时间消耗在字符串的翻转和逐位相加上,这两个步骤都是 O(n) 的,因此整个函数的时间复杂度是 O(n)。
2. 空间复杂度
  • 我们创建了一个新的 StringBuilder 对象 sb 来补全字符串 b,它的长度与 a 相同,即 O(n)。
  • 我们还创建了另一个 StringBuilder 对象 result 来存储结果,最坏情况下,当两个字符串相加没有进位且长度相同时,结果的长度也是 O(n)。
  • 其他变量和临时字符串翻转操作的空间消耗是常数级别的。
  • 因此,整个函数的空间复杂度是 O(n)。

五、总结知识点

1. 字符串操作

  • length() 方法:用于获取字符串的长度。
  • StringBuilder 类:用于创建可变的字符串序列,提供了多种方法来操作字符串,如 append()reverse() 等。
  • charAt() 方法:用于获取字符串中指定位置的字符。

2. 基本数据类型和运算

  • int 类型:用于存储整数,这里用于存储字符串中字符的数值和进位。
  • 算术运算符:+ 用于加法运算,/ 用于整数除法,% 用于求余数,这些运算符在计算二进制和以及进位时使用。

3. 控制流

  • if 语句:用于条件判断,这里用于交换两个字符串的引用,确保 a 是较长的字符串。
  • for 循环:用于重复执行代码块,这里用于补全较短的字符串 b 和逐位相加两个字符串。

4. 逻辑运算

  • 位运算:在二进制加法中,我们使用了位运算符 /(整除)和 %(取余)来处理进位和当前位的和。

5. 字符串翻转

  • 通过 StringBuilderreverse() 方法,我们可以方便地翻转字符串。这对于从末尾开始逐位相加二进制字符串是非常有用的。

6. 变量和数据存储

  • 使用 StringBuilder 来构建结果字符串,而不是使用多个 + 操作符连接字符串,这是因为 StringBuilder 在内存中是连续存储的,可以有效地减少字符串连接时的内存分配和复制操作,提高性能。

7. 函数设计

  • 函数 addBinary 接收两个字符串参数 ab,并返回它们的二进制和。
  • 函数内部使用了局部变量来存储中间结果和状态,如 carry 用于记录进位,result 用于存储最终的二进制和。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:二进制求和--67的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907972

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

二进制文件转化成文本文件

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~   1.区别 如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇) 如果一

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()

tensorboard-----summary用法总结

Tensorflow学习笔记——Summary用法         最近在研究tensorflow自带的例程speech_command,顺便学习tensorflow的一些基本用法。 其中tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝。 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例