前言
当青训营遇上码上掘金,通过以寻友之旅为主题的有趣小问题,我们再次在这相遇。今天已经是我来到掘金的第4天,本文也是我写的第二篇文章,我将讲述寻友之旅问题的解决思路以及代码。
问题描述
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。
小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
解决思路
通过题目可知,小码原地不动,小青节点在变化,但我们认真思考后会发现,其实让小青不动小码动的话,算起来更加简单方便,因此我采用N不变,让K减的方式计算。
具体我们需可以分点讨论,总共可以分成下面三种情况。
当小青N所在节点大于小码K时,只能选择走路的方法,因为题目说公交不能向后走,所以首先判断小青和小码所在节点数的大小,
第一种情况:如果N=K则不用花时间,则直接返回0。
第二种情况:如果N>K,则花费时间为(N-K)分钟
第三情况:如果N<K,则当K能被2整除时且整除后不小于N,则坐公交K/2,反之则走路K-1,然后分钟数加1。
不断循环直到K与N相等。
代码实现
比如N=1,K=1000,即小青开始在1节点,小码在1000节点时
计算思路:先让小青走路1分钟,N节点等于2,然后坐7分钟公交,来到了128这个节点(2的7次方),
再让小青走路往回走3分钟,来到125节点,最后坐3分钟公交,125乘2的3次方等于1000,正好和小码碰面,总共花费14分钟。
代码如下:
输入:1,1000
返回结果:14
结语
这个问题并不难,重点是要注意转变思维,如果用小青节点N来加减的话,那可就麻烦多了,到这我的第二篇文章也结束了,如有发现错误请在评论指出,感谢!