刷题实践:大数和中的极值位距离 | 豆包MarsCode AI刷题

118 阅读5分钟

问题描述

小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为 0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。

例如,字符串数 "111" 和 "222" 相加得到 "333",所有数字相同,因此位数差为 0。另一例子,字符串数 "111" 和 "34" 相加得到 "145",其中最大数是 '5' 位于第 3 位,最小数是 '1' 位于第 1 位,他们之间的位差为 1。

测试样例:

示例一:

输入:string1 = "111",string2 = "222"

输出:0

示例二:

输入:string1 = "111",string2 = "34"

输出:1

示例三:

输入:string1 = "999",string2 = "1"

输出:0

示例四:

输入:string1 = "525",string2 = "474"

输出:0

解题思路

  1. 字符串转整数求和

    • 使用 int() 函数将输入的字符串 string1 和 string2 转换为整数。

    • 将这两个整数相加,得到的结果再次使用 str() 函数转换回字符串格式存储在 sum_str 中。

    • 代码示例:sum_str = str(int(string1) + int(string2))

  2. 初始化变量

    • 初始化 max_d 和 min_d 为字符串 sum_str 的第一个字符,因为至少有一个最大值和最小值。

    • 初始化空列表 max_p 和 min_p 用于存储最大值和最小值的位置。

    • 代码示例:max_d = min_d = sum_str[0] 和 max_p = []min_p = []

  3. 遍历求最大最小数字及其位置

    • 使用 enumerate() 遍历 sum_str,对每个字符进行比较,更新 max_d 和 min_d

    • 如果当前字符大于 max_d,则更新 max_d 并重置 max_p 为当前位置的列表。

    • 如果当前字符小于 min_d,则更新 min_d 并重置 min_p 为当前位置的列表。

    • 如果当前字符等于 max_d 或 min_d,则将当前位置添加到相应的列表中。

    • 代码示例:

for i, digit in enumerate(sum_str):
    if digit > max_d:
        max_d = digit
        max_p = [i]
    elif digit == max_d:
        max_p.append(i)

    if digit < min_d:
        min_d = digit
        min_p = [i]
    elif digit == min_d:
        min_p.append(i)
  1. 处理最大最小数字相等的情况

    • 如果 max_d 和 min_d 相等,说明所有数字都相同,直接返回0。

    • 代码示例:if max_d == min_d: return 0

  2. 计算最小位差

    • 使用嵌套循环遍历 max_p 和 min_p,计算每一对位置之间的差值,找出最小的位差。

    • 代码示例:

min_distance = float('inf')
for p_of_max in max_p:
    for p_of_min in min_p:
        distance = abs(p_of_max - p_of_min)
        if distance < min_distance:
            min_distance = distance
  1. 返回结果

    • 由于位置索引是从0开始的,而问题要求的是位数差,所以最终结果需要减去1。

    • 代码示例:return min_distance - 1

核心代码

def solution(string1, string2):
    # 将字符串转换为整数后相加,再转回字符串
    sum_str = str(int(string1) + int(string2))
    max_d = '0'
    min_d = '9'
    max_p = []
    min_p = []

    # 遍历每个字符,找到最大最小的数字及其位置
    for i, digit in enumerate(sum_str):
        if digit > max_d:
            max_d = digit
            max_p = [i]
        elif digit == max_d:
            max_p.append(i)

        if digit < min_d:
            min_d = digit
            min_p = [i]
        elif digit == min_d:
            min_p.append(i)

    # 若最大值和最小值相等,返回0
    if max_d == min_d:
        return 0

    # 计算最小位差
    min_distance = float('inf')
    for p_ofmax in max_p:
        for p_ofmin in min_p:
            distance = abs(p_ofmax - p_ofmin)
            if distance < min_distance:
                min_distance = distance

    return min_distance - 1

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)

核心知识

  • 字符串与整数的转换:在Python中,int() 和 str() 函数用于在字符串和整数之间转换,这对于处理数字字符串非常有用。

  • 遍历字符串enumerate() 函数提供了一种方便的方式来遍历字符串,同时获取字符的索引和值。

  • 条件判断与更新:在遍历过程中,使用条件语句来更新最大值和最小值及其位置,这是动态规划中常见的技术。

  • 嵌套循环:在计算最小位差时,嵌套循环用于比较所有可能的位置对,以找到最小位差。

  • 绝对值运算abs() 函数用于计算两个位置之间的距离,确保位差始终为非负值。

总结

  1. 理解问题:首先,要清楚理解问题的要求,即找出两个大字符串相加后,结果中最大和最小数字之间的最小位差。

  2. 选择合适的数据结构:在这个问题中,使用字符串来处理数字,然后通过列表来记录最大和最小数字的位置。

  3. 注意边界条件:在处理最大最小数字相等的情况时,直接返回0,这是一个重要的边界条件。

  4. 优化思考:在计算最小位差时,可以考虑是否有必要使用嵌套循环,或者是否有更优的算法来减少计算量。

  5. 代码清晰性:在编写代码时,保持代码的可读性和清晰性,使用清晰的变量名和注释来解释关键步骤。

  6. 测试验证:通过添加测试案例来验证代码的正确性,确保所有逻辑都被正确实现,特别是边界条件的处理。

使用豆包marscode AI的优势

  1. 项目规划辅助:AI可以根据算法的复杂度和开发者的工作习惯,辅助进行项目规划和时间管理,提高开发效率。

  2. 个性化推荐:根据开发者的编程习惯和偏好,MarsCode AI可以提供个性化的算法和解决方案推荐。

  3. 社区和协作:MarsCode AI可以集成到开发者社区中,允许开发者分享和获取解决方案,促进知识的共享和团队间的协作。

  4. 持续学习与适应:MarsCode AI可以不断从用户的编程习惯和社区的共享中学习,不断优化其提供的解决方案,以适应不断变化的编程需求和最佳实践。