Java @HackerRank:FlippingBits。错误输出
这一次真的让我很难过。所以最终我决定从你们这里得到一些帮助。也许,你可以回顾一下,告诉我哪里出了问题 @ 基本上: 输入=数字Java @HackerRank:FlippingBits。错误输出,java,Java,这一次真的让我很难过。所以最终我决定从你们这里得到一些帮助。也许,你可以回顾一下,告诉我哪里出了问题 @ 基本上: 输入=数字 将其转换为二进制字符串 翻转位(设置所有0并重置所有1) 输出这样做得到的数字 我现在已经硬编码了一个数字,正如在报告中提到的那样 问题(=2147483647) 问题是:它给了我一个输出: 0 代码: 公共类翻转位{ 专用静态字符串翻转位(字符串二进制格式){ 字符串flippedString=“”; 对于(int i=0;i将数字转换为字符串的方式: Long.t
0
代码:
公共类翻转位{
专用静态字符串翻转位(字符串二进制格式){
字符串flippedString=“”;
对于(int i=0;i将数字转换为字符串的方式:
Long.toBinaryString(num)
不会在数字前加0,因此例如3
将是11
,而不是00000000000000000000000000000011
。因此,您的翻转方法不会像黑客银行的人希望的那样工作
请注意,问题指出整数是32位长的(在某个地方,不是很清楚,但很好),所以您需要考虑到这一点
@编辑:最简单的填充方法是:
numBinaryString = String.format("%32s",numBinaryString).replace(" ", "0")
代码没有问题。如果您尝试将长数2147483647转换为二进制数,您将得到1111111111111111
当你翻转它时,你得到零,这是正确的
除此之外,您可以使用以下命令,而不是使用getNum
从二进制数手动创建十进制数:
System.out.println(Long.parseLong(flippedString, 2));
我建议您首先尝试使用较小的数字,比如10,然后看看如何从中得到5。因为Java没有无符号类型,并且以2的补码形式解释整数,所以您需要同时解决这两个问题
对于第一点,我们可以使用long
来存储值。对于第二点,我们可以使用0x00000000ffffffff
进行位掩码,并获得所需的32位部分
int original = 1;
long flipped = ~original & 0x00000000ffffffffL;
System.out.println(flipped);
// outputs 4294967294
Java有一些工具来处理上面提到的任务——除非我必须这样做,否则我不会突然进行字符串操作。你已经得到了一些答案,但让我给你一个替代方法
使用long来存储该值,然后可以使用0xFFFFFFFFFFL(二进制格式为11111111111111111111111)对其进行异或运算。这将为您提供正确答案
例如:
00000000000000000000000000000001
11111111111111111111111111111111 ^
--------------------------------
11111111111111111111111111111110
请注意,我使用自定义IO方法
long n = in.readLong() ^ 0xffffffffL;
out.print(n + "\n");
你试过使用调试器吗?我注意到,你知道怎么做吗?你可以自己添加缺少的0,或者使用不同的方法将数字转换成二进制字符串。
long n = in.readLong() ^ 0xffffffffL;
out.print(n + "\n");