6127LeetCode刷题:优质数对的数目(位运算)
- 题目描述:
给你一个下标从 0 开始的正整数数组 nums 和一个正整数 k 。
如果满足下述条件,则数对 (num1, num2) 是 优质数对 :
num1 和 num2 都 在数组 nums 中存在。
num1 OR num2 和 num1 AND num2 的二进制表示中值为 1 的位数之和大于等于 k ,其中 OR 是按位 或 操作,而 AND 是按位 与 操作。
返回 不同 优质数对的数目。
class Solution {
public:
long long countExcellentPairs(vector<int>& nums, int k) {
//求了OR和AND后的1的个数之和 就等于原来两个数的1的个数之和
long long res =0;
vector<int> a(32,0); // 0~31
for(auto i : nums){
if(s.find(i) == s.end()){
s.insert(i);
}else{
continue;
}
//计算i中1的个数
int count = 0;
int flag = 1;
//这里采用了两种求1的个数的方法
// for(int j = 0; j < 31; j){
// if(i & (1<<j)){
// count;
// }
// }
for(int j = 0;j < 31; j){
if(i & flag){
count;
}
//flag<<=1;
flag = flag<<1;
}
a[count];
}
//cout << a;
for(int i = 0;i < 32; i){
for(int j = max(k-i,0); j < 32; j){
res = res (a[i]*a[j]);
}
}
return res;
}
private:
unordered_set<int> s;
};
- tips:
进行位操作的时候,整数相当于对原码操作,负数要对补码操作
原码:就是直观的二进制表示方式
反码:
正数:和原码一样
负数:符号位不变,其余位按位取反
补码:
正数:和原码一样
负数:符号位不变,反码加一
正数二进制左移1 ,负数补码左移一,符号位不变,右端空位补零
右移末尾舍弃,高位补符号位。
vector<> 直接使用=赋值使用的是深拷贝。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgghjgj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13