56Ⅱ.数组中数字出现的数字
大约 1 分钟
56Ⅱ.数组中数字出现的数字
参考链接
剑指 Offer 56 – II. 数组中数字出现的次数 II-跟着帅地玩转校招,刷爆各类算法题帅地玩Offer
LCR 178. 训练计划 VI - 力扣(LeetCode)
优秀题解
class Solution {
public int trainingPlan(int[] actions) {
int[] counts = new int[32];
for(int action : actions) {
for(int i = 0; i < 32; i++) {
counts[i] += action & 1; // 更新第 i 位 1 的个数之和
action >>= 1; // 第 i 位 --> 第 i 位
}
}
int res = 0, m = 3;
for(int i = 31; i >= 0; i--) {
res <<= 1;
res |= counts[i] % m; // 恢复第 i 位
}
return res;
}
}
作者:Krahets
链接:https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
个人理解:
由于重复出现的数会出现三次,
那么从二进制位来看,将数组中所有数字转化成32个二进制数(int,32位)表示,
并且统计每个位置 1 出现的次数,
随后对 3 进行求余,
倘若重复出现 3 次或 3 的倍数 求余结果 等于 0,
不等于 0 则代表只出现一次,
因此统计 数组所有元素(二进制表示) 32 个比特位中每个位置出现的 1 次数,随后对统计的结果进行 32 次求余,并且将求余结果拼接可得到结果