快手笔试题型--算法实习

两部分
一、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;
}

#实习##算法工程师#
全部评论
/** 第三题code */ #include <iostream> #include <string.h> using namespace std; typedef long long lld; const lld MAX_LEN = 1001; const lld MOD = 1000000007; class Matrix { public:     Matrix(const Matrix &rhs) {         memcpy(v, rhs.v, sizeof(v));     }     Matrix() {         memset(v, 0, sizeof(v));     } public:     lld * operator[] (int index) {         return v[index];     }     lld * operator[] (int index) const {         return (lld*)v[index];     } public:     lld v[2][2]; }; Matrix operator *(const Matrix &lhs, const Matrix &rhs) {     Matrix r;     for (int i = 0; i < 2; ++i) {         for (int j = 0; j < 2; ++j) {             for (int k = 0; k < 2; ++k) {                 r[i][j] += lhs[i][k] * rhs[k][j];                 r[i][j] %= MOD;             }         }     }     return r; } Matrix QuickPow(const Matrix &m, const lld n) {     if (n == 1) {         return m;     }     else if (n % 2 == 0) {         const Matrix &tm = QuickPow(m, n >> 1);         return tm * tm;     }     else {         const Matrix &tm = QuickPow(m, n >> 1);         return tm * tm *m;     } } lld GetResult(const Matrix &m) {     return ((m[1][0] * 3 + m[1][1] * 2) % MOD + MOD) % MOD; } int main() {     Matrix m;     m[0][0] = 3, m[0][1] = -1;     m[1][0] = 1, m[1][1] = 0;     int ic;     cin >> ic;     lld n;     while (ic--) {         cin >> n;         if (n == 0) {             cout << 1 << endl;             continue;         }         cout << GetResult(QuickPow(m, n)) << endl;     } } /** * 第二题code */ #include <iostream> #include <fstream> #include <string.h> using namespace std; typedef long long lld; lld MOD = 1000000007; lld dp[1001][1001]; void init(); //fstream r("1.in"); //fstream w("1.out"); int main() {     init();     lld k;     cin >> k;     while (k--) {         lld m, n;         cin >> m >> n;         cout << dp[m][n] << endl;     } } void init() {     memset(dp, 0, sizeof(dp));     dp[0][0] = 1;     for (int r = 0; r <= 1000; ++r) {         for (int c = 0; c <= r; ++c) {             if (r > 0 && c > 0) {                 dp[r][c] = dp[r - 1][c - 1] + dp[r - 1][c];             }             else if (r > 0) {                 dp[r][c] = dp[r - 1][c];             }             dp[r][c] %= MOD;         }     } } /** 第一题code */ #include <iostream> using namespace std; int n; int m; int main() {     cin >> m;     while(m--) {         cin >> n;         if (n % 3) {             cout << "lucky" << endl;         }else {             cout << "don't be discouraged" << endl;         }     } } 不要谢我,我是雷锋
点赞 回复 分享
发布于 2018-05-14 20:11
你这个代码是AC不了的。 你考虑以下数列: 2,3,7,18,..., 你会发现,A(n+2) = 3A(n+1) - An,于是就有了递推,再用快速矩阵幂就行了。
点赞 回复 分享
发布于 2018-05-14 20:05

相关推荐

我的名字是句号:接好运
点赞 评论 收藏
分享
评论
点赞
21
分享

创作者周榜

更多
牛客网
牛客企业服务