青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

49 阅读3分钟

这段代码实现了两个大数加法,并计算其结果中最大与最小数字位置的最小差值。下面是代码的详细介绍和分析,包括功能、逻辑、复杂度以及测试用例。

功能概述

  1. 大数加法
    add_large_numbers 函数用于将任意长度的两个数字字符串相加。
  2. 最大最小位置差
    find_min_distance 函数计算大数相加结果中最大数字和最小数字之间的最小位置差。
  3. 主解决函数
    solution 函数结合以上两个功能,返回最终结果。

代码详细分析

1. add_large_numbers 函数

python
def add_large_numbers(num1: str, num2: str) -> str:  
    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])  
  • 对齐长度:使用 zfill 方法在较短字符串前面补零,使两个数字的长度相同。
  • 逐位相加:从右到左逐位相加,考虑进位。
  • 记录进位:将进位存储,并在最后加到结果中。
  • 结果反转:最终结果的位顺序需要反转后返回。

2. find_min_distance 函数

python
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  
  • 检查同一性:如果所有字符都相同,返回 0。
  • 找到极值:确定字符串中的最大和最小数字。
  • 记录位置并更新最小距离:遍历字符串并记录最后出现的位置,同时跟踪最大和最小数字之间的最小距离。

3. solution 函数

python
def solution(string1: str, string2: str) -> int:  
    sum_result = add_large_numbers(string1, string2)  
    return find_min_distance(sum_result)  
  • 此函数通过调用上述两个函数,得到两个字符串相加的结果,并计算其中最大和最小数字位置差。

复杂度分析

  • 时间复杂度

    • add_large_numbers:O(n),其中 n 是较长数字的长度。
    • find_min_distance:O(m),其中 m 是加法结果的长度,最坏情况为 n + 1(如在加法中出现进位)。
    • 整体时间复杂度为 O(n)。
  • 空间复杂度

    • add_large_numbers 需要一个列表存储结果,复杂度为 O(n)。
    • find_min_distance 使用了不少于常量大小的额外空间,所以空间复杂度为 O(1)。

测试用例

在 __main__ 块中,提供了一些测试用例来验证代码的正确性:

python
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",测试全相同数字  

这些用例涵盖了普通情况、进位情况和检测所有数字相同的特殊情况。

通过这些案例的测试,整体逻辑是正确的,能有效处理大数相加及其最大最小值位置差的计算。

总结

以上代码有效实现了大数加法及其最大与最小数字位置的差值计算,适用于处理非常大的数字(超出普通整数范围的数字)