字节跳动8.25笔试题

今天做了一下字节跳动8.25的线上笔试题,好像测开和开发的题目是一样的。

第三题

抖音上每天都有上亿的用户,如果用户A和B互动不少于3次,我们就认为A和B属于豆油,如果A和B是豆油,B和C也是豆油,那么A和C互为豆油,我们定义豆油瓶就是有直接和间接朋友所组成的群体。
给定一个 N * N 的矩阵M,代表抖音上所有用户的互动次数,如果M[i][j]=5,那么第i个和第j个用户就互动过5次。同一用户互动次数为0.请你计算并输出发现的抖音上所有豆油瓶的个数。
输入第一个数字为N,后面输入矩阵内容。

由于先看到第三道题,因此先给第三题的代码,网上说是并查集的方法,我也具体没有研究过,是自己想的方法,简单来说就是将相关联的元素设为相同的index,当有不同元素不在这个相关联的范围内,则增加index计数,重新“感染”相关元素,最后index的数目就是关联群的总数。


int main()
{
    int num;
    cin >> num;
    vector<vector<int>> input(num + 1, vector<int>(num + 1, 0));
    for (auto i = 1; i <= num; i++)
        for (auto j = 1; j <= num; j++)
        {
            int tmp;
            cin >> tmp;
            input[i][j] = tmp;
        }

    int index = 0;
    vector<int> res(num + 1, -1);//由于用户从1开始计数,vector从0开始计数,为了习惯,增加一行一列空内容。
    for (auto i = 1; i <= num; i++)
        for (auto j = i + 1; j <= num; j++)
        {
            if (input[i][j] > 2)
            {
                if (res[i] == -1)
                {
                    index++;
                    res[i] = index;
                    res[j] = index;

                }
                else
                {
                    res[j] = res[i];
                }
            }
        }
   //如果有相关联的用户,则感染其为同index,否则则将相关联的用户设置为新的index计数,向后继续传播。
    for (auto i = 1; i <= num; i++)
        if (res[i] == -1)
        {
            index++;
            res[i] = index;
        }
   //没有被感染过的用户视作单一豆油瓶,也是一个独立的计数。
    cout << index << endl;
    int z;
    cin >> z;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/leoyu800/p/11409641.html