“大数和中的极值位距离”解题方法与心得 | 豆包MarsCode AI刷题

219 阅读4分钟

“大数和中的极值位距离”解题方法与心得 | 豆包MarsCode AI刷题

说在前面

经过一些简单题的训练,逐渐找到了当年学编程时的感觉,找了一题较为简单的中等题目来练手并撰写解题方法与心得。

“大数和中的极值位距离”,这道题目涉及超大数的字符串相加、极值查找、以及位差计算,是一道适合练习字符串操作、逻辑判断的题目。

题目解析

问题描述

题目要求两个超大数相加后,找到结果中最大数和最小数之间的位数差距。若结果中所有数字相同,则差距为0;若存在多个符合最大或最小的数字,需选择最小的位差。具体例子如下:

  • 输入 string1 = "111", string2 = "34",输出为1,因为相加结果为"145",最大值是'5'在第三位,最小值是'1'在第一位,它们的位差为1。
  • 输入 string1 = "999", string2 = "1",输出为0,因为相加结果为"1000",所有数字相同。

解决思路

这道题的解题流程大致如下:

  1. 字符串转换与相加:首先,将输入的两个字符串数转换为整数相加,再将结果转换回字符串,以便后续操作。
  2. 最大与最小数字查找:遍历相加结果的字符串,记录最大和最小数字及其所在的位置。
  3. 位数差计算:根据最大值和最小值的位置,找到它们的最小位数差。
  4. 返回结果:若最大值和最小值相同,则返回0;否则返回最小位数差减去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

代码详解

  1. 字符串相加sum_str = str(int(string1) + int(string2)) 先将字符串转换为整数相加,得到相加后的字符串结果。
  2. 最大与最小值查找:通过遍历sum_str字符串,逐位比较字符大小,并记录最大、最小数字及其对应的位置。
  3. 位差计算:当找到多个最大或最小位置时,使用嵌套循环计算所有位置对的距离,选取最小的位差。

测试用例

为了确保代码的可靠性,我使用了以下测试用例:

if __name__ == "__main__":
    print(solution("111", "222") == 0 )
    print(solution("111", "34") == 1)
    print(solution("999", "1") == 0)
    print(solution("525", "474") == 0)
    print(solution("5976762424003073", "6301027308640389") == 6)

知识总结与学习心得

在本题中,我收获了以下几点:

  1. 字符串与数字的灵活转换:当处理超大数时,使用字符串表示数字是非常有效的,因为Python内置的整数类型支持任意大小的整数,但字符串形式可以更直观地逐位处理数字。
  2. 双重循环的应用:在寻找最小距离时,通过嵌套循环比对最大与最小值的位置,可以确保找到最小距离。这里需要注意的是如何避免重复计算,以提升效率。
  3. 条件判断的精细设计:本题要求在“若最大最小相同则返回0”这一条件下特别注意,这个逻辑需要在位差计算前单独判断,这样能避免不必要的计算。

我的学习计划

使用豆包MarsCode AI刷题确实能够让我逐渐捡起编程、算法的能力与理解(虽然原来也不怎么样),所以接下来我有空就会来AI刷题练练手,还是主打一些简单题和中等题,先打牢打牢基础吧。

工具运用

  1. AI 辅助功能:借助豆包MarsCode的代码自动补全和错误提示功能,可以加速调试过程,减少低级错误,提升编码效率。
  2. 题解分析:有时就算自己有思路也可以学习到不同的思路和优化方法。尤其是遇到较为复杂题目时,参考AI的解题方法有时候会获得意想不到的解题方式或者自己不知道的现成的函数。

期待在豆包MarsCode AI平台上与大家共同进步。