【发布时间】:2011-12-18 01:39:01
【问题描述】:
这个问题来自 2011 Codesprint (http://csfall11.interviewstreet.com/):
计算机科学的基础之一是了解数字在 2 的补码中的表示方式。想象一下,您使用 32 位以 2 的补码表示形式写下 A 和 B 之间的所有数字。你一共要写多少个1? 输入: 第一行包含测试用例的数量 T (
示例输入: 3 -2 0 -3 4 -1 4 样本输出: 63 99 37
说明: 对于第一种情况,-2 包含 31 个 1,后跟一个 0,-1 包含 32 个 1,0 包含 0 个 1。因此总数为 63。 对于第二种情况,答案是 31 + 31 + 32 + 0 + 1 + 1 + 2 + 1 = 99
我意识到您可以利用 -X 中 1 的数量等于 (-X) = X-1 的补码中 0 的数量这一事实来加快搜索速度。该解决方案声称存在用于生成答案的 O(log X) 递归关系,但我不明白。解决方案代码可以看这里:https://gist.github.com/1285119
如果有人能解释这种关系是如何得出的,我将不胜感激!
【问题讨论】:
-
Finding the total number of set-bits from 1 to n 的可能重复项 - 只需使用该公式两次即可找到
F(B) - F(A)
标签: algorithm binary recurrence