字节跳动笔试题-豆油瓶

【字节跳动】2019笔试题--豆油瓶_Mart1nn的博客

题目:抖音中每两个用户之间互动超过3次即互为豆油瓶,若用户1与用户2互动超过3次,用户2又与用户3互动超过三次,则用户1与用户3也为豆油瓶。且用户不能与自身互动(即a[i][i] = 0,i=0,1,2,3…)
例1:
输入:
3
0 2 4
2 0 0
4 0 0
输出:2
解析:第一行输入的是数组的大小,即nxn(例1中是3x3),后面n行即为n个用户之间互动的次数

博客园也有个帖子(找不到了),说豆油有传递关系,如AB>=3, BC>=3, ABC构成一个豆油瓶,而不是AB一个,BC一个。他把它看作图来做的。如果不考虑传递关系,似乎数数可以:

n = N; // 假设每个用户互动次数都不够,每个用户一个豆油瓶
for (int y = 0; y < N; y++) { // 处理不含对角线的上三角阵
    for (int x = y + 1; x < N; x++) {
        if (m[y][x] >= 3) --n;
        // x和y构成一个豆油瓶,所以豆油瓶数-2再加1
    }
}
return n;
// 比如A和B豆油,B和C豆油。处理AB时--n, BA不处理,BC时--n
// 比如A和B豆油,C和D豆油。处理AB时--n, CD时--n

好像反了,是传递关系成立时才对。说什么“组合数学是数学里被鄙视的”是一种凡尔赛行为!:-) 好在我不用找工作。哦,那话不是我说的,我觉得组合数学很难。

A B C D 4
AB C D 3
ABC D 2; AB BC D 3

可能只是特例对,代码根本就不对。忘了哪个名人说“要简单,但过分简单就不对”(大意)

对,不对:-) AB, AC, BC都减一,就不对了。也许可以抢救一下:处理完AC就清零C列会破坏输入。遇到BC先检查C列的上一行?但O(n^3)没啥意思。用HashSet算是降了指数,set能把一个n变成log(n)? 也许可以来个bool handled[N]; 变O(n^2)? 有传递关系时,任何一个人不能同时属于多个小油瓶。AB, BC和AC, BC都会变成ABC, handled[2]为1说明C已经被处理过了。

posted @ 2022-01-13 10:48  华容道专家  阅读(182)  评论(0)    收藏  举报