大数和中的极值位距离
解题思路
大数加法
首先需要实现一个函数来处理大数的加法。由于输入的数字是字符串形式,直接相加可能会超出Python的整数范围,因此需要逐位相加并处理进位。
查找极值位
在相加后的结果字符串中,找到最大和最小的数字,并计算它们之间的最小位置差。 特殊情况处理如果结果字符串中的所有数字都相同,则直接返回 0。
代码解析
add_large_numbers 函数
该函数实现了两个大数的加法。具体步骤如下:
- 补齐长度:将较短的数字在前面补0,使两个数字长度相同。1
- 逐位相加:从右向左逐位相加,并处理进位。1
- 处理最后的进位:如果最后还有进位,添加到结果的最高位。2
- 反转结果:将结果反转并转换为字符串返回。1
find_min_distance 函数
该函数在结果字符串中找出最大值和最小值的最小位置差。具体步骤如下:
- 特殊情况处理:如果所有数字都相同,返回0。1
- 找到最大和最小数字:记录最大和最小数字及其最后出现的位置。1
- 遍历字符串:记录每个数字最后出现的位置,并更新最小距离。1
- 返回最小距离:返回最小距离减1(如果最小距离不为字符串长度)。1
solution 函数
该函数是主函数,计算两个大数相加后的最大最小值位置差。具体步骤如下:
- 计算两数之和:调用
add_large_numbers函数计算两数之和。1 - 计算最大最小值的最小位置差:调用
find_min_distance函数计算最大最小值的最小位置差。1
"""实现大数加法"""
# 将较短的数字在前面补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",测试全相同数字