赞
踩
说实话这道题就是阅读题。虽然作者本题写的并不怎么简单,但是思路还是很清楚的。
思路:通过题目我们就可以知道,本质上就是算出这个数的二进制,然后在二进制中找到各位有多少1的题目而已。
- int n=nums.size();
- int arr[51][32];
- for(int i=0;i<51;i++){
- for(int j=0;j<32;j++)
- {
- arr[i][j]=0;
- }
- }
- int x=0;
- int q=0;
- for(int i=0;i<n;i++){
- int num=nums[i];
- x=0;
- while(num){
- arr[i][x++]=num%2;
- num/=2;
- }
- }
这一段主要就是对于二进制数的求法,适合新手观看。
这样我们求出来二进制之后,然后再次进行双重循环遍历,我们在遍历的时候,定义的二维数组含义就是第一维的下标用来表示这个数在nums中的位置,第二维空间里自然就是用来存储二进制数了。我们必须要列优先遍历,这样才能纵向和nums这几个数的第0位,第一位等等这样比较下去,别忘了计数,看看这些数里第i位有多少1.
然后就和k进行比较,如果>=k,那么我们直接储存这里的坐标i,否则继续循环。
最后退出循环整个结束之后,我们就按照题目所给的方式求解最终的数就行了。
- class Solution {
- public:
- int findKOr(vector<int>& nums, int k) {
- int n=nums.size();
- int arr[51][32];
- for(int i=0;i<51;i++){
- for(int j=0;j<32;j++)
- {
- arr[i][j]=0;
- }
- }
- int x=0;
- int q=0;
- for(int i=0;i<n;i++){
- int num=nums[i];
- x=0;
- while(num){
- arr[i][x++]=num%2;
- num/=2;
- }
- }
- int count=0;
- vector<int>res;
- for(int i=0;i<32;i++){
- count=0;
- for(int j=0;j<n;j++){
- if(arr[j][i]==1)
- count++;
- }
- if(count>=k)
- res.push_back(i);
- }
- int sum=0;
- for(int i=0;i<res.size();i++)
- sum+=pow(2,res[i]);
- return sum;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。