题目描述
教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions
,其中 actions[i]
表示做出该动作的人员编号。请返回教练的编号。
示例 1:
输入:actions = [5, 7, 5, 5] 输出:7
示例 2:
输入:actions = [12, 1, 6, 12, 6, 12, 6] 输出:1
提示:
1 <= actions.length <= 10000
1 <= actions[i] < 2^31
NOTE:某一个数字出现3次,那么他们的每一位的和分别可以被3整除。
示例:
数组=[2,2,3,2,6,3,3]
在这个数组中,每个数字除了数字6之外都出现了三次,而数字6只出现了一次。我们的目标是找到这个只出现一次的数字6。
- 第0位:2(010), 2(010), 3(011), 2(010), 6(110), 3(011), 3(011)
- 1的总数:2 + 2 + 1 + 2 + 0 + 1 + 1 = 9(可以被3整除,结果0)
- 第1位:
- 1的总数:1 + 1 + 1 + 1 + 1 + 1 + 1 = 7(不能被3整除,结果2^1)
- 第2位:
- 1的总数:0 + 0 + 0 + 0 + 1 + 0 + 0 = 1(不能被3整除,结果2^2)
最终,第1位和第2位上的1的总数不能被3整除,说明这两位在只出现一次的数字中是1。因此,最终结果为:
21+22=2+4=621+22=2+4=6
这样,我们就找到了数组中唯一出现一次的数字6
完整代码:
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int result = 0; // result 用来存储最终的结果,初始化为0。
int size = actions.size(); // 获取数组的长度,避免多次调用size()方法。
// 循环遍历每一个位(整数由32位组成)
for(int i = 0; i < 32; i++) {
int temp = 0; // 临时变量temp用于计算所有数字在第i位上的1的总和。
// 遍历数组中的每个元素,累加第i位的值
for(int j = 0; j < size; j++) {
temp += (actions[j] >> i) & 1; // 将第j个元素右移i位后与1进行AND操作,得到第i位的值,并累加到temp。
}
// 如果第i位上1的总数不能被3整除,说明单独出现一次的数字在这一位上是1
if(temp % 3) {
result += 1 << i; // 通过左移操作将1移动到第i位,然后加到result中。
}
}
return result; // 返回找到的那个唯一不是出现三次的数字。
}
};