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

53 阅读3分钟

很荣幸能够参加第五届字节跳动青训营,由于这次报名的是后端,选择题目3

题目介绍:寻友之旅

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

请帮助小青通知小码,小青最快到达时间是多久?

输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)

题目理解

通过读题目我们可以从中得知,小青去找小码,我们可以把两者的距离的每1段当作每一个节点,所以定义了bus方法返回每一分钟2段距离和walk方法返回每一分钟+1和-1的列表,要寻找最短时间其实可以理解为在一分钟的节点采用什么样的交通工具使小青移动距离最远,通过题目的约束小青和小码的地点从(0,100000),对最远距离进行循环遍历,通过对每一次遍历进行一分钟的节点移动距离最远进行累加并与两者距离相比较,当小于两者距离时遍历次数就为最短时间,由于公交车不可以向后走的特性,两者距离为奇数时最后一节点采用公交车时出现超过两者距离,就需要布行一分钟的节点-1回到最终位置,所以在等于两者距离+1的前一个时间节点采用步行则为最节省时间的方式,此时的最短时间也为累加遍历到相等+1时的次数。

解题代码

def bus(x):
    return x*2
​
​
def walk(x):
    return x-1, x+1
​
​
def seek(n, k):
    km = abs(n-k)+1
    for i in walk(1):
        if bus(1) >= i:
            m = bus(1)
        else:
            m = i
    c = 0
    t = 0
    for i in range(0, 100000):
        t += 1
        c += m
        if c == km+1:
            c -= m
            break
    print("小青到小码家所需的最短时间:{}分钟".format(t))

测试结果

n = int(input("请输入小青所在地点N:"))
k = int(input("请输入小码所在地点K:"))
while 0 > n or n > 100000:
    n = int(input("请重新输入小青所在地点N:"))
while 0 > k or k > 100000:
    k = int(input("请重新输入小码所在地点K:"))
seek(n, k)

寻友.png

个人总结

由于自己的理解可能出现问题,我把任意节点X就直接想成1距离,真的与大家的有很大差距,一开始看到这题,直接认为公交快,认为简单,但是自己敲出来的代码比我预期的要差得多,感觉自己在问题思考和题目得全面分析上还得加把劲,加油吧!