飞书很好,但赢不了,只能裁员

心碎飞书

3 月 26 日,字节跳动旗下产品飞书的 CEO 谢欣发布全员信,正式宣布进行新一轮的组织调整,即裁员。

内部全员信如下:

alt

我有不少朋友是在字节跳动,甚至就在 Lark 的。

同时我也因为会经常和一些平台的运营小伙伴有沟通需求,经常会使用飞书。

说一下我对飞书的看法。

飞书是一个很棒的产品,它能给你一些在其他 App(企业微信、钉钉)体会不到的舒适感。

企业微信和钉钉这两个 App 我也看过,在 tabbar 随便点点就会有满屏 icon 按宫格布局的界面。明明什么都还没做,那种无形的压力就上来了,在飞书上我基本上没有这种感觉。

那些宫格布局的功能,飞书也有,只不过紧迫感被良好的 UI 设计给摊开掉了。

当然,可能不少人会认为,作为一个办公应用,企业微信和钉钉给人带来的紧迫感觉,才是对的 ...

但办公软件敢于简洁化,恰恰说明产品的自信。

作为一个 5G 冲浪选手,我也没少听说飞书在 C 端收获的好评。

你没听错,很多个人团队/小型工作室,甚至只是有即时通讯需求的个人,也会选择飞书,这对于一个办公类的 IM 软件来说,是不可想象的。

那,如此好的一款产品,为什么会走到这一步?

总归到底,飞书应该是一款 B 端产品,而非其他

基本面垮了,别的地方再好也没用。

飞书好比是名田径运动员,额外点亮了体操这一技能,气质方面满分,但田径成绩长期与第一二名断层。

要知道,大众(无论个人还是企业,企业一定程度也是个人)心智空间,往往只够容纳第一名,少数情况能容纳第二名,例如「可乐可乐和百事可乐」以及「企业微信和钉钉」,而飞书是三名。

导致局面的原因是显然的。

企业微信背靠微信,具有天然的链接优势,而钉钉依靠于入场得早,以及前期与政府的和谐关系,也抢占了属于自己的份额。

那飞书呢?

飞书只能去 to B 一些人家不要的企业,同时字节又和政府关系不好,丢失了最大头的客户。

后发的飞书,哪怕要成为前三,也注定要砸巨量资源,所以目前飞书的人数是钉钉的五倍。

从产品和组织架构来看,精简,确实是飞书现在应该要走的路。

只不过,时代的尘埃这次又要几百上千的人来一同承担了。

...

回归主线。

来做一道和「飞书」相关的算法原题。

题目描述

平台:LeetCode

题号:621

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,其中每个字母表示一种不同种类的任务。

任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。

在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

然而,两个相同种类的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的最短时间。

示例 1:

输入:tasks = ["A","A","A","B","B","B"], n = 2

输出:8

解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
     在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 

示例 2:

输入:tasks = ["A","A","A","B","B","B"], n = 0

输出:6

解释:在这种情况下,任何大小为 6 的排列都可以满足要求,因为 n = 0
["A","A","A","B","B","B"]
["A","B","A","B","A","B"]
["B","B","B","A","A","A"]
...
诸如此类

示例 3:

输入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2

输出:16

解释:一种可能的解决方案是:
     A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A

提示:

  • tasks[i] 是大写英文字母
  • n 的取值范围为

构造

先考虑最为简单的情况:假设只有一类任务,除了最后一个任务以外,其余任务在安排后均需要增加 个单位的冻结时间。

alt

将任务数记为 个,其中前 个任务均要消耗 的单位时间,最后一个任务仅消耗 个单位时间,即所需要的时间为

「当存在多个任务时,由于每一类任务都需要被完成,因此本质上我们最需要考虑的是将数量最大的任务安排掉,其他任务则是间插其中。」

假设数量最大的任务数为 max,共有 tot 个任务数为 max 的任务种类。

实际上,当任务总数不超过 时,我们总能将其他任务插到空闲时间中去,不会引入额外的冻结时间(下左图);而当任务数超过该值时,我们可以在将其横向添加每个 块的后面,同时不会引入额外的冻结时间(下右图):

alt

综上,我们所需要的最小时间为上述两种情况中的较大值即可:

