public int trainingPlan(int[] nums) {
// 创建一个长度为 32 的数组 res,用于统计每个二进制位上出现的次数
int[] res = new int[32];
// 初始权值 m 为 1
int m = 1;
// 初始化结果 sum 为 0
int sum = 0;
// 遍历每个二进制位
for (int i = 0; i < 32; i++) {
// 统计数组中所有数字在当前二进制位上出现的次数
for (int j = 0; j < nums.length; j++) {
// 如果当前数字 nums[j] 在当前二进制位上为 1,则 res[i] 加 1
if ((nums[j] & m) != 0) {
res[i]++;
}
}
// 对统计结果取模,得到只出现一次的数字在当前二进制位上的值
res[i] = res[i] % 3;
// 将当前二进制位上的值加入到最终结果 sum 中
sum = sum + res[i] * m;
// 更新权值 m,用于处理下一个二进制位
m = m << 1;
}
// 返回最终结果
return sum;
}
class Solution {
public int trainingPlan(int[] actions) {
int[] res = new int [32];
int m=1;
int sum=0;
for(int i=0;i<32;i++){
for(int j=0;j<actions.length;j++){
if((actions[j]&m)!=0)
res[i]++;
}
res[i]=res[i]%3;
sum=sum+res[i]*m;
m=m<<1;
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res = new int[32]; //整型为32个bit
int m = 1;
int sum = 0;
for(int i = 0; i < 32; i++){
for(int j = 0; j < nums.length; j++){
if((nums[j] & m) != 0){
res[i]++;//用来统计二进制的第m位是否为1,为1则++
}
}
res[i] = res[i] % 3;//对3取余能够过滤出单身号所在i位置的二进制位
sum = sum + res[i] * m;//统计化成十进制表示
m = m << 1;//左移1位用于统计下次的二进制位
}
return sum;
}
}
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int sum = 0;
vector<int> res(32,0);//整形为32个bit
int m = 1;
for(int i=0;i<32;i++){
for(int j=0;j<actions.size();j++){
if((actions[j]&m) != 0){
res[i]++;//用来统计二进制的第m位是否为1,为1则++
}
}
res[i] = res[i]%3;//对3取余能够过滤出单身号所在i位置的二进制位
sum += res[i]*m;//统计化成十进制表示
m = m << 1;//左移1位用于统计下次的二进制位
}
return sum;
}
};
//方法一 时间On 空间O1
class Solution {
public int trainingPlan(int[] actions) {
int ans = 0;
int p = 1;
for(int i = 0 ; i < 32; i++){
int sum = 0;
for(int j = 0; j < actions.length; j++){
sum += (actions[j] & p)!=0 ? 1 : 0 ;
}
ans += p * (sum % 3);
p <<= 1;
}
return ans;
}
}
//方法二 有限状态机//时间On 空间O1
class Solution {
public int trainingPlan(int[] actions) {
int A = 0;
int B = 0;
for(int action :actions){
int temp = A;
A = A & (~B) & (~action) | (~A) & B & action;
B = ~temp & (B ^ action);
}
return B;
}
}
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int m = 1;
int res = 0;
for(int i = 0; i < 32; ++i) {
int sum = 0;
for(int j = 0; j < actions.size(); ++j) {
if((actions[j] & m) != 0) sum++;
}
sum = sum % 3;
res += sum * m;
m = m << 1;
}
return res;
}
};
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int m = 1;
int res = 0;
for(int i = 0; i < 32; ++i) {
int sum = 0;
for(int j = 0; j < actions.size(); ++j) {
if((actions[j] & m) != 0) sum++;
}
sum = sum % 3;
res += sum * m;
m = m << 1;
}
return res;
}
};
class Solution {
public:
int trainingPlan(vector<int>& actions) {
int m = 1;
int res = 0;
for(int i = 0; i < 32; ++i) {
int sum = 0;
for(int j = 0; j < actions.size(); ++j) {
if((actions[j] & m) != 0) sum++;
}
sum = sum % 3;
res += sum * m;
m = m << 1;
}
return res;
}
};
/**
* @param {number[]} actions
* @return {number}
*/
var trainingPlan = function (actions) {
let res = new Array(32).fill(0)
let m = 1
let sum = 0
for (let i = 0; i < 32; i++) {
for (let j = 0; j < actions.length; j++) {
if ((actions[j] & m) != 0) {
res[i]++
}
}
res[i] = res[i] % 3
sum = sum + res[i] * m
m = m << 1 //进位
}
return sum
};
用哈希表写的:
class Solution {
public int trainingPlan(int[] actions) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<actions.length;i++){
if(map.containsKey(actions[i])){
int temp = map.get(actions[i]);
map.put(actions[i],temp+1);
continue;
}
map.put(actions[i],1);
}
int result = 0;
for(Integer integer:map.keySet()){
if(map.get(integer)==1){
result = integer;
break;
}
}
return result;
}
}
用位运算写的
class Solution {
public int trainingPlan(int[] actions) {
int[] res = new int[32];
int sum = 0;
int m = 1;
for(int i = 0;i<32;i++){
for(int j=0;j<actions.length;j++){
if((actions[j]&m)!=0){
res[i]++;
}
}
res[i] = res[i]%3;
sum = sum+res[i]*m;
m = m<<1;
}
return sum;
}
}
共以下 19 个回答
class Solution {
public int trainingPlan(int[] actions) {
int[] res = new int[32];
int m = 1;
int ans = 0;
}
时间:O(n)
空间:O(1)
public int trainingPlan(int[] nums) {
// 创建一个长度为 32 的数组 res,用于统计每个二进制位上出现的次数
int[] res = new int[32];
// 初始权值 m 为 1
int m = 1;
// 初始化结果 sum 为 0
int sum = 0;
时间复杂度:O(n)
额外空间复杂度:O(1)
位运算有点难,还是用hashmap,后面有空再看
public int[] sockCollocation(int[] sockets) {
int x=0,y=0;
int n=0;
int m=1;
for(int num:sockets){
n^=num;
}
while((n&m)0)
m<<=1;
for(int num:sockets){
if((num&m)!=0) x^=num;
else y^=num;
}
return new int[] {x,y};
思路:求单个不重复出现的值时 一次异或即可
求两个的时候根据2者异或的值来确定哪一位是不一样的 再将整组数据分成两个集合 根据这个位来分 在两个集合中分别异或 即可得到这两个值
class Solution {& actions) {
public:
int trainingPlan(vector
int bit[32] = {0};
int m = 0;
};
时间复杂度O(n),空间复杂度为O(1)
java
class Solution {
public int trainingPlan(int[] nums) {
Map<Integer, Integer> map = new HashMap();
}
提交
时间复杂度O(n),空间复杂度为O(1)
时间复杂度O(n),空间复杂度为O(1)
//方法一 时间On 空间O1
class Solution {
public int trainingPlan(int[] actions) {
int ans = 0;
int p = 1;
for(int i = 0 ; i < 32; i++){
int sum = 0;
for(int j = 0; j < actions.length; j++){
sum += (actions[j] & p)!=0 ? 1 : 0 ;
}
ans += p * (sum % 3);
p <<= 1;
}
return ans;
}
}
//方法二 有限状态机//时间On 空间O1
class Solution {
public int trainingPlan(int[] actions) {
int A = 0;
int B = 0;
for(int action :actions){
int temp = A;
A = A & (~B) & (~action) | (~A) & B & action;
B = ~temp & (B ^ action);
}
return B;
}
}
打卡
打卡
打卡
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return (3*sum(list(set(nums)))-sum(nums))//2
o 1 时间
位运算:
“`c++& actions) {
class Solution {
public:
int trainingPlan(vector
int nums[32] = {0};
for (int act: actions) {
for (int i=0; i<32 && act != 0; i++) {
nums[i] += act & 1;
act >>= 1;
}
}
int ans = 0;
for (int i=31; i>=0; i–) {
ans <<= 1; ans |= nums[i] % 3; } return ans; } }; ```