这段代码实现了两个大数加法,并计算其结果中最大与最小数字位置的最小差值。下面是代码的详细介绍和分析,包括功能、逻辑、复杂度以及测试用例。
功能概述
- 大数加法:
add_large_numbers函数用于将任意长度的两个数字字符串相加。 - 最大最小位置差:
find_min_distance函数计算大数相加结果中最大数字和最小数字之间的最小位置差。 - 主解决函数:
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",测试全相同数字
这些用例涵盖了普通情况、进位情况和检测所有数字相同的特殊情况。
通过这些案例的测试,整体逻辑是正确的,能有效处理大数相加及其最大最小值位置差的计算。
总结
以上代码有效实现了大数加法及其最大与最小数字位置的差值计算,适用于处理非常大的数字(超出普通整数范围的数字)