55 二进制之和
问题理解
- 输入是两个二进制字符串,表示两个非常大的数。由于二进制字符串可能非常长,直接使用整数类型(如
int或long)可能会导致溢出。 - 为了处理大数,可以使用数组来存储每一位的二进制数。数组的大小需要足够大,以容纳两个二进制字符串相加后的结果,包括可能的进位。
解题思路
- 处理进位:
当前代码在将两个二进制字符串相加时,没有处理进位。需要在每次相加时检查是否有进位,并在下一位相加时加上进位。 - 数组大小:
当前代码创建的数组大小为Math.max(b1, b2) + 1,但在处理进位时,可能会需要额外的一位来存储最高位的进位。 - 结果转换:
当前代码将二进制数组转换为十进制数时,使用了Math.pow函数,这会导致时间复杂度为O(n^2)。可以考虑直接将二进制数组转换为十进制字符串,避免使用Math.pow。
核心代码
关键知识点
- 大数处理:
-
- 大数的表示:由于二进制字符串可能非常长,直接使用整数类型(如
int或long)可能会导致溢出。因此,需要使用数组或BigInteger来处理大数。 - BigInteger:
BigInteger是 Java 中用于处理任意长度整数的类。它可以处理非常大的数,避免了溢出的问题。
- 大数的表示:由于二进制字符串可能非常长,直接使用整数类型(如
- 进位处理:
-
- 进位的计算:在二进制加法中,进位可以通过
sum / 2计算得到。 - 进位的处理:在每次相加时,需要将进位加到下一位的计算中。
- 进位的计算:在二进制加法中,进位可以通过
19 字典序最小的01字符串
问题理解
我们需要通过最多 k 次相邻字符交换操作,使得01字符串的字典序最小,即二进制字符串表示数值最小
解题思路
贪心策略:尽可能将'1'从高位移动低位到上,即将其移动到数组后方。
字符数组转换: 将输入字符串 s 转换为字符数组 chars,便于后续操作。
边界处理: 如果字符串长度 n 小于等于1,直接返回原字符串;最多操作k 次。
因为只能交换相邻的两个数,若高位第一个的'1'后边跟着至少一个'1'那么交换是无意义的,选择交换与高位第一个的'1'相邻集合的最后一个'1'。
核心代码
豆包AI改进思路
- 优先移动
'0':应该优先考虑将'0'向左移动,而不是'1'。 - 贪心算法:每次选择最左边的
'0'并将其尽可能向左移动,直到达到操作次数限制。 - 优化字符串操作:避免每次都生成新的字符串,直接在字符数组上操作。