思路:这题思路是把数字拆分成位。int型是C++的内置类型,一般机器上为32位,本题中条件特殊每个数字都有出现k次,只有一个数字出现一次,自然想到对每位上的数字求和后%k,这样求余得到的数字就是我们所想要的。
复杂度分析:
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr intvector
* @param k int
* @return int
*/
int foundOnceNumber(vector<int>& arr, int k) { // write code here int sum= 0; for(int i = 31;i>=0;i--){//int型32位,外层循环32次 int cnt = 0; for(int j=0;j<arr.size();j++){ cnt+=(arr[j]>>i)&1;//获得每个数字第i位的和O(n) } sum=2*sum+cnt%k;//其他数字都出现了k次,故余数是只出现一次的当前位,二进制转为十进制 } return sum; }
};