什么是神中神公司?发表内卷言论,分分钟要你道歉...

224 阅读3分钟

谷歌

海的那边,这几天最乐的新闻,是谷歌前 CEO 批评员工不拼命工作后道歉

今年 4 月,谷歌前 CEO 埃里克·施密特(Eric Schmidt)在斯坦福大学的一次演讲中,被问及 OpenAI 和 Anthropic 等初创公司目前在人工智能领域领先谷歌的原因时,他指出,远程工作削弱了谷歌在人工智能竞赛中的竞争力。

换句话说,这位谷歌前 CEO 将谷歌在 AI 竞赛中落后的原因归咎于居家办公 🤣🤣🤣

施密特表示:

谷歌认为,工作与生活的平衡、早点回家、在家工作比业务领先更为重要。而创业公司之所以能成功,是因为人们拼命工作。很抱歉说的这么直白,但事实就是,如果你们都离开大学去开公司,如果你想和其他创业公司竞争,你就不会让员工在家工作,每周只来公司一天。

当时这些观点,并没有掀起太多波澜,毕竟只是高校级的小范围演讲。

直到本周二,施密特当时演讲的视频被斯坦福大学上传到了 YouTube 上。

好家伙,很快施密特就道歉了,承认自己对谷歌及其工作时间的评论有误,为自己的错误感到后悔,斯坦福大学也将包含该评论观点的视频进行了删除。

不知道当时这位 CEO 是为何离职,反正我猜狗家的员工,肯定是够开心的,这么卷的 CEO 不能留,可别起头破坏净土了。

回到这个论点本身,不评论对错。

绝大多数人是依靠拼命工作来获得成功,但也有(看上去)不怎么努力就能到达顶峰的天才,用初创公司的标准去要求谷歌,本身就不合理。

或者施密特这番表达,在他的角度看来是完全在理,但至少说话的方式错了。

...

回归主题。

来一道和「翻转二叉树」(Homebrew 作者 Max Howell 当年面试谷歌没做出来的算法题)差不多难度的题。

题目描述

平台:LeetCode

题号:652

给定一棵二叉树 root,返回所有重复的子树。

对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

示例 1:

输入:root = [1,2,3,4,null,2,4,null,null,4]

输出:[[2,4],[4]]

示例 2:

输入:root = [2,1,1]

输出:[[1]]

示例 3:

输入:root = [2,2,2,3,null,3,null]

输出:[[2,3],[3]]

提示:

  • 树中的结点数在 [1,104][1,10^4] 范围内。
  • 200<=Node.val<=200-200 <= Node.val <= 200

DFS + 哈希表

设计递归函数 String dfs(TreeNode root),含义为返回以传入参数 root 为根节点的子树所对应的指纹标识。

对于标识的设计只需使用 "_" 分割不同的节点值,同时对空节点进行保留(定义为空串 " ")即可。

使用哈希表记录每个标识(子树)出现次数,当出现次数为 2(首次判定为重复出现)时,将该节点加入答案。

Java 代码:

class Solution {
    Map<String, Integer> map = new HashMap<>();
    List<TreeNode> ans = new ArrayList<>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        dfs(root);
        return ans;
    }
    String dfs(TreeNode root) {
        if (root == null) return " ";
        StringBuilder sb = new StringBuilder();
        sb.append(root.val).append("_");
        sb.append(dfs(root.left)).append(dfs(root.right));
        String key = sb.toString();
        map.put(key, map.getOrDefault(key, 0) + 1);
        if (map.get(key) == 2) ans.add(root);
        return key;
    }
}

Typescript 代码:

let ans: Array<TreeNode>
let map: Map<string, number>
function findDuplicateSubtrees(root: TreeNode | null): Array<TreeNode | null> {
    ans = new Array<TreeNode>()
    map = new Map<string, number>()
    dfs(root)
    return ans
};
function dfs(root: TreeNode | null): string {
    if (root == null) return " "
    let key = root.val + "_"
    key += dfs(root.left)
    key += dfs(root.right)
    if (!map.has(key)) map.set(key, 1)
    else map.set(key, map.get(key) + 1)
    if (map.get(key) == 2) ans.push(root)
    return key
}
  • 时间复杂度:DFS 过程复杂度为 O(n)O(n),对于每个子树需要构造出与子树同等规模的字符串,复杂度为 O(n)O(n)。整体复杂度为 O(n2)O(n^2)
  • 空间复杂度:O(n)O(n)