给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素
时间: 2023-03-31 10:00:34 浏览: 100
答案:这个问题可以回答。只需要使用位运算的思路,对于每一位,统计数组中所有数字在该位上出现的次数之和,如果该和不是 3 的倍数,那么只出现一次的数字在该位上一定是 1,否则就是 。最终将所有位的结果拼接起来,就是只出现一次的数字。
相关问题
Java:给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
可以使用位运算来解决这个问题。具体来说,我们可以对所有数字的二进制表示的每一位进行统计,统计每一位上所有数字出现次数的和,并对 3 取余,如果余数不为 0,则说明只出现一次的数字在这一位上有值。最后将所有有值的位组合起来,就得到了只出现一次的数字。
以下是 Java 代码实现:
public int singleNumber(int[] nums) {
int[] bitSum = new int[32];
for (int num : nums) {
for (int i = 0; i < 32; i++) {
bitSum[i] += (num >> i) & 1;
}
}
int res = 0;
for (int i = 0; i < 32; i++) {
res |= (bitSum[i] % 3) << i;
}
return res;
}
有一个整数数组 ,其中有一个元素只出现了一次,其余每个元素都刚好出现了三次 。 请你编写c++程序找到并输出那个只出现了一次的元素。
可以使用位运算来解决这个问题。我们可以定义一个长度为32的数组count,用来记录每一位上1出现的次数。然后遍历数组,对于每一个数,将它的每一位与1进行与操作,如果结果是1,那么就将count数组对应的位置加1。最后,对于count数组中每一位,如果该位上的值不是3的倍数,那么我们可以将该位上的1拼接起来,得到只出现一次的元素。
以下是代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int findSingle(vector<int>& nums) {
int count[32] = {0};
for (int i = 0; i < nums.size(); i++) {
int num = nums[i];
for (int j = 0; j < 32; j++) {
if ((num >> j) & 1) {
count[j]++;
}
}
}
int res = 0;
for (int i = 0; i < 32; i++) {
if (count[i] % 3 != 0) {
res |= (1 << i);
}
}
return res;
}
int main() {
vector<int> nums = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4};
int res = findSingle(nums);
cout << res << endl;
return 0;
}
```
输出结果为:
```
4
```
阅读全文