大数和中的极值位距离 题解| 豆包MarsCode AI刷题

32 阅读3分钟

问题描述

小R需要解决两个超大字符串数相加后,求结果字符串中最大数和最小数之间的位数差。具体要求:

  1. 如果结果中的所有数字都相同,则位差为 0
  2. 如果存在多个最大数或最小数,选择最小的位数差。
  3. 超大字符串可能超出普通整数范围,需用字符串处理。

解题思路

1. 字符串数相加

由于字符串数可能非常大,因此将字符串直接转为整数进行相加操作:

python
复制代码
num_sum = int(string1) + int(string2)

2. 检查所有数字是否相同

将结果数字转为字符串形式,使用 set 提取唯一数字:

  • 如果结果中所有数字都相同,则返回 0,无需进一步计算。
python
复制代码
result_str = str(num_sum)
if len(set(result_str)) == 1:
    return 0

3. 找到最大数和最小数的位置

提取结果字符串中的最大数和最小数,记录其在字符串中的所有位置:

  • 遍历字符串,用 enumerate 找出所有最大和最小数字的索引位置。

4. 计算最小位数差

针对最大数和最小数的所有索引位置,计算两者的绝对位数差,记录最小的差值:

  • 使用两层循环遍历最大和最小数字的索引位置。
  • 对每对索引计算差值,更新最小位数差。

5. 返回结果

返回最小位数差(注意索引从0开始,因此实际距离为差值 - 1)。


代码实现

以下是完整的代码实现:

def solution(string1, string2):
    # 将两个字符串数转为整数并相加
    num_sum = int(string1) + int(string2)
    result_str = str(num_sum)
    
    # 如果结果中的所有数字都相同,直接返回 0
    if len(set(result_str)) == 1:
        return 0
    
    # 找到最大数和最小数
    max_digit = max(result_str)
    min_digit = min(result_str)
    
    # 记录最大数和最小数的所有位置
    max_positions = [i for i, x in enumerate(result_str) if x == max_digit]
    min_positions = [i for i, x in enumerate(result_str) if x == min_digit]
    
    # 计算最小位数差
    min_distance = float('inf')
    for max_pos in max_positions:
        for min_pos in min_positions:
            min_distance = min(min_distance, abs(max_pos - min_pos))
    
    # 返回最小位数差(索引从 0 开始,实际距离需减 1)
    return min_distance - 1

复杂度分析

  1. 时间复杂度

    • 转换整数、相加、转字符串:O(n),其中 n 是字符串的长度。
    • 遍历结果字符串以记录最大和最小数的位置:O(m),其中 m 是结果字符串长度。
    • 计算位数差:O(p * q),p 和 q 分别是最大数和最小数的位置数。

    综合复杂度为 O(n + m + p * q),一般情况下运行效率较高。

  2. 空间复杂度

    • 使用了一些临时变量,如字符串和索引列表,复杂度为 O(m)。

测试用例

用例 1

  • 输入:string1 = "111"string2 = "222"
  • 输出:0
  • 解释:111 + 222 = 333,所有数字相同。

用例 2

  • 输入:string1 = "111"string2 = "34"
  • 输出:1
  • 解释:111 + 34 = 145,最大数是 5 位于第3位,最小数是 1 位于第1位,位差为 1

用例 3

  • 输入:string1 = "999"string2 = "1"
  • 输出:0
  • 解释:999 + 1 = 1000,所有数字相同。

用例 4

  • 输入:string1 = "525"string2 = "474"
  • 输出:0
  • 解释:525 + 474 = 999,所有数字相同。

总结

这道题的关键在于:

  1. 处理超大字符串数相加:利用 Python 的大整数特性,直接转为整数相加。
  2. 最大最小数字的位置比较:通过记录所有索引位置,计算最小位数差。
  3. 特例处理:对所有数字相同的特例单独返回 0