困难题合集(1) | 豆包MarsCode AI刷题

46 阅读3分钟

55 二进制之和

问题理解
  • 输入是两个二进制字符串,表示两个非常大的数。由于二进制字符串可能非常长,直接使用整数类型(如 intlong)可能会导致溢出。
  • 为了处理大数,可以使用数组来存储每一位的二进制数。数组的大小需要足够大,以容纳两个二进制字符串相加后的结果,包括可能的进位。
解题思路
  1. 处理进位
    当前代码在将两个二进制字符串相加时,没有处理进位。需要在每次相加时检查是否有进位,并在下一位相加时加上进位。
  2. 数组大小
    当前代码创建的数组大小为 Math.max(b1, b2) + 1,但在处理进位时,可能会需要额外的一位来存储最高位的进位。
  3. 结果转换
    当前代码将二进制数组转换为十进制数时,使用了 Math.pow 函数,这会导致时间复杂度为 O(n^2) 。可以考虑直接将二进制数组转换为十进制字符串,避免使用 Math.pow
核心代码

关键知识点
  1. 大数处理
    • 大数的表示:由于二进制字符串可能非常长,直接使用整数类型(如 intlong)可能会导致溢出。因此,需要使用数组或 BigInteger 来处理大数。
    • BigIntegerBigInteger 是 Java 中用于处理任意长度整数的类。它可以处理非常大的数,避免了溢出的问题。
  1. 进位处理
    • 进位的计算:在二进制加法中,进位可以通过 sum / 2 计算得到。
    • 进位的处理:在每次相加时,需要将进位加到下一位的计算中。

19 字典序最小的01字符串

问题理解

我们需要通过最多 k 次相邻字符交换操作,使得01字符串的字典序最小,即二进制字符串表示数值最小

解题思路

贪心策略:尽可能将'1'从高位移动低位到上,即将其移动到数组后方。

字符数组转换: 将输入字符串 s 转换为字符数组 chars,便于后续操作。

边界处理: 如果字符串长度 n 小于等于1,直接返回原字符串;最多操作k 次。

因为只能交换相邻的两个数,若高位第一个的'1'后边跟着至少一个'1'那么交换是无意义的,选择交换与高位第一个的'1'相邻集合的最后一个'1'

核心代码

豆包AI改进思路
  1. 优先移动 '0' :应该优先考虑将 '0' 向左移动,而不是 '1'
  2. 贪心算法:每次选择最左边的 '0' 并将其尽可能向左移动,直到达到操作次数限制。
  3. 优化字符串操作:避免每次都生成新的字符串,直接在字符数组上操作。