题意:
- 给定一个整数数组和整数,其中数组中有一个数只出现一次,其他数都出现次,求这个只出现一次的数。
方法一:
解题思路:
- 在为偶数时,将所有数异或就能得到答案,因为偶数个相同数异或结果为,最终只留下了要求的数,时间复杂度,空间复杂度。
- 在为奇数时,若利用计数的方式来求答案,那么空间复杂度会来到,不满足题目要求。由于题目要求时间复杂度,空间复杂度。所以选择采用位运算的方式,即计算所有数在每一位的1的数目,再将该数模,最后再复原得到答案。由于int数组最多32位,所以时间复杂度是,空间复杂度是,满足要求。
图解如下:
代码如下:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here int ans = 0; //如果k是偶数,那么直接将全部数异或一次就能得到答案 if (k % 2 == 0) { for (int x : arr) { ans = ans ^ x; } } //k是奇数 else { //计算每一位上面的1的数目并存储下来 vector<int> sum(32,0); for (int i = 0; i < 32; i++) { for (int x : arr) { sum[i] += (x >> i) & 1; } } //将每个位置上的1的数目模k,若还有余数,说明要求的数在该位为1,加到ans中 for (int i = 0; i < 32; i++) { if (sum[i] % k != 0) { ans += 1 << i; } } } return ans; } };
复杂度分析:
时间复杂度:,双重循环,外层32,内层n,总。
空间复杂度:,sum数组,常数级,。