青训营X豆包MarsCode 技术训练营:AI刷题笔记-02 | 豆包MarsCode AI 刷题

84 阅读3分钟

AI刷题笔记02

题目描述:三枚石子的最小移动问题

小U在数轴上放置了三枚石子,位置分别是a,b,c。在每一回合中,小U可以选择从最左边或最右边的石子,并将其移动到它们中间的某个空闲位置。目标是使得三枚石子的位置连续,即不能再进行任何移动。你需要帮助小U找到游戏结束所需的最大移动次数。

样例1

输入:a=1,b=2,c=5 输出:2

样例2

输入:a=4,b=3,c=2 输出:8

题目理解:

在一个标注有刻度的数轴上,随机放置了三块标注了字母的石子,分别为a、b、c,现在通过一次操作方式,使得石子变换顺序,最终呈现abc连续放置的情况。(即若b在中间,则不进行变化;其他情况,需将b调整至中间)

解题核心思路

目标是计算将三枚石子变成连续所需的最大移动次数

解题步骤

题目分析

操作方式:

每一回合可以将最左边或最右边的石子移动到它们之间的空闲位置。

目标:

计算游戏结束所需的最大移动次数。

约束条件:
  1. 移动只能在三个石子中最左或最右的石子执行。
  2. 游戏结束的条件是三个石子位置连续,定义为 b−a=1 且 c−b=1

编程策略

从题目可知,石子只存在三个固定的坐标 a,b,c 这是一个非常小的规模问题。针对这种情况可以直接通过以下策略设计算法:

步骤 1:排序
  • 三个石子的位置没有要求按大小给出,因此第一步应该对 a,b,c 进行排序,确保 a<b<c(即比较a,b,c,三个给定数的大小)。排序可以方便后续计算石子之间的间距。
步骤 2:间距计算
  • 排序后,计算相邻石子之间的间距:
    • b−a−1:表示左侧石子 a 和中间石子 b 之间的空隙。
    • c−b−1:表示中间石子 b 和右侧石子 c 之间的空隙。
步骤 3:最大移动次数
  • 如果石子初始状态不是连续的,那么要让它们连续的最大移动次数就是填补所有空隙的过程,因此:
    • 最大移动次数 =(b-a-1)+(c-b-1)

算法设计

根据上述策略,算法可以设计如下:

  1. 排序阶段
    • 使用 Python 内置排序函数 sorted() 对 a,b,c 进行排序
  2. 计算间距
    • 计算左侧和右侧石子之间的空隙:left_gap=b−a−1 和 right_gap=c−b−1
  3. 求解最大移动次数
    • 最大移动次数等于两个空隙的和。
  4. 输出结果
    • 返回最大移动次数。

代码编写

    # Step 1: 对石子位置排序
    positions = sorted([a, b, c])
    a, b, c = positions[0], positions[1], positions[2]
    
    # Step 2: 计算左右间隙
    left_gap = b - a - 1
    right_gap = c - b - 1
    
    # Step 3: 最大移动次数为两个间隙之和
    max_moves = left_gap + right_gap
    
    return max_moves

补充说明

对于例三(样例3: 输入: a=3,b=5,c=1 输出:2)这种输入数字大小与字母排序颠倒的情况的实现仍然存在疑惑,对于题目的内涵无法理解