当青训营遇上码上掘金|寻友之旅

119 阅读3分钟

当青训营遇上码上掘金~

背景简介

前段时间参加了字节跳动的后端青训营,化身青豆侠嚯嚯嚯嚯!来参加「青训营 X 码上掘金」主题创作活动,大家都在学习的同时一起赢青豆吧!

寻友之旅

题目介绍

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

代码展示

注:使用语言为Python3

def main() -> None:
    N = int(input("请输入整数N(小青所在地点)"))
    K = int(input("请输入整数K(小码所在地点)"))
    moving_time,moving_path = func_moving_time(N, K)
    print(f"小青到小码家所需的最短时间为{moving_time}分钟")
    print(f"小青到小码家所需的最短路径为{moving_path}")


def func_moving_time(N: int, K: int):
    moving_time=0
    pointer=N
    moving_path=f"{N}"
    while K!=pointer:
        if K<pointer:
            pointer-=1
            moving_time+=1
            moving_path+=f"<{pointer}"
        else:
            if K<=pointer*1.5:
                pointer += 1
                moving_time += 1
                moving_path += f">{pointer}"
            else:
                pointer*=2
                moving_time+=1
                moving_path += f"=>{pointer}"
    return moving_time,moving_path


if __name__ == '__main__':
    main()

代码说明

在本代码中,不仅输出了小青到小码家所需的最短时间,还输出了最短路径与选择路径的方式,在其中:

  • ">":表示步行向前移动距离1
  • "<":表示步行向后移动距离1
  • "=>":表示坐公交车向前移动距离X(X为当前所在节点位置)
  • pointer(变量):表示当前小青所在的节点位置

思路讲解

基本思路

根据小青所在节点位置与小码家所在节点位置进行比较,决定前进方式与方向,每前进一次moving_time参数值加1,直到小青到达小码家。即两个节点位置相等。

方式选择

由题可知:

  1. 公交不可以向后走

    故可以得出第一个方式(向后移动距离1)的移动条件为: 小青所在节点位置大于小码家所在节点位置

  2. 乘坐公交车移动距离X与步行向前/向后移动距离1所花费时间一致(此方式前提条件即不满足前一条件,即小青所在节点位置应当小于小码家所在节点位置)

    由于公交车距离限制,还要考虑向前向后移动的关系,很容易知道选择的临界点为1.5倍小青所在位置节点,故可以得出当小青所在节点位置小于小码家所在节点位置时有两种情况:

    1. 小码家所在节点位置小于等于1.5倍小青所在节点位置时,应当采取步行前进的方式
    2. 小码家所在节点位置大于1.5倍小青所在节点位置时,应当采取乘坐公交车前进的方式

附代码片段

再附一下代码片段好像可以直接运行,哈哈哈哈,第一次用还不熟练。

至此~本文结束...感谢大家阅读!希望大家和我都能在青训营中收获到属于自己的知识与经验。加油!