计算位置x到y的最小步数
问题描述
AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。
我们假设每一步对应到每一个位置。从一个整数位置 x 走到另外一个整数位置 y,每一步的长度是正整数,每步的值等于上一步的值 -1, +0,+1。求 x 到 y 最少走几步。并且第一步必须是 1,最后一步必须是 1,从 x 到 y 最少需要多少步。
样例说明
- 整数位置
x为12,另外一个整数位置y为6,我们需要从x走到y,最小的步数为:1,2,2,1,所以我们需要走4步。 - 整数位置
x为34,另外一个整数位置y为45,我们需要从x走到y,最小的步数为:1,2,3,2,2,1,所以我们需要走6步。 - 整数位置
x为50,另外一个整数位置y为30,我们需要从x走到y,最小的步数为:1,2,3,4,4,3,2,1,所以我们需要走8步。
输入格式
输入包含 2 个整数 x,y。(0<=x<=y<2^31)
输出格式
对于每一组数据,输出一行,仅包含一个整数,从 x 到 y 所需最小步数。
输入样例
12 6
34 45
50 30
输出样例
4
6
8
问题描述
我们需要从整数位置 x 走到整数位置 y,每一步的长度是正整数,并且每一步的步长只能是上一步的步长 -1、+0 或 +1。要求第一步和最后一步的步长必须是 1。我们的目标是找到从 x 到 y 所需的最小步数。
分析
为了更好地理解问题,我们可以将其分解为几个部分:
- 步长变化:每一步的步长只能是上一步的
-1、+0或+1。 - 第一步和最后一步:第一步和最后一步的步长必须是
1。 - 最小步数:我们需要找到从
x到y的最小步数。
解决方案
我们可以通过以下步骤来解决这个问题:
-
计算距离:首先计算
x和y之间的绝对距离d = |x - y|。 -
处理特殊情况
:对于一些特殊情况,我们可以直接给出答案(先打个表):
- 如果
d == 0,即x == y,我们需要走0步(不用走)。 - 如果
d == 1,即x和y之间的距离是1,我们只需要1步。 - 如果
d == 2,即x和y之间的距离是2,我们需要2步。 - 如果
d == 3,即x和y之间的距离是3,我们需要3步。
- 如果
-
一般情况:其实我们分析一下题目可以发现,如果追求最短步骤,不可能会出现走“回头路”这一现象的,比如我先前进3步又后退两步,所以我只会一直前进或者一直后退,在这里我们取了距离的绝对值不妨假设到达终点需要一直前进。
首先开头和结尾的步长必是
1如果我们中间走一步,我们最大只能走
1 2 1这种情况,总距离<=4,那么一共只需要走1+2步就可以!如果我们中间走两步,我们最大只能走
1 2 2 1这种情况,总距离大于4小于等于7,一共只需要4步即可!聪明的你已经发现:
如果中间只能走3步,那么最大的序列是
1 2 3 2 1如果中间只能走4步,那么最大的序列是
1 2 3 3 2 1…
所以我们只要知道
距离并且知道它位于第几步到第几步的区间我们就直接能判别最少需要几步即可!一个简单的while循环搞定,如果超过就-1步即可~
下面是代码:
def solution(x_position, y_position):
d = abs(x_position - y_position)
step = 2
t = 1
ans = 0
if(d == 0): return 0
elif (d == 1): return 1
elif (d == 2): return 2
elif (d == 3): return 3
else:
while(ans<(d-2)):
if(t % 2 == 1):
ans = ans + step
t = t + 1
#print(t,' ',ans)
else:
ans = ans + step
step = step + 1
t = t + 1
#print(t,' ',ans)
return t + 1
if __name__ == "__main__":
# You can add more test cases here
print(solution(12, 6) == 4 )
print(solution(34, 45) == 6)
print(solution(50, 30) == 8)

1429

被折叠的 条评论
为什么被折叠?



