网友吐槽:外包做事真是极其不负责,一点owner精神都没有,活该当一辈子外包,真tm不靠谱。。。
嗨,大家好!最近看到一个挺有意思的网友吐槽,内容大致是关于外包员工做事不靠谱的。
说的是让外包做个Grafana面板,结果半个月都搞不定。
从我这个做程序员的角度来看,外包他们不像我们这些正式员工那样,可能会对项目的长期发展有责任感,也没有那么强的归属感。
外包通常是按任务收费,做完就走,能拖则拖,毕竟他们的目标只是交付,而不是关心后期的维护和优化。
不过,网友的批评也不完全没有道理。
毕竟如果你要求外包做到“owner”的水平,那是不是有点过分?
要么就直接招聘正式员工来负责这些工作,要么就给外包方明确的责任和期限。
换句话说,问题的根源其实在于公司对外包的管理不到位,期待过高但又没给相应的支持。
算法题:二级关注者
今天咱们来聊个技术题目:二级关注者。
你可能会问,啥是二级关注者?你是不是在用“社交媒体平台”的语言来给我整技术题?没错,别被名字迷惑了,其实这个问题的核心跟我们常见的图算法相关。如果你在写社交网络功能或者构建一个图模型,你就会发现,这类题目挺常见的。咱们今天就用Java来一步步捋清楚这道题。
假设你有一个社交网络,每个用户可以关注其他用户,我们要找出某个用户的二级关注者。
举个例子,假设用户 A 关注了用户 B,用户 B 关注了用户 C,那么 C 就是 A 的“二级关注者”,因为 C 是 B 的关注对象,而 B 又是 A 的关注对象。
这道题可以看似简单,但要实现清晰且高效的解决方案,还是得有点技巧。我们将它抽象成一个图问题,其中每个用户是图中的一个节点,关注关系就是图中的一条有向边。
算法思路
图的构建:首先,我们要为每个用户构建一个图结构,这个结构可以用一个哈希表来表示,键是用户的 ID,值是该用户关注的所有人。
查找二级关注者:接下来,给定一个用户(比如 A),我们要找到他的二级关注者。具体来说,首先找到 A 的直接关注者,然后对每个直接关注者,再找出他们的关注者,这些就是二级关注者。
去重:注意,二级关注者的定义是“某个用户的二级关注者”,所以同一个二级关注者可能被多个直接关注者指向。为了去重,我们可以使用集合(Set)来保存结果。
代码实现
让我们用 Java 来实现这个算法。假设我们有一个 Map<Integer, List<Integer>> 来表示用户关注的关系,接着我们编写一个函数来查找二级关注者。
import java.util.*;public class SocialNetwork {
public static Set<Integer> findSecondDegreeFollowers(Map<Integer, List<Integer>> follows, int userId) {
// 用一个Set来保存二级关注者,避免重复
Set<Integer> secondDegreeFollowers = new HashSet<>();
// 获取给定用户的直接关注者列表
List<Integer> directFollowers = follows.get(userId);
if (directFollowers != null) {
for (int follower : directFollowers) {
// 遍历每个直接关注者,获取他们的关注者
List<Integer> followersOfFollower = follows.get(follower);
if (followersOfFollower != null) {
secondDegreeFollowers.addAll(followersOfFollower);
}
}
}
// 返回二级关注者
return secondDegreeFollowers;
}
public static void main(String[] args) {
// 构建用户关注关系
Map<Integer, List<Integer>> follows = new HashMap<>();
follows.put(1, Arrays.asList(2, 3)); // 用户1关注2和3
follows.put(2, Arrays.asList(4, 5)); // 用户2关注4和5
follows.put(3, Arrays.asList(6, 7)); // 用户3关注6和7
// 查找用户1的二级关注者
Set<Integer> secondDegree = findSecondDegreeFollowers(follows, 1);
// 输出二级关注者
System.out.println("用户1的二级关注者: " + secondDegree);
}
}
解释
数据结构:我们使用了一个
HashMap<Integer, List<Integer>>来存储每个用户关注的人的列表。这个Map的键是用户的 ID,值是一个列表,包含该用户的所有关注者。查找逻辑:给定用户的 ID,我们首先获取他的直接关注者列表,然后再从每个直接关注者的关注列表中提取出他们的关注者,最终将这些关注者加入一个
HashSet中,以便去重。结果:通过
addAll()方法,我们可以将所有的二级关注者添加到集合中。如果一个用户有多个直接关注者,我们会遍历每个直接关注者,找到他们的关注者并去重。
复杂度分析
这道题的时间复杂度主要取决于两个部分:
获取用户的直接关注者: O(d),其中 d 是直接关注者的数量。获取每个直接关注者的关注者: O(d * f),其中 f 是每个直接关注者的关注者数量。
因此,整体的时间复杂度为 O(d * f),即直接关注者的数量乘以每个关注者的关注者数量。
总结
虽然这道题看似简单,但实际编写起来要考虑很多细节,特别是在大数据量的情况下,如何有效地去重、提高效率是很重要的。在实际的社交网络平台中,类似的算法被广泛应用于推荐系统、社交图谱等功能的实现。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。