字节跳动25号笔试100%,100%,30%,70%代码

第一题:并查集 100%

//
// Created by Chaopeng Zhang on 2019-08-25.
//
#include <iostream>
using namespace std;

#include <vector>
class Solution {
public:
    int findDouYouNum(vector <vector<int>> &M) {
        if (!M.size())
            return 0;
        int n = M[0].size();
        count = n;

        id.resize(n);
        sz.resize(n);

        for (int i = 0; i < n; ++i) {
            id[i] = i;
            sz[i] = 1;
        }


        for (int i = 0; i < n - 1; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (M[i][j] >= 3) {
                    Union(i, j);
                }
            }
        }

        return count;
    }

    int Find(int i) {
        while (i != id[i])
            i = id[i];
        return i;
    }

    void Union(int i, int j) {
        int p = Find(i);
        int q = Find(j);
        if (p == q)
            return;
        if (sz[p] < sz[q]) {
            id[p] = q;
            sz[q] += sz[p];
        } else {
            id[q] = p;
            sz[p] += sz[q];
        }
        count--;
    }

    vector<int> id;
    vector<int> sz;
    int count;
};

int main() {
    vector<vector<int>> input;
    int n;
    cin>>n;
    for (int i = 0; i < n; ++i) {
        vector<int> v;
        for (int j = 0; j < n; ++j) {
            int num;
            cin>>num;
            v.push_back(num);
        }
        input.push_back(v);
    }
    Solution s;
    cout<<s.findDouYouNum(input);
}


第二题 100%
//
// Created by Chaopeng Zhang on 2019-08-25.
//


#include <iostream>
using namespace std;

const int mod = 1000000007;

long long d[1001] = {1};

int main() {
    int n;
    cin >> n;
    for (int i = 2; i <= n; i += 2) {
        for (int j = 0; j <= i - 2; j += 2) {
            d[i] = (d[i] + d[j] * d[i - 2 - j] % mod) % mod;
        }
    }
    cout << d[n] << endl;
    return 0;
}

第三题 30%,后来优化了没时间提交
//
// Created by Chaopeng Zhang on 2019-08-25.
//

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<vector<int>> solve(vector<vector<int>> &mat, int dir) {
        if (dir == 1) {
            Up(mat);
        } else if (dir == 2) {
            Down(mat);
        } else if (dir == 3) {
            Left(mat);
        } else {
            Right(mat);
        }
        return mat;
    }

    vector<int> merge(vector<int> line) {
        vector<int> ans;
        vector<int> postive;
        for (int i = 0; i < line.size(); ++i) {
            if (line[i] > 0)
                postive.push_back(line[i]);
        }
        postive.push_back(0);
        for (int j = 1; j < postive.size(); ++j) {
            if (postive[j] == postive[j - 1]) {
                ans.push_back(2 * postive[j - 1]);
                j++;
            } else {
                ans.push_back(postive[j - 1]);
            }
        }
        for (int k = ans.size(); k < 4; ++k) {
            ans.push_back(0);
        }
        return ans;
    }

    void Up(vector<vector<int>> &mat) {
        for (int i = 0; i < 4; ++i) {
            moveUp(mat, i);
        }
    }

    void Down(vector<vector<int>> &mat) {
        for (int i = 0; i < 4; ++i) {
            moveDown(mat, i);
        }
    }

    void Left(vector<vector<int>> &mat) {
        for (int i = 0; i < 4; ++i) {
            moveLeft(mat, i);
        }
    }

    void Right(vector<vector<int>> &mat) {
        for (int i = 0; i < 4; ++i) {
            moveRight(mat, i);
        }
    }

    void moveUp(vector<vector<int>> &mat, int col) {
        vector<int> v;
        for (int i = 0; i < 4; ++i) {
            v.push_back(mat[i][col]);
        }
        vector<int> ans = merge(v);
        for (int j = 0; j < 4; ++j) {
            mat[j][col] = ans[j];
        }
    }

    void moveDown(vector<vector<int>> &mat, int col) {
        vector<int> v;
        for (int i = 3; i >= 0; --i) {
            v.push_back(mat[i][col]);
        }
        vector<int> ans = merge(v);
        for (int i = 3; i >= 0; --i) {
            mat[i][col] = ans[3-i];
        }
    }

    void moveLeft(vector<vector<int>> &mat, int row) {
        vector<int> v;
        for (int i = 0; i < 4; ++i) {
            v.push_back(mat[row][i]);
        }
        vector<int> ans = merge(v);
        for (int j = 0; j < 4; ++j) {
            mat[row][j] = ans[j];
        }
    }

    void moveRight(vector<vector<int>> &mat, int row) {
        vector<int> v;
        for (int i = 3; i >= 0; --i) {
            v.push_back(mat[row][i]);
        }
        vector<int> ans = merge(v);
        for (int i = 3; i >= 0; --i) {
            mat[row][i] = ans[3-i];
        }
    }

};

