今天做了一下字节跳动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;
}