小U的数字插入问题 | 豆包MarsCode AI刷题

49 阅读5分钟

题目分析

这道题是小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。 你需要帮助小U找到这个插入位置,输出插入后的最大结果。

难点分析

  1. 选择合适的插入位置: 需要确定 b 应插入到 a 中的哪一位,以使得插入后的数字尽可能大。通常是当遇到一个比 b 小的数字时,就可以插入。
  2. 贪心策略: 这个问题是典型的贪心算法问题,解决方案依赖于我们每一步都做出局部最优选择,最终达到全局最优解。
  3. 边界条件的处理: 对于特定的输入(如 a 和 b 可能有不同的大小、b 可能为 0 等情况),我们需要小心处理,保证结果符合最大化的要求。
  4. 字符串比较与拼接: 由于数字可能非常大,采用字符串的方式进行比较与插入,可以有效避免溢出问题,并且能够简化逻辑处理。

解题思路

根据以上分析,解决问题可以分为以下步骤:

1. 理解数字插入对结果的影响:

这个问题实际上是对数字排列的一种优化。数字 b 会在某个位置插入到 a 中,并通过位置的选择,影响最终数值的大小。 数字越大,其所在的位数越重要。例如,数字 9 位于十万位和个位的影响是天差地别。所以,插入 b 的位置应该尽量选择在能够产生大数字的地方。

2. 寻找插入的位置:

我们需要遍历数字 a 中的每一位,然后寻找合适的插入点。贪心策略在这里非常有效:当遇到一个比 b 小的数字时,我们就把 b 插入到这个位置。这样做是因为,数字 b 插入到比它小的数字前面,可以保证得到更大的值。

特殊情况:  如果 b 是 0,它的插入位置就显得尤为关键,因为插入的位置将直接影响最终结果。b 是 0 时,通常我们选择尽量靠前插入,避免影响数值的大小。

3. 遍历与插入:

我们将数字 a 转换为字符串,这样可以方便地进行逐位比较与插入操作。然后,逐位检查,如果发现当前位的数字比 b 小,则在此位置插入 b,并结束插入过程。如果遍历完 a 后,仍然没有找到合适的位置,则说明 b 应该被插入到 a 的末尾。

4. 边界情况的处理:

如果 b 比 a 中的所有数字都大,或者 b 是一个零,那么 b 应该被插入到最前面。

如果 b 小于或等于 a 中的所有数字,则需要将 b 插入到最后。

具体代码实现

以下是 JavaScript 的代码实现:

JavaScript
 代码解读
复制代码
function solution(a, b) {
    // 将 a 和 b 转换为字符串
    let strA = a.toString();
    let strB = b.toString();
    
    // 初始化最大值为插入到最前面的情况
    let maxNum = parseInt(strB + strA);
    
    // 遍历所有可能的插入位置
    for (let i = 0; i <= strA.length; i++) {
        // 尝试将 strB 插入到 strA 的第 i 个位置
        let newNum = parseInt(strA.slice(0, i) + strB + strA.slice(i));
        
        // 比较并更新最大值
        if (newNum > maxNum) {
            maxNum = newNum;
        }
    }
    
    return maxNum;
}

function main() {
    console.log(solution(76543, 4) === 765443);
    console.log(solution(1, 0) === 10);
    console.log(solution(44, 5) === 544);
    console.log(solution(666, 6) === 6666);
}

main();

python代码如下:

python
 代码解读
复制代码
def solution(a: int, b: int) -> int:
    # 将 a 和 b 转换为字符串
    str_a = str(a)
    str_b = str(b)
    
    # 初始化最大值为插入到最前面的情况
    max_num = int(str_b + str_a)
    
    # 遍历所有可能的插入位置
    for i in range(len(str_a) + 1):
        # 尝试将 str_b 插入到 str_a 的第 i 个位置
        new_num = int(str_a[:i] + str_b + str_a[i:])
        
        # 比较并更新最大值
        if new_num > max_num:
            max_num = new_num
    
    return max_num

if __name__ == '__main__':
    print(solution(76543, 4) == 765443)
    print(solution(1, 0) == 10)
    print(solution(44, 5) == 544)
    print(solution(666, 6) == 6666)

关键步骤和细节

  1. 转换为字符串形式:将 a 和 b 都转换为字符串,方便进行逐位比较和拼接。
  2. 遍历 a 的每一位:从左到右遍历 a 的每一位,查找第一个比 b 小的数字。如果找到,则将 b 插入该位置。
  3. 插入操作:一旦找到合适位置,插入 b,并返回新数字。如果遍历结束没有找到插入位置,则将 b 插入到字符串末尾。
  4. 输出结果:拼接完成后的字符串即为最大数字,输出即可。

复杂度分析

1.时间复杂度:(O(n))

2.空间复杂度:(O(n))

总结:

这道题的解法虽然简单,但却非常具有启发性。它提醒我们在解决问题时,往往可以通过“局部最优”来实现“全局最优”。每一次选择都要尽量让当前的结果最为理想,最终形成的结果便是全局最优的。对数字进行字符串化操作,不仅避免了大数运算中的溢出问题,也在实现上极大地简化了逻辑,使得复杂度可控。这样,通过贪心算法,我们便有效地解决了这个问题。

作者:用户578856933617
链接:juejin.cn/spost/74396…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。