[算法]爱奇艺笔试题,赛车进站问题
upadate: 应该是我想复杂了, 没有考虑到最后一圈需要进站的情况, 也就是说跑完最后一圈也要在站里,
那么就不能按我下面的“PS”来考虑,感谢各位, n为4到时候应该是为7
假设一场赛车比赛中需要跑n圈, 而某赛车最多跑3圈就需要进站加油继续跑, 输出有多少种进站策略, 比如n为3的时候输出为4 (题设中的样例)。 我的思路好像有点问题, 只AC了25%,估计是错了:
function getCount(n){
var dict = {0:1,1:1,2:3,3:4}
var rest = n % 3
var sum = Math.pow(4,(n - rest)/3)
return sum*dict[rest]
}
————————以下应该是错的,因为按这种逻辑n为3的情况下就得是7了,不符合样例-————————————————
PS:我觉得不是简单的上楼梯之类的,比如n为4的时候下面回答输出为7, 肯定不止7种啊, 我列举出来你看, n为4的时候, 只进1次的策略有2种(2,3),只进2次的策略有5种(12,13,23,24,34),进3次的策略有4种(123,134,234,124),剩下进4次的策略有1种,加起来就有2+5+4+1 = 12种了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
分治+深度探索的算法可以解决
思路很简单,假设我们行n圈的方案叫 cardGame(n)
n=0,返回0
n=1,返回1
n=2,返回2
n=3,返回4
n=4的时候,
n=5也可以拆分成以上的情况
递归的思路就是
这种方法思路很容易想到,但是效率不高。而
慕少艾
的方法是其改进版。还有一种非常数学的方法是利用矩阵的,你搜索一下 斐波那契数列
当然那个是2维的,你这题是3维的,不过按照线性代数的原则是可以做出来的,但是本人智商有限,不清楚具体怎么做。
F(n) = F(n-1)+F(n-2)+F(n-3)
F(0) = 1, F(1) = 2, F(2) = 4, F(3)=7
递归公式的理解:假设第一次进站是在第一、二、三圈时,分别对应的是F(n-1)、F(n-2)、F(n-2)
感觉很牛逼的样子啊,没懂,进站策略是什么意思?n=4,结果就为1啊(跑四圈,最少要进一次站),咋为7呢?握草这逻辑是什么鬼?这是什么面试题?估计我连大门都进不去啊...
其实我连题目都没看懂,比如需要跑4圈,最多跑了3圈就得进站,那进站了不是比赛结束了吗,后面的怎么跑?
思路如上,性能上还可以优化
以下会输出组合方案
n = 5时, count = 13, 方案如下
1 1 1 1 1
1 1 1 2
1 1 2 1
1 1 3
1 2 1 1
1 2 2
1 3 1
2 1 1 1
2 1 2
2 2 1
2 3
3 1 1
3 2
就是使用一步两步和三步有几种上楼梯的方法。
利用迭代,
第一次可以1.2.3
以后还可以1.2.3
最后加和是n
也就是f(n)=f(n-1)+f(n-2)+f(n-3)
if(n==1)return1
if(n==2)return2
if(n==3)return4
1 1
2 1-1 2
3 1-1-1 1-2 2-1 3
4 1-1-1-1 1-2-1 2-2 1-1-2 1-3 3-1
即:n的最大因子为3的...怎么称呼忘了...反正你错了...
问题描述确定没问题吗?
赛车在比在中加油应该尽量少加油,所以n为3的时候,赛车不加油就能跑下来,结果应该是0吧。
n==4的时候,最少加油一次,结果是3(第1圈结束加油,或第2圈结束加油,或第3圈结束加油);
n==5的时候,最少加油一次,结果是2(第二圈结束,或第三圈结束)。
总的来说应该是让加油次数最少