@HackerRank:FlippingBits。输出错误

时间:2015-02-09 07:56:46

标签: java

这个真的给了我很多困难。所以最终我决定从你们那里得到一些帮助。也许,你可以查看它并告诉我哪里出错了。

@ https://www.hackerrank.com/challenges/flipping-bits

基本上:

  

输入=数字

     
      
  1. 将其转换为二进制字符串。
  2.   
  3. 翻转位(设置全0并重置全1)
  4.   
  5. 输出您获得的数字。
  6.         

    我现在已经对一个数字进行了硬编码,正如在中提到的那样   问题(= 2147483647)

问题是:它给了我一个输出:

0

代码:

public class FlippingBits {

private static String flipBits(String binaryOrig){
    String flippedString = "";
    for(int i = 0; i<binaryOrig.length(); i++){
        if(binaryOrig.charAt(i) == '1')
            flippedString += '0';
        else 
            flippedString += '1';
    }
    return flippedString;
}

private static long getNum(String flippedString){
    long new_number = 0;
    for(int i = 0; i < flippedString.length(); i++){
        new_number = (2*new_number) + (flippedString.charAt(i) - '0');
    }
    return new_number;
}

public static void main(String[] args) {

    long num = 2147483647;
    String numBinaryString = Long.toBinaryString(num);
    String flippedString = flipBits(numBinaryString);
    System.out.println(Long.toString(getNum(flippedString)));
    }
};

谁能告诉我什么是错的!这是在尝试3-4小时后。对不起,如果它是微不足道的。

提前致谢。

编辑:问题的摘录:

“以1为例,因为无符号32位是

00000000000000000000000000000001

并且正在进行翻转

11111111111111111111111111111110

反过来又是4294967294“

所以,我感觉它必须做长期64位的事情。 !?

4 个答案:

答案 0 :(得分:4)

因为Java没有无符号类型,并以两种补码的形式解释整数,所以你需要解决这两种问题。

首先,我们可以使用long来存储值。对于第二点,我们可以使用0x00000000ffffffff进行位掩码并获得我们想要的32位部分。

int original = 1;
long flipped = ~original & 0x00000000ffffffffL;
System.out.println(flipped); 

// outputs 4294967294

如上所述,Java有处理这样的任务的工具 - 除非必要,否则我不会进行String操作。

答案 1 :(得分:2)

您将数字转换为字符串的方式:

Long.toBinaryString(num)

不会在数字前加0,因此例如3将是11而不是00000000000000000000000000000011。因此,你的翻转方法将无法像hackerrank的那些人那样工作。

请注意,问题表明整数是32位长(某处但不是很清楚,但很好),所以你需要考虑到这一点。

@Edit:最简单的填充方法是:

numBinaryString = String.format("%32s",numBinaryString).replace(" ", "0")

答案 2 :(得分:0)

代码没有错。如果您尝试将长号码2147483647转换为二进制数,您将获得1111111111111111111111111111111。

当你翻转它时,你会得到零,这是正确的。

除此之外,您可以使用:{/ p>而不是使用getNum从二进制数手动创建小数。

System.out.println(Long.parseLong(flippedString, 2));

我建议你首先尝试使用较小的数字,比如10,然后看看你是如何获得5的。

答案 3 :(得分:0)

你已经有了一些答案,但让我给你另一种方法。

使用long存储该值,然后您可以使用0xffffffffL(二进制的11111111111111111111111111111111)对其进行异或。这会给你正确的答案。

例如:

sys.platform

您可以在下面找到代码。请注意,我使用自定义IO方法。

00000000000000000000000000000001
11111111111111111111111111111111 ^
--------------------------------
11111111111111111111111111111110