int main() {
    int dir;
    cin >> dir;
    vector<vector<int>> input;
    for (int i = 0; i < 4; ++i) {
        vector<int> v;
        for (int j = 0; j < 4; ++j) {
            int a;
            cin >> a;
            v.push_back(a);
        }
        input.push_back(v);
    }
    vector<vector<int>> ans;
    Solution s;
    ans = s.solve(input, dir);
    for (auto i:ans) {
        for (auto j:i) {
            cout << j << " ";
        }
        cout << endl;
    }
}

第四题,还是并查集,70%,UnionFind不知道咋改成LogN的复杂度
//
// Created by Chaopeng Zhang on 2019-08-25.
//
#include <iostream>
using namespace std;

#include <math.h>
#include <unordered_map>
#include <vector>

class Solution {
public:

    int gcd(int i, int j) {
        int min_num = min(i, j);
        int max_num = max(i, j);
        int temp;
        while (min_num > 0) {
            temp = max_num % min_num;
            max_num = min_num;
            min_num = temp;
        }
        return max_num;
    }

    int findCandy(vector<int> &M) {

        if (!M.size())
            return 0;
        int n = M.size();
        count = n;

        id.resize(n);
        sz.resize(n);

        for (int i = 0; i < n; ++i) {
            id[i] = i;
            sz[i] = 1;
        }

        //n^2
        for (int i = 0; i < n - 1; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (gcd(M[i], M[j]) > 1) {
                    Union(i, j);
                }
            }
        }

        unordered_map<int, int> cnt;
        int ans = INT32_MIN;
        int id_num;
        for (int k = 0; k < n; ++k) {
            id_num = Find(k);
            cnt[id_num] += 1;
            ans = max(ans, cnt[id_num]);
        }
        return ans;
    }

    int Find(int i) {
        while (i != id[i])
            i = id[i];
        return i;
    }

    void Union(int i, int j) {
        int p = Find(i);
        int q = Find(j);
        if (p == q)
            return;
        if (sz[p] < sz[q]) {
            id[p] = q;
            sz[q] += sz[p];
        } else {
            id[q] = p;
            sz[p] += sz[q];
        }
        count--;
    }

    vector<int> id;
    vector<int> sz;
    int count;
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    Solution s;
    int n;
    cin>>n;
    vector<int> v;
    while(n)
    {
        int a;
        cin>>a;
        v.push_back(a);
        n--;
    }

    cout<<s.findCandy(v);
}


#字节跳动##笔试题目#
全部评论
大佬666
点赞 回复 分享
发布于 2019-08-26 13:55
并查集的路径压缩或启发式合并可以把时间复杂度降低到log级别,如果同时采用,可以降低到常数级别,第四题其实可以先写个素数筛法预处理所有数字的质因子,然后dfs染色。
点赞 回复 分享
发布于 2019-09-02 13:51
膜拜大佬
点赞 回复 分享
发布于 2019-08-26 17:14
大佬
点赞 回复 分享
发布于 2019-08-26 10:26
大佬给跪了
点赞 回复 分享
发布于 2019-08-26 07:50
请问下有题目吗
点赞 回复 分享
发布于 2019-08-26 07:33
大佬
点赞 回复 分享
发布于 2019-08-26 06:59

相关推荐

昨天 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
zhch7:建议9✌️把学历加黑加粗,如果实在offer可能是觉得佬不会去
投了多少份简历才上岸
点赞 评论 收藏
分享
allin秋招的单身...:我投过这家 上来就发个设计图给我,让我做好发到他邮箱
点赞 评论 收藏
分享
评论
6
47
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务