问题描述
小R需要解决两个超大字符串数相加后,求结果字符串中最大数和最小数之间的位数差。具体要求:
- 如果结果中的所有数字都相同,则位差为
0。 - 如果存在多个最大数或最小数,选择最小的位数差。
- 超大字符串可能超出普通整数范围,需用字符串处理。
解题思路
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
复杂度分析
-
时间复杂度:
- 转换整数、相加、转字符串:O(n),其中
n是字符串的长度。 - 遍历结果字符串以记录最大和最小数的位置:O(m),其中
m是结果字符串长度。 - 计算位数差:O(p * q),
p和q分别是最大数和最小数的位置数。
综合复杂度为 O(n + m + p * q),一般情况下运行效率较高。
- 转换整数、相加、转字符串:O(n),其中
-
空间复杂度:
- 使用了一些临时变量,如字符串和索引列表,复杂度为 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,所有数字相同。
总结
这道题的关键在于:
- 处理超大字符串数相加:利用 Python 的大整数特性,直接转为整数相加。
- 最大最小数字的位置比较:通过记录所有索引位置,计算最小位数差。
- 特例处理:对所有数字相同的特例单独返回
0。