LeetCode第369场周赛
2917. 找出数组中的 K-or 值
给你一个下标从 0 开始的整数数组 nums
和一个整数 k
。
nums
中的 K-or 是一个满足以下条件的非负整数:
- 只有在
nums
中,至少存在k
个元素的第i
位值为 1 ,那么 K-or 中的第i
位的值才是 1 。 返回nums
的 K-or 值。 注意 :对于整数x
,如果(2i AND x) == 2i
,则x
中的第i
位值为 1 ,其中AND
为按位与运算符。
思路
开一个数组将nums
数组中的每个数字拆成二进制,cnt数组记录这一位上面1的个数
快速判断x
的第i
位是不是1:x>>i&1
然后再扫描一次数组,如果第i位的个数超过了k,那么结果的这一位就位1,也就是加上,或者|1<<i
代码
class Solution {
public:
int findKOr(vector<int> &nums, int k) {
vector<int> cnt(32);
for (int x: nums) {
for (int i = 0; i < 32; i++) {
if (x >> i & 1) {
cnt[i]++;
}
}
}
int ans = 0;
for (int i = 0; i < 32; i++) {
if (cnt[i] >= k) {
ans |= 1 << i;
}
}
return ans;
}
};
2918. 数组的最小相等和
给你两个由正整数和 0
组成的数组 nums1
和 nums2
。
你必须将两个数组中的 所有 0
替换为 严格 正整数,并且满足两个数组中所有元素的和 相等 。
返回 最小 相等和 ,如果无法使两数组相等,则返回 -1
。
思路
记录数组nums1
的和为s1
,0的个数为cnt1
数组nums2
的和为s2
,0的个数为cnt2
在最优的情况下,每个0都替换为1,即第一个数组的和为nums1+s1
,第二个为nums2+cnt2
如果第一个数组的和大于第二个,并且第二个数组没出现过0,那么无解
如果第二个数组的和大于第一个,并且第一个数组没出现过0,那么无解
否则就返回他们两个的最大值,因为最后需要相等,只能是小的那个再变大。