我今天遇到了这个有趣的问题。 (请注意,这不适合我的家庭作业或面试等)。
给定以字符串表示的十进制数,我们希望以二进制格式计算大数的'1'
位数。这里的字符串可以包含数千个字符,并且不能用一个int或long long变量表示。
例如,countBits("10") = 2
为十进制的'10'
可以二进制格式表示为'1010'
。同样,我们有countBits("12") = 2
,countBits("7") = 3
什么是有效的算法?一种可能的解决方案是将十进制字符串转换为二进制格式的另一个字符串,并计算'1'。我们可以做得更好吗?
答案 0 :(得分:1)
当从十进制表示转换为整数时,字符串末尾的第* n *位数表示10 10 n <的数量/ sup>(一个零基数十到n的幂),它被加到整数值中。如果您想以二进制表示该整数,则必须将10 10 ,即1010 2 提升到该幂,并将该值乘以该数字的值。
因为你翻译的基数的因子之一,5,相对于2是相对素数,10 10 的幂在基数2 - 1 2中增加了长表示,1010 2 ,1100100 2 ,1111101000 2 。
请注意,这些幂有尾随零(10 10 = 2×5,而2对于我们正在翻译的基数不是相对素数),因此只会影响1,3,5和7位的答案,而不是所有1,4,7,10位。但它们影响的位数仍会随O(N)而变化,其中N是输入的长度,因此计算受影响的位将采用O(N 2 )运算。
如果您翻译的基数没有相对于您正在转换的基数的因素 - 比如将基数16转换为基数2或将基数9转换为基数3并计算非零数字,则会有O(N)算法作为目标基数中非零数字的总和将等于单独翻译的输入中每个数字的总和,但由于情况并非如此,那么您将被困在O(N 2 )算法,您将十进制表示转换为二进制,然后计算二进制表示中的位。
答案 1 :(得分:0)
您将其转换为二进制并使用Hamming weight algorithm。
它是如何工作的?假设您有数字8,即00001000。
该算法采用2 位的块,因此它将具有00 00 10 00.
现在它将每两个位(通过使用掩码10101010,乘法和移位)相加,这将导致:00 00 01 00。
现在它对每个4 位(通过屏蔽00110011 ..)执行相同的操作,因此它将具有0000 1000.添加每一面后,您将拥有0000 00001。 / p>
最后一步是添加两个数字,0 + 1,即1,这是最终结果。