[LeetCode] Single Number II

本文介绍了一种算法,用于在给定整数数组中找出仅出现一次的元素,所有其他元素都出现三次。算法使用位操作和数组计数来实现线性时间复杂度,且不使用额外内存。

Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

 

方法一:创建一个长度为 多少个bit/sizeof(int) * 8的数组 count[sizeof(int)*8],count[i] 表示在在 i 位
出现的 1 的次数。如果 count[i] 是 3 的整数倍,则忽略;否则就把该位取出来组成答案。

 

 1 class Solution
 2 {
 3     public:
 4         int singleNumber(int A[], int n)
 5         {
 6             vector<int> cnt;
 7             int width = sizeof(int)*8;
 8             cnt.resize(width, 0);
 9             int res = 0;
10 
11             for(int i  = 0; i< n; i++)
12             {
13                 for(int j  = 0; j< width; j++)
14                 {
15                     cnt[j] += (A[i] >> j) & 0x1;
16                     //cnt[j] %= 3;
17                 }
18 
19             }
20             for(int j  = 0; j< width; j++)
21             {
22                 //cout << "j :\t" <<j <<"\t cnt\t"<< cnt[j]<<endl;
23                 if(cnt[j]%3 != 0)
24                     res ^=  ( 1 << j);
25             }
26             return res;
27         }
28 } ;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值