程序员老鬼

网友吐槽:外包做事真是极其不负责,一点owner精神都没有,活该当一辈子外包,真tm不靠谱。。。

嗨,大家好!最近看到一个挺有意思的网友吐槽,内容大致是关于外包员工做事不靠谱的。

说的是让外包做个Grafana面板,结果半个月都搞不定。

Image

从我这个做程序员的角度来看,外包他们不像我们这些正式员工那样,可能会对项目的长期发展有责任感,也没有那么强的归属感。

外包通常是按任务收费,做完就走,能拖则拖,毕竟他们的目标只是交付,而不是关心后期的维护和优化。

Image

不过,网友的批评也不完全没有道理。

毕竟如果你要求外包做到“owner”的水平,那是不是有点过分?

Image

要么就直接招聘正式员工来负责这些工作,要么就给外包方明确的责任和期限。

换句话说,问题的根源其实在于公司对外包的管理不到位,期待过高但又没给相应的支持。

算法题:二级关注者

今天咱们来聊个技术题目:二级关注者。

你可能会问,啥是二级关注者?你是不是在用“社交媒体平台”的语言来给我整技术题?没错,别被名字迷惑了,其实这个问题的核心跟我们常见的图算法相关。如果你在写社交网络功能或者构建一个图模型,你就会发现,这类题目挺常见的。咱们今天就用Java来一步步捋清楚这道题。

假设你有一个社交网络,每个用户可以关注其他用户,我们要找出某个用户的二级关注者。

举个例子,假设用户 A 关注了用户 B,用户 B 关注了用户 C,那么 C 就是 A 的“二级关注者”,因为 C 是 B 的关注对象,而 B 又是 A 的关注对象。

这道题可以看似简单,但要实现清晰且高效的解决方案,还是得有点技巧。我们将它抽象成一个图问题,其中每个用户是图中的一个节点,关注关系就是图中的一条有向边。

算法思路

  1. 图的构建:首先,我们要为每个用户构建一个图结构,这个结构可以用一个哈希表来表示,键是用户的 ID,值是该用户关注的所有人。

  2. 查找二级关注者:接下来,给定一个用户(比如 A),我们要找到他的二级关注者。具体来说,首先找到 A 的直接关注者,然后对每个直接关注者,再找出他们的关注者,这些就是二级关注者。

  3. 去重:注意,二级关注者的定义是“某个用户的二级关注者”,所以同一个二级关注者可能被多个直接关注者指向。为了去重,我们可以使用集合(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);
    }
}

解释

  1. 数据结构:我们使用了一个 HashMap<Integer, List<Integer>> 来存储每个用户关注的人的列表。这个 Map 的键是用户的 ID,值是一个列表,包含该用户的所有关注者。

  2. 查找逻辑:给定用户的 ID,我们首先获取他的直接关注者列表,然后再从每个直接关注者的关注列表中提取出他们的关注者,最终将这些关注者加入一个 HashSet 中,以便去重。

  3. 结果:通过 addAll() 方法,我们可以将所有的二级关注者添加到集合中。如果一个用户有多个直接关注者,我们会遍历每个直接关注者,找到他们的关注者并去重。

复杂度分析

这道题的时间复杂度主要取决于两个部分:

  • 获取用户的直接关注者:O(d),其中 d 是直接关注者的数量。
  • 获取每个直接关注者的关注者:O(d * f),其中 f 是每个直接关注者的关注者数量。

因此,整体的时间复杂度为 O(d * f),即直接关注者的数量乘以每个关注者的关注者数量。

总结

虽然这道题看似简单,但实际编写起来要考虑很多细节,特别是在大数据量的情况下,如何有效地去重、提高效率是很重要的。在实际的社交网络平台中,类似的算法被广泛应用于推荐系统、社交图谱等功能的实现。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

Image

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。