Java 代码:

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] cnts = new int[26];
        for (char c : tasks) cnts[c - 'A']++;
        int max = 0, tot = 0;
        for (int i = 0; i < 26; i++) max = Math.max(max, cnts[i]);
        for (int i = 0; i < 26; i++) tot += max == cnts[i] ? 1 : 0;
        return Math.max(tasks.length, (n + 1) * (max - 1) + tot);
    }
}

C++ 代码:

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        vector<intcnts(260);
        for (char c : tasks) cnts[c - 'A']++;
        int maxv = *max_element(cnts.begin(), cnts.end());
        int tot = count(cnts.begin(), cnts.end(), maxv);
        return max(static_cast<int>(tasks.size()), (n + 1) * (maxv - 1) + tot);
    }
};

Python 代码:

class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        cnts = [0] * 26
        for c in tasks:
            cnts[ord(c) - ord('A')] += 1
        maxv, tot = 00
        for i in range(26):
            maxv = max(maxv, cnts[i])
        for i in range(26):
            tot += 1 if maxv == cnts[i] else 0
        return max(len(tasks), (n + 1) * (maxv - 1) + tot)

TypeScript 代码:

function leastInterval(tasks: string[], n: number): number {
    const cnts = new Array<number>(26).fill(0)
    for (const c of tasks) cnts[c.charCodeAt(0) - 'A'.charCodeAt(0)]++
    let max = 0, tot = 0
    for (let i = 0; i < 26; i++) max = Math.max(max, cnts[i])
    for (let i = 0; i < 26; i++) tot += max == cnts[i] ? 1 : 0
    return Math.max(tasks.length, (n + 1) * (max - 1) + tot)
}
  • 时间复杂度:
  • 空间复杂度: ,其中 为任务字符集大小

最后

给大伙通知一下 📢 :

全网最低价 LeetCode 会员目前仍可用,快来薅羊毛!!!

📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!

🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!

🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!

专属链接:https://leetcode.cn/premium/?promoChannel=acoier

更多详情请戳 这里 。

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kimi 200万字爆火,通义加码1000万,阿里笑而不语

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我怎么感觉Kimi是一个“网红”产品呢?在没有任何预兆情况下&#xff0c;国产AI大模型Kimi突然爆火&#xff0c;最近我在很多平台上看到了Kimi的广告&#xff0c;感觉到处都在吹这个产品。 看见上面的新闻了吧&a…

抓包工具charles修改请求和返回数据

数据篡改的主要使用场景&#xff1a; &#xff08;1&#xff09;mock场景&#xff0c;mock入参和返回值参数&#xff0c;实现mock测试 &#xff08;2&#xff09;安全测试&#xff0c;对于支付金额等比较重要的字段&#xff0c;可以修改请求参数来进行安全测试 1.首先选择要…

2024春招小红书前端面试题分享

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

DNS协议 是什么?说说DNS 完整的查询过程?

一、是什么 DNS&#xff08;Domain Names System&#xff09;&#xff0c;域名系统&#xff0c;是互联网一项服务&#xff0c;是进行域名和与之相对应的 IP 地址进行转换的服务器 简单来讲&#xff0c;DNS相当于一个翻译官&#xff0c;负责将域名翻译成ip地址 IP 地址&#…

表格中的状态类型值(tag)

一&#xff1a;数字转换为简单的中文值 ** 不用转换直接用find()方法&#xff1a;在statusList里找&#xff1b; **lastHandleCode是对应的获取到的每行数据的code值&#xff1b; vue: <el-table-column label"执行状态" align"center"><templat…

MBR分区挂了机器起不来的两种方法解决方法

当MBR分区挂了机器起不来&#xff0c;可以试试下面的两种方法 场景1&#xff1a;开机启动&#xff0c;起不来&#xff0c;发现MBR挂了&#xff0c;但分区表还在 实验方法&#xff1a; 破坏mbr引导 MBR:44864分区表数据512bytes 首先模拟MBR损坏 然后重启&#xff0c;可以看到…

【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

文章目录 一、简介二、特点三、下载与安装四、使用4.1 服务器启动4.2 客户端连接命令4.3 修改Redis配置文件4.4 客户端图形化界面 五、数据类型5.1 五种常用数据类型介绍5.2 各种数据类型特点 六、常用命令6.1 字符串操作命令6.2 哈希操作命令6.3 列表操作命令6.4 集合操作命令…

怎么创建百科人物的词条?百度百科词条创建

