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

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义