用栈写代码。小蓝最近学习二进制,他想知道1到N有多少个满足期其二进制表示中恰好有k个1,你能帮助她吗
时间: 2024-09-29 19:07:40 浏览: 80
当然可以,利用栈可以帮助我们解决这个问题。这个问题可以通过动态规划和栈的数据结构相结合的方式来解决。我们可以创建两个变量,一个记录当前二进制串中有多少个1(count),另一个记录当前数字(num)。从1开始遍历,对于每个数,我们将它的下一位添加到栈中,并检查栈顶的数字是否为1。
如果栈顶数字为1并且我们的计数器`count`小于`k`,那么说明我们需要找到更多位的1来达到`k`个,所以我们继续处理下一个位;如果等于`k`,则记录当前数字`num`作为符合条件的结果;如果栈顶为0,我们将`count`加1。
当遍历结束后,栈为空且`count`仍小于`k`,则表明没有更多的数字能达到`k`个1。最后统计所有满足条件的数字并返回结果。
以下是伪代码形式:
```python
def countBitsWithKOnes(n, k):
stack = []
res = [0] * (n + 1)
for num in range(1, n + 1):
while stack and num & 1 == stack[-1] & 1: # 当前位等于栈顶位时,移除栈顶
stack.pop()
if len(stack) < k:
stack.append(num & 1)
else:
res[num] = res[num ^ (1 << stack[-1])] + 1
return sum(res)
# 示例
print(countBitsWithKOnes(15, 2)) # 输出: 6,因为1、2、4、8、12和14都有恰好2个1
```
阅读全文
相关推荐



















