字节实习生
之前我们提到的 字节跳动实习生破坏大模型 的事件,有最新后续了。
给一些新来的读者,简单回顾一下:这名搞破坏的实习生,干扰了字节跳动内部的研究项目类的训练任务,造成了"算力资源"和"排查原因资源"的浪费。
当时网传的「涉及 8000 多张卡、造成上千万美元损失、人已进去」等说法,都属于"夸大其词"。
后来字节官方眼看谣言越传越离谱,还专门出来辟谣:
那位实习生搞破坏的原因也很奇葩:对团队分配资源表示不满。
原以为事情到这就结束了,毕竟犯错的是实习生,而且破坏的也只是实验性的训练任务,并不影响商业化的正式项目及线上业务。
但没想到,字节决定追究到底,而且法院已经正式受理。
11 月 25 日,字节跳动起诉前实习生田某某篡改代码攻击公司内部模型训练一案,已获北京市海淀区人民法院正式受理。
字节跳动请求法院,判令田某某赔偿公司侵权损失 800 万元及合理支出 2 万元,并公开赔礼道歉。
好家伙,800 多万,不要说实习生,就算罚的高管,估计也吃不消。
个人猜测,字节胜诉是肯定的,而后续的走向只会有两种结果:
重定一个实习生能支付得起的金额,实习生正常履行判决,并公开道歉; 实习生无法支付赔偿金额,面临其他方式的刑事责任;
对此,你怎么看?你觉得「字节要求赔偿 800 多万」这一做法是否太过?欢迎评论区交流。
...
回归主题。
来一道和「字节跳动」相关的算法题。
题目描述
平台:LeetCode
题号:477
两个整数的汉明距离指的是这两个数字的二进制数对应位不同的数量。
给你一个整数数组 nums
,请你计算并返回 nums
中任意两个数之间汉明距离的总和。
示例 1:
输入:nums = [4,14,2]
输出:6
解释:在二进制表示中,4 表示为 0100 ,14 表示为 1110 ,2表示为 0010 。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6
示例 2:
输入:nums = [4,14,4]
输出:4
提示:
给定输入的对应答案符合 32-bit
整数范围
按位统计
我们知道,汉明距离为两数二进制表示中不同位的个数,同时每位的统计是相互独立的。
即最终的答案为 ,其中 函数为求得所有数二进制表示中的某一位 所产生的不同位的个数。
我们考虑某个 如何求得:
事实上,对于某个 nums[i]
我们只关心在 nums
中有多少数的第 位的与其不同,而不关心具体是哪些数与其不同,同时二进制表示中非 即 。
这指导我们可以建立两个集合 和 ,分别统计出 nums
中所有数的第 位中 的个数和 的个数,集合中的每次计数代表了 nums
中的某一元素,根据所在集合的不同代表了其第 位的值。那么要找到在 nums
中有多少数与某一个数的第 位不同,只需要读取另外一个集合的元素个数即可,变成了 操作。那么要求得「第 位所有不同数」的对数的个数,只需要应用乘法原理,将两者元素个数相乘即可。
前面说到每位的统计是相对独立的,因此只要对「每一位」都应用上述操作,并把「每一位」的结果累加即是最终答案。
Java 代码:
class Solution {
public int totalHammingDistance(int[] nums) {
int ans = 0;
for (int x = 31; x >= 0; x--) {
int s0 = 0, s1 = 0;
for (int u : nums) {
if (((u >> x) & 1) == 1) s1++;
else s0++;
}
ans += s0 * s1;
}
return ans;
}
}
C++ 代码:
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans = 0;
for (int x = 31; x >= 0; x--) {
int s0 = 0, s1 = 0;
for (int u : nums) {
if (((u >> x) & 1) == 1) s1++;
else s0++;
}
ans += s0 * s1;
}
return ans;
}
};
Python 代码:
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
ans = 0
for x in range(31, -1, -1):
s0, s1 = 0, 0
for u in nums:
if ((u >> x) & 1) == 1:
s1 += 1
else:
s0 += 1
ans += s0 * s1
return ans
TypeScript 代码:
function totalHammingDistance(nums: number[]): number {
let ans = 0;
for (let x = 31; x >= 0; x--) {
let s0 = 0, s1 = 0;
for (let u of nums) {
if (((u >> x) & 1) == 1) s1++;
else s0++;
}
ans += s0 * s1;
}
return ans;
};
时间复杂度:, 固定为 空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。