当青训营遇上码上掘金
鲁迅曾经说过:“人生得—知己足矣,斯世当以同怀视之”,让我们一起在字节跳动的青训营中开启我们的“寻友之旅”吧!
题目描述-寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 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.根据下图位置关系构建队列
- 4.由于按照以上关系构建的队列会存在位置重复的问题,所以我们使用Go语言中的map数据类型来对已经遍历过位置节点进行记录,代码如下:
// 初始化map,用于记录位置为X的节点是否被访问过 visited := make(map[int]bool) - 5.我们以上关系构建的队列进行BFS算法遍历,程序完整代码如下:
总结
少年易老学难成,一寸光阴不可轻,放假回家,我们很多小伙伴(包括我在内)都容易摆烂躺平,没有在学校的那种压力,自然而然也就没有学习的动力了。我们既然有机会参加字节跳动的青训营,希望我们能够在这一个多月的时间里有些收获,在这个寒冷的冬天里与一群怀着满腔热血的小伙伴们一起进步,加油!
如果你有更好的思路和解法,或者你对文章的内容有更好的建议,可以直接在发评论区与我交流。
制作不易,如果你觉得文章对你有帮助,欢迎点赞+收藏,谢谢您的观看~