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

118 阅读3分钟

当青训营遇上码上掘金

鲁迅曾经说过:“人生得—知己足矣,斯世当以同怀视之”,让我们一起在字节跳动的青训营中开启我们的“寻友之旅”吧!

题目描述-寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行公交

步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1  
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

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

解题思路

首先我们应该明确步行可以向前和向后走(步长为1),公交只能向前走(步长为2*X)。

情况1:小青的位置N=小码的位置K(N=K),这个时候所需时间为0。

情况2:小青的位置N>小码的位置K(N>K),这时小青只能步行向后走,所需时间为N-K。

情况3:小青的位置N<小码的位置K(N<K),此时需要具体分析。

以上情况可以用蛮力法对其进行求解。

除此之外,我们还可以使用广度优先遍历(BFS)算法进行求解,具体过程如下:

  • 1.我们可以使用队列来保存位置节点并对其进行BFS遍历

  • 2.定义一个Node的结构体用于描述位置和时间花费

    // Node 队列的节点结构体
    type Node struct {
       N      int //当前位置
       Minute int //所需时间(分钟)
    }
    
  • 3.根据下图位置关系构建队列

1.jpg

  • 4.由于按照以上关系构建的队列会存在位置重复的问题,所以我们使用Go语言中的map数据类型来对已经遍历过位置节点进行记录,代码如下:
    // 初始化map,用于记录位置为X的节点是否被访问过
    visited := make(map[int]bool)
    
  • 5.我们以上关系构建的队列进行BFS算法遍历,程序完整代码如下:

总结

少年易老学难成,一寸光阴不可轻,放假回家,我们很多小伙伴(包括我在内)都容易摆烂躺平,没有在学校的那种压力,自然而然也就没有学习的动力了。我们既然有机会参加字节跳动的青训营,希望我们能够在这一个多月的时间里有些收获,在这个寒冷的冬天里与一群怀着满腔热血的小伙伴们一起进步,加油!

如果你有更好的思路和解法,或者你对文章的内容有更好的建议,可以直接在发评论区与我交流。

制作不易,如果你觉得文章对你有帮助,欢迎点赞+收藏,谢谢您的观看~