NC156. 数组中只出现一次的数(其它数出现k次)
描述
给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。
示例1
输入:
[5,4,1,1,5,1,5],3
输出:
4
示例2
输入:
[2,2,1],2
输出:
1
C++ 解法, 执行用时: 3ms, 内存消耗: 544KB, 提交时间: 2021-07-27
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here int count[32]={0}; for(int num:arr){ for(int i=0;i<32;i++){ count[i]+=num&1; num/=2; } } int res=0; for(int i=0;i<32;i++){ res<<=1; res|=count[31-i]%k; } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 548KB, 提交时间: 2021-07-27
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here int num[32]; for (int i = 0; i < 32; ++i) { int tmp = 0; for (const int num : arr) { tmp += (num >> i & 1); } num[i] = tmp; } int res = 0; for (int i = 0; i < 31; ++i) { if (num[i] % k) res += (1 << i); } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 552KB, 提交时间: 2021-08-01
class Solution { public: //利用哈希表统计每个数出现的次数 // int foundOnceNumber(vector<int>& arr, int k) { // unordered_map<int, int> mp; // //统计每一个数组出现的次数,O(n) // for(int& e : arr){ // mp[e]++; // } // // //找出只出现一次的数字 // for(pair<int, int>p : mp){ // if(p.second == 1) // return p.first; // } // return -1; // } //位运算:统计二进制每位中每个元素的和;进行取模运算,余数等于1的那位表示单独出现的数 int foundOnceNumber(vector<int>& arr, int k) { int res = 0; for(int i = 0; i < 32; ++i){ int count = 0; for(auto e : arr) if(e&(1<<i)) ++count; if(count % k == 1) res ^= (1 << i); } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 580KB, 提交时间: 2021-07-25
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; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 624KB, 提交时间: 2021-08-03
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here int sum; int res=0; int len=arr.size(); int cnt=0; while(cnt<32) { sum=0; for(int i=0;i<len;i++) { sum+= arr[i] & 1; arr[i]>>=1; } res^=((sum%k)<<cnt); cnt++; } return res; } };