46.大数和中的极值位问题 刷题笔记 | 豆包MarsCode AI 刷题

53 阅读3分钟

问题描述:

小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为 0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。 例如,字符串数 "111" 和 "222" 相加得到 "333",所有数字相同,因此位数差为 0。另一例子,字符串数 "111" 和 "34" 相加得到 "145",其中最大数是 '5' 位于第 3 位,最小数是 '1' 位于第 1 位,他们之间的位差为 1。

问题理解:

我们需要将两个字符串形式的数字相加,得到一个新的字符串。 然后,我们需要找出这个新字符串中最大数字和最小数字的位置,并计算它们之间的位数差距。 如果所有数字都相同,则差距为0。

数据结构选择:

使用字符串来表示和处理数字,因为数字可能非常大,无法用整数类型直接表示。

算法步骤:

将两个字符串形式的数字转换为整数并相加,再将结果转换回字符串形式。 遍历新字符串,找到最大数字和最小数字的位置。 计算最大数字和最小数字位置之间的距离。 返回这个距离。

图解:

假设我们有以下输入: string1 = "111" string2 = "34" 相加: 111 + 34 = 145 找到最大和最小数字: 最大数字是 5,位于第3位。 最小数字是 1,位于第1位。 计算位数差距: 最大数字位置是3,最小数字位置是1。 位数差距为 |3 - 1| = 2。

代码实现:

    nub_3 = str(int(string1) + int(string2))
    max_nub = max(nub_3)
    min_nub = min(nub_3)
    max_index = nub_3.index(max_nub)
    for i in range(len(nub_3)):
        if max_index + i < len(nub_3):
            if nub_3[max_index + i] == min_nub:
                min_index = max_index + i
                break
        if max_index - i >= 0:
            if nub_3[max_index - i] == min_nub:
                min_index = max_index - i
                break
    for i in range(len(nub_3)):
        if min_index + i < len(nub_3):
            if nub_3[min_index + i] == max_nub:
                max_index = min_index + i
                break
        if min_index - i >= 0:
            if nub_3[min_index - i] == max_nub:
                max_index = min_index - i
                break

    distance = abs(max_index - min_index)
    if distance > 0:
        distance -= 1
    return distance

if __name__ == "__main__":
    # 你可以添加更多测试用例
    print(solution("11000001", "44334434334444344333") == 0)

知识总结:

字符串操作: 字符串的拼接、转换(str 和 int 之间的转换)。 字符串的遍历和索引操作。 最大值和最小值的查找: 使用 max() 和 min() 函数来查找字符串中的最大和最小字符。 位置计算: 使用 index() 方法来查找字符在字符串中的位置。 计算两个位置之间的距离。 代码思路 字符串相加: 将两个字符串转换为整数并相加,再将结果转换回字符串。 查找最大和最小数字: 使用 max() 和 min() 函数找到最大和最小数字。 使用 index() 方法找到它们在字符串中的位置。 计算位数差距: 计算最大数字和最小数字位置之间的绝对距离。