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

67 阅读3分钟

题目分析

小R需要解决的问题是计算两个由数字字符组成的超大字符串数相加后,得到的字符串数中的最大数和最小数之间的位数差距。这个问题可以分为两个主要步骤:

  1. 大数加法:由于字符串数可能非常大,超出了标准数据类型的处理范围,因此需要实现一个能够处理大数加法的函数。
  2. 寻找最大最小数的位置差:在加法结果字符串中,找出最大数和最小数出现的位置,并计算它们之间的最小位置差。

解题思路

  1. 大数加法实现

    • 将两个字符串数对齐,较短的字符串前面补零。
    • 从字符串的末尾开始,逐位相加,并处理进位。
    • 将每一位的和拼接到结果字符串中。
  2. 寻找最大最小数的位置差

    • 如果结果字符串中所有数字都相同,直接返回0。
    • 记录最大数和最小数最后出现的位置。
    • 遍历结果字符串,更新最大数和最小数的位置,并计算它们之间的最小位置差。

代码解析

def add_large_numbers(num1: str, num2: str) -> str:
    """实现大数加法"""
    # 将较短的数字在前面补0,使两个数字长度相同
    max_len = max(len(num1), len(num2))
    num1 = num1.zfill(max_len)
    num2 = num2.zfill(max_len)
    
    carry = 0  # 进位
    result = []
    
    # 从右向左逐位相加
    for i in range(max_len - 1, -1, -1):
        digit_sum = int(num1[i]) + int(num2[i]) + carry
        carry = digit_sum // 10
        result.append(str(digit_sum % 10))
    
    # 处理最后的进位
    if carry:
        result.append(str(carry))
    
    # 反转结果并转换为字符串
    return ''.join(result[::-1])

def find_min_distance(sum_str: str) -> int:
    """在结果字符串中找出最大值和最小值的最小位置差"""
    if len(set(sum_str)) == 1:  # 如果所有数字都相同
        return 0
        
    # 找到最大和最小数字
    max_digit = max(sum_str)
    min_digit = min(sum_str)
    
    # 记录每个数字最后出现的位置
    last_pos = {}
    # 记录当前找到的最小距离
    min_distance = len(sum_str)
    
    # 遍历字符串,记录位置并更新最小距离
    for i, digit in enumerate(sum_str):
        if digit == max_digit or digit == min_digit:
            # 如果另一个极值已经出现过
            for prev_digit, prev_pos in last_pos.items():
                if (digit == max_digit and prev_digit == min_digit) or \
                   (digit == min_digit and prev_digit == max_digit):
                    min_distance = min(min_distance, i - prev_pos)
            last_pos[digit] = i
            
    return min_distance - 1 if min_distance != len(sum_str) else min_distance

def solution(string1: str, string2: str) -> int:
    """主函数:计算两个大数相加后的最大最小值位置差"""
    # 计算两数之和
    sum_result = add_large_numbers(string1, string2)
    # 计算最大最小值的最小位置差
    return find_min_distance(sum_result)

if __name__ == "__main__":
    # 测试用例
    print(solution("111", "222") == 0)  # 结果是"333",所有数字相同,差距为0
    print(solution("111", "34") == 1)   # 结果是"145",最大值5和最小值1的位置差为1
    print(solution("999", "1") == 0)    # 结果是"1000",最大值1和最小值0的位置差为0
    print(solution("525", "474") == 0)  # 结果是"999",所有数字相同,差距为0
    print(solution("5976762424003073", "6301027308640389") == 6)  # 大数测试
    
    # 额外测试用例
    print(solution("99", "1") == 0)     # 结果是"100",测试进位情况
    print(solution("555", "444") == 0)  # 结果是"999",测试全相同数字

代码注释

  • add_large_numbers函数用于实现大数加法,处理两个字符串表示的数字相加,并返回它们的和,也是一个字符串。

  • find_min_distance 函数用于找到结果字符串中最大值和最小值之间的最小位置差。如果所有数字都相同,则返回0。

  • solution 函数是主函数,它首先调用 add_large_numbers 来计算两个大数的和,然后调用 find_min_distance 来找到和字符串中最大和最小数字之间的最小位置差。