01 题目
问题描述
小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为 0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。
例如,字符串数 "111" 和 "222" 相加得到 "333",所有数字相同,因此位数差为 0。另一例子,字符串数 "111" 和 "34" 相加得到 "145",其中最大数是 '5' 位于第 3 位,最小数是 '1' 位于第 1 位,他们之间的位差为 1。
测试样例
样例1:
输入:
string1 = "111",string2 = "222"输出:0
样例2:
输入:
string1 = "111",string2 = "34"输出:1
样例3:
输入:
string1 = "999",string2 = "1"输出:0
样例4:
输入:
string1 = "525",string2 = "474"输出:0
02 思路
注意:如果存在多个符合最大或最小条件的数,应该选择最小的位置差。
- 找到和中最大数和最小数
# 1.找到最大数和最小数
sum = int(string1) + int(string2)
list_sum = list(str(sum))
max_sum = max(list_sum)
min_sum = min(list_sum)
2. 如果最大数和最小数相同,返回0
if max_sum == min_sum:
return 0
3. 否则,找到所有最大的数的位置和所有最小的数的位置
# 3.找到所有最大的数的位置和所有最小的数的位置
max_index = [i for i,x in enumerate(list_sum) if x==max_sum]
min_index = [i for i,x in enumerate(list_sum) if x==min_sum]
4. 找到位置差最小的,此处位置差为下标相减再减一
min_d = abs(max_index[0] - min_index[0] -1)
for i in max_index:
for j in min_index:
d = abs(i - j - 1)
if d < min_d:
min_d = d
这里逻辑有点问题,应该先求绝对值再减一
float('inf')表示正无穷大
min_d = float('inf')
for i in max_index:
for j in min_index:
d = abs(i - j) - 1
if d < min_d:
min_d = d
注意:如果所有数字都相同,该算法不适用
03 代码
def solution(string1, string2):
# Please write your code here
# 1.找到最大数和最小数
sum = int(string1) + int(string2)
list_sum = list(str(sum))
max_sum = max(list_sum)
min_sum = min(list_sum)
# print(max_sum, min_sum)
# 2. 如果最大数和最小数相同,返回0
if max_sum == min_sum:
return 0
# 3.找到所有最大的数的位置和所有最小的数的位置
max_index = [i for i,x in enumerate(list_sum) if x==max_sum]
min_index = [i for i,x in enumerate(list_sum) if x==min_sum]
# print(min_index)
# print(max_index)
# 4.找到位置差最小的
min_d = float('inf')
for i in max_index:
for j in min_index:
d = abs(i - j) - 1
if d < min_d:
min_d = d
return min_d
if __name__ == "__main__":
# You can add more test cases here
# print(solution("111", "222") == 0 )
# print(solution("111", "34") == 1)
# print(solution("5976762424003073", "6301027308640389") == 6)
print(solution("999", "1"))