我试图解决一个简单的问题关于leetcode.com (https://leetcode.com/problems/number-of-1-bits/),我遇到了一个奇怪的行为,这可能是我缺乏理解.
我对链接中的问题的解决办法如下:
public int HammingWeight(uint n) {
int sum = 0;
while (n > 0) {
uint t = n % 10;
sum += t == 0 ? 0 : 1;
n /= 10;
}
return sum;
}我的解决方案是隔离每个数字,如果是增加sum的话。当我在我的PC上运行它时,它工作了(是的--我知道它不是最佳的解决方案,考虑到它的二进制表示,还有更优雅的解决方案)。
但是,当我尝试在leetcode编辑器中运行时,它返回了以下输入(00000000000000000000000000001011)的错误答案。
调试其他的方法并不容易,然后打印到控制台,所以我在输入方法时打印了n的值,并得到了11而不是1011的结果--在我的PC上,我得到了11。如果我采用不同的解决方案--一个使用按位右移或在2之前计算mod的解决方案,那么即使打印的n仍然是11,它也能工作。考虑到n是“错误的”(不同于我的个人电脑和所描述的站点),我本以为这些解决方案也会失败。
我是否遗漏了一些关于uint表示的知识?还是uint变量中的二进制数?
发布于 2020-01-20 16:39:32
您的代码似乎正在处理它为基数10 (十进制),但是hamming重量大约是基2 (即二进制)。因此:如果执行% 10和/= 10,则应该查看% 2和/= 2。
至于uint看起来是二进制的:本质上是像这样,但是..。CPU被允许躺在每个八位数的实际位置(也称为"endianness")。好消息是:它通常不会向你暴露那个谎言,除非你通过看原始的记忆来欺骗和看封面。只要使用常规运算符(包括按位运算符),谎言就不会被发现。
附带注意:对于二进制工作,即检查一些数据并向下移动数据,& 1和>> 1通常比% 2和/ 2更可取。但是正如canton7所指出的:对于这个特定的场景,也有内置的操作,在可能的情况下使用CPU内部指令(但是:使用内置函数无助于提高您的理解!)
发布于 2020-01-20 17:08:35
这个Kata写得不好,在示例中,输入以二进制表示形式打印,而输出以十进制表示形式打印。没有任何线索可以帮助我们理解这一点。
00000000000000000000000000001011b是11 (小数,8+2+ 1)。这就是为什么您将11作为第一个测试用例的输入。
这里没有0和1的数字,你必须在这里解码为基2的东西。
要解决Kata问题,您只需要在基础2中工作,就像@MarcGravell解释的那样。
发布于 2022-09-16 04:03:30
请检查下面的代码,它将为您工作。这是非常简单的解决方法。
var result = 0;
for(var i = 0; i < 32; i++)
{
if ((n & 1) == 1) result++;
n = n >> 1;
}
return result;https://stackoverflow.com/questions/59827535
复制相似问题