快手笔试题型--算法实习
两部分
一、20道选择。 机器学习、线代、概率论、数论、高等数学。
具体考点涉及:机器学习算法、求导、相似矩阵、计算概率、数论知识……
二、3道编程题
1.。。。
2.取石子问题。取完最后一个石子的赢。每次只能取2的整数幂,1,2,4,8……个石子,当输入石子总数为n时,先取的人赢还是输。
3.卢卡斯数列。1,3,4,7,11,18……,当输入为n时,输出第2n项.当数极大时,输出m%10^9+7
1.网上有,我忘了
2.听通过的同学说,3的倍数是必败,否则必胜!
这位同学思路如下:
1>首选3和0是先手必败,
2>对于任何非3的倍数值我都可以取1个或2个变为3的倍数,
3>而3的倍数值取任意2的幂次时结果模3都为1或2,
4>那么就可以取1或2 使石子保持3的倍数,最后直到为0或3
主要是因为模3的余数只有1,2,均为2的幂次。
另外取石子的简单类型,当只能取1,3,7,8时,判断先手胜负
#include<iostream> using namespace std; int win(int ballnums){ if (ballnums <=1) return 1; if (ballnums == 3) return 1; if (ballnums == 7) return 1; if (ballnums == 8) return 1; else return !win(ballnums - 1) || !win(ballnums - 3) || !win(ballnums - 7) || !win(ballnums - 8); } int main() { int n,m; cin >> n; while (n--) { cin >> m; cout << win(m) << endl; } return 0; }
3.类比斐波那契数列
#include<iostream> using namespace std; int LuKaSi(int n) { int a = 1; int b = 3; if (n == 1){ return a; } if (n == 2){ return b; } int c; for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return c%1000000007; } int main() { int n,m; cin >> n; while (n--) { cin >> m; cout << LuKaSi(2*m) << endl; } return 0; }