题目链接
题目描述
给你一个下标从 0 开始的整数数组 nums
和一个整数 k
。
请你用整数形式返回 nums
中的特定元素之 和 ,这些特定元素满足:其对应下标的二进制表示中恰存在 k
个置位。
整数的二进制表示中的 1 就是这个整数的 置位 。
例如,21
的二进制表示为 10101
,其中有 3
个置位。
示例 1:
输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是: 0 = 000(2) 1 = 001(2) 2 = 010(2) 3 = 011(2) 4 = 100(2)
下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。 因此,答案为 nums[1] + nums[2] + nums[4] = 13 。
示例 2:
输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是: 0 = 00(2) 1 = 01(2) 2 = 10(2) 3 = 11(2)
只有下标 3 的二进制表示中存在 k = 2 个置位。 因此,答案为 nums[3] = 1 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 10(5)
0 <= k <= 10
解题思路
属于理解了题意就能够直接做出来的题目,子问题需要判断数字i
的二进制表示一共包含多少个1
,既可以自定义check()
函数,也可以直接调用API即bit_count()
来解决该子问题。最后把nums
中所有满足下标i
的二进制表示中的1
的个数等于k
的元素nums[i]
加起来,即为答案。
代码
Python
class Solution:
# 辅助函数check(),用于计算数字i是否是k置位
def check(self, i, k):
while i:
# 当i的最后一位是1,存在1个置位
# 也可以使用 i & 1 == 1 来判断
if i % 2 == 1:
k -= 1
# i右移,将二进制的末位删除
i >>= 1
# 若最后k降为0,说明i包含k置位
return k == 0
def sumIndicesWithKSetBits(self, nums: List[int], k: int) -> int:
# check()也可以直接使用API来代替
# 将self.check(i, k)用 i.bit_count() == k来代替
# 把nums中所有满足下标i的二进制中的1的个数等于k的元素nums[i]加起来即为答案
return sum(num for i, num in enumerate(nums) if self.check(i, k))
Java
class Solution {
// Helper function check(), used to check if the number i has k set bits
private boolean check(int i, int k) {
while (i != 0) {
if ((i & 1) == 1) {
k--;
}
i >>= 1;
}
// If k becomes 0, it means i contains k set bits
return k == 0;
}
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
if (check(i, k)) {
ans += nums.get(i);
}
}
return ans;
}
}
C++
class Solution {
public:
// Helper function check(), used to check if the number i has k set bits
bool check(int i, int k) {
while (i != 0) {
if (i & 1) {
k--;
}
i >>= 1;
}
// If k becomes 0, it means i contains k set bits
return k == 0;
}
int sumIndicesWithKSetBits(std::vector<int>& nums, int k) {
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
if (check(i, k)) {
ans += nums[i];
}
}
return ans;
}
};
时空复杂度
时间复杂度:O(NlogN)
。
空间复杂度:O(1)
。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336
了解更多