百度百科中&#xff0c;创建一个属于自己的词条&#xff0c;不仅是个人荣誉的象征&#xff0c;更是对其生平事迹的官方记录&#xff0c;能够让更多人了解和记住一个人的成就。那么&#xff0c;如何创建一个高质量的百科人物词条呢&#xff1f;本文伯乐网络传媒将详细解答这一问…

方案公司在当前形势下,该如何发展?

什么是方案公司&#xff1f;方案公司的简单说就是帮助第三方厂家把产品做出来&#xff0c;并从中收取部分的研发费用及提成。 方案公司的存在意义&#xff0c;帮助企业节省成本&#xff0c;降低研发风险&#xff0c;不用雇佣那么多人去研发一个新产品&#xff0c;特别是对中小企…

CPU设计实战-外设接口介绍与测试

GPIO 内置寄存器&#xff0c;BASE地址由外设所在设备接口处决定&#xff0c;这样就可以确定每个寄存器的地址&#xff1b; 要使用输出先要使能&#xff0c;要用中断也先要使能&#xff1b; 测试实验-数码管驱动 数码管与GPIO的输出接口连接 编写汇编语言 1.使能输出端口 2…

LangChain入门:3.调用OpenAI的聊天机器人-入门

内容 本次入门内容是调用OpenAI的聊天机器人功能。 实现原理是使用OpenAI提供的API&#xff0c;通过向其发送请求来生成回复文本。 首先&#xff0c;导入ChatOpenAI类&#xff0c;这个类是用于实现与OpenAI聊天机器人交互的。 pip install langchain-openai2. 编写调试代码 …

07、JS实现:用回溯法实现数组全排列的算法(一步一步剖析,很详细)

回溯法实现数组全排列的算法 Ⅰ、回溯法实现数组全排列&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅱ、小结&#xff1a; Ⅰ、回溯法实现数组全排列&#xff1a; 1、题目描述&#xff1a; 给定⼀个 没有重复 数字的序列&#xff0c;…

Pillow教程06:将图片中出现的黄色和红色,改成绿色

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

律甲法务OA平台:信鸥科技引领法律行业新篇章

随着信息技术的飞速发展&#xff0c;法律行业也迎来了数字化转型的重要时刻。在这个信息化、智能化的时代&#xff0c;如何运用科技手段提升法律服务的质量和效率&#xff0c;成为法律行业亟待解决的问题。信鸥科技&#xff0c;作为业界的佼佼者&#xff0c;凭借其深厚的技术积…

flask_Restful数据解析参数设置

add_argument 方法参数详解 add_argument方法可以指定这个字段的名字&#xff0c;这个字段的数据类 型等&#xff0c;验证错误提示信息等&#xff0c;具体如下&#xff1a; default&#xff1a;默认值&#xff0c;如果这个参数没有值&#xff0c;那么将使用这个参数 指定的默认…

CTR之Session行为序列建模用户兴趣:DSIN

在前面的文章中&#xff0c;DIN模型 在用户行为序列建模中引入注意力机制来强调加权与target item相关的行为&#xff0c;以实现动态的兴趣表征&#xff1b;而DIEN模型 则在DIN的基础上加入时间性信息&#xff0c;使用注意力机制的GRU来挖掘用户兴趣的演变。 而今天的这篇文章…

labelme自动标注工具的安装和python代码修改

labelme嵌入SAM和EfficientSAM自动标注模型 目录: 1.labelme windows环境下安装python版本labelme 2.labelme.exe直接安装 3.labelme生成exe 4.labelme python代码修改 labelme自动标注使用方法 编辑/Create AI-Polygon 自动分割,直接生成分割图,标注为point,完成标注后…

如何用AI写作工具输出高质量内容?

随着人工智能技术的不断发展&#xff0c;AI写作工具正逐渐成为现代写作者的得力助手。它们能够通过智能算法分析大量的数据&#xff0c;生成高质量的文章内容&#xff0c;极大地提高了写作效率。但是&#xff0c;如何正确地使用这些AI写作工具输出高质量的内容&#xff0c;仍然…

Windows Server服务器FTP服务的配置与管理

前不久我们遇到一个Hostease的客户进行服务器迁移&#xff0c;他需要在Windows Server 2019上设置FTP&#xff08;File Transfer Protocol&#xff09;服务以帮助他在服务器和客户端之间传输文件。本教程将指导您逐步完成设置FTP服务的过程&#xff0c;并附上详细的图文说明&am…

AI智能分析网关V4使用GB28181注册到EasyCVR平台的具体步骤

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…