12月25日,也就是昨天,字节跳动企业纪律与职业道德委员会发布中国大陆地区2025年4号通报,2025年三季度共有120名员工因触犯公司红线政策被辞退,其中有14人因涉嫌刑事犯罪被移交司法机关处理,另有4人因违规情节恶劣被采取类似措施。‌

字节因内部违规辞退员工也不是一次两次了,其中‌2025年二季度‌有100名员工因违规被辞退,18人被实名通报,8人涉嫌刑事犯罪被移交司法机关。2024年全年字节辞退违规员工353人,其中39人被追究刑事责任,主要案例涉及电商采购环节的定制化腐败、技术部门资源滥用导致计算资源损耗等。‌

具体的案例有:某前员工在小红书编造公司裁员和变相降薪等谣言,对公司声誉造成负面影响;某前员工多次在脉脉平台泄露同事职级、工作履历等公司机密信息,并编造公司和团队人员变动的不实信息。以上2名员工现已被公司辞退。

字节每年因违规辞退那么多人,但依然有人在不断的试探公司底线。不过也能想象出来,字节体量那么大,总有监管不到位的地方,这就给了一些人可乘之机。还有就是大公司更注重声誉,如果是个小公司你编造裁员降薪,别人可能没听过这家公司,根本就不会在乎,但大公司就不一样,但凡有个风吹草动就会引起网络热议。

打开网易新闻 查看精彩图片

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第955题:删列造序 II,难度是中等。

给定由 n 个字符串组成的数组 strs,其中每个字符串长度相等。选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。

比如,有 strs = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 strs 为["bef", "vyz"]。

假设,我们选择了一组删除索引 answer,那么在执行删除操作之后,最终得到的数组的元素是按 字典序(strs[0] <= strs[1] <= strs[2] ... <= strs[n - 1])排列的,然后请你返回 answer.length 的最小可能值。

示例1:

输入:strs = ["ca","bb","ac"] 输出:1 解释: 删除第一列后,strs = ["a", "b", "c"]。 现在 strs 中元素是按字典排列的 (即,strs[0] <= strs[1] <= strs[2])。 我们至少需要进行 1 次删除,因为最初 strs 不是按字典序排列的,所以答案是 1。

示例2:

输入:strs = ["xc","yb","za"] 输出:0 解释: strs 的列已经是按字典序排列了,所以我们不需要删除任何东西。 注意 strs 的行不需要按字典序排列。 也就是说,strs[0][0] <= strs[0][1] <= ... 不一定成立。

  • n == strs.length

  • 1 <= n <= 100

  • 1 <= strs[i].length <= 100

  • strs[i] 由小写英文字母组成

问题分析

这题说的是让删除最少的列,让剩下的字符串保持递增,这和我们昨天讲的那道题不太一样,昨天的题是让删除最少的列,让剩下的列保持递增,很明显这题难度更大一些。

我们仔细观察找一下规律,比如字符串 "ce" 和 "af" ,因为第一个字符 c 大于 a ,所以字符串["ce" , "af" ]不可能是递增的,所以第一列要删除,也就是 c 和 a 删除,删除之后再继续比较后面的。

比如字符串 "af" 和 "ce" ,因为第一个字符 a 小于 c ,所以不管后面是什么字符,则字符串[ "af" , "ce" ]一定是递增的,所以后面的就不需要在比较了。

比如字符串 "ae" 和 "af" ,因为第一个字符都是 a ,相等,所以不需要删除,只需要比较后面的即可。

提炼出了上面的3条规律,这题解起来就简单多了,我们需要使用一个数组mp,其中mp[i]表示的是第 i 行和第 i+1 行是否是递增的,如果mp[i]是true就是上面分析的第二种情况,说明前面已经比较过了,是递增的,这里就不需要在比较了。如果mp[i]是false,我们就需要继续比较,代码如下。

JAVA:

public int minDeletionSize(String[] strs) {
int m = strs.length, n = strs[0].length();
// mp[i]表示第 i 行和第 i+1 行是否确定了大小关系,如果确定了,之后就不需要再比较了。
boolean[] mp = newboolean[m - 1];
int ans = 0;// 删除列的数量
for (int i = 0; i < n; i++) {// 遍历列
boolean delete = false;// 判断当前列是否需要删除。
for (int j = 0; j < m - 1; j++) {// 遍历行
if (!mp[j] && strs[j].charAt(i) > strs[j + 1].charAt(i)) {
delete = true;// 当前列需要删除
ans++;
break;
}
}
if (!delete) {// 如果当前列没有删除,在确定每行和下一行大小关系
for (int j = 0; j < m - 1; j++) {// 行
if (!mp[j] && strs[j].charAt(i) < strs[j + 1].charAt(i)) {
mp[j] = true;// 表示第 j 行的字典序比 j+1 行小,后面就不需要再比较了。
}
}
}
}
return ans;
}

C++:

public:
int minDeletionSize(vector &strs) {
int m = strs.size(), n = strs[0].length();
// mp[i]表示第 i 行和第 i+1 行是否确定了大小关系,如果确定了,之后就不需要再比较了。
vector mp(m - 1);
int ans = 0;// 删除列的数量
for (int i = 0; i < n; i++) {// 遍历列
bool del = false;// 判断当前列是否需要删除。
for (int j = 0; j < m - 1; j++) {// 遍历行
if (!mp[j] && strs[j][i] > strs[j + 1][i]) {
del = true;// 当前列需要删除
ans++;
break;
}
}
if (!del) {// 如果当前列没有删除,在确定每行和下一行大小关系
for (int j = 0; j < m - 1; j++) {// 行
if (!mp[j] && strs[j][i] < strs[j + 1][i]) {
mp[j] = true;// 表示第 j 行的字典序比 j+1 行小,后面就不需要再比较了。
}
}
}
}
return ans;
}

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解900多题,对算法题有自己独特的解题思路和解题技巧。