2016-11-29 4 views
1

Ich war eine Herausforderung von HackerRank zu lösen, nennt man das Flipping Bits Von hier: https://www.hackerrank.com/challenges/flipping-bits Wie ich jeden Fall sehen, dass ich versucht habe Sie erste Eingabe die Anzahl der Zahlen korrekt sind Sie konvertieren möchten. Dann gegeben eine Zahl, es konvertiert es in eine 32 vorzeichenlose Bit-Binärdatei. Dann dreht es alle Bits 0-> 1 & 1-> 0 und dann wird es in Dezimal konvertiert und gedruckt. Hier ist mein Code, ich weiß, es ist nicht optimal und es würde mir Laufzeitfehler geben, aber ich möchte von hier aus starten, mit dem richtigen Code.Fehler beim Spiegeln Bits

import java.io.*; 
import java.util.*; 

public class Solution { 

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    int cases = input.nextInt(); // Número de casos 
    Long[] dec_nums = new Long[cases]; // Arreglo contenedor de casos 
    for (int i = 0; i < cases; i++) { 
     dec_nums[i] = input.nextLong(); // Almacenamiento de casos 
    } 
    String[] bin_nums = new String[cases]; // Arreglo con dec-bin 
    for (int i = 0; i < cases; i++) { //Convertir cada decimal a binario 
     bin_nums[i] = (String.format("%032d", (Long.parseLong(Long.toBinaryString(dec_nums[i]))))); 
            //Rellenar con 0's 
    } 
    String[] final_bin=new String[cases]; 
    for(int i=0;i<cases;i++){ 
     final_bin[i]=""; 
     for(int j=0;j<bin_nums[i].length();j++){ 
      if(bin_nums[i].charAt(j)=='0'){ 
       final_bin[i]+="1"; 
      } 
      if(bin_nums[i].charAt(j)=='1'){ 
       final_bin[i]+="0"; 
      } 
     } 
    } 
    long[]final_dec= new long[cases]; 
    for(int i=0; i<cases;i++){ 
     final_dec[i]=0; 
     for(int j=0; j<32;j++){ 
      if (final_bin[i].charAt(j)=='1'){ 
       final_dec[i]=Long.parseLong(final_bin[i], 2); 
      } 
     } 
    } 
    //Imprimir binarios 
    System.out.println("Binarios:"); 
    for (int i = 0; i < cases; i++) { 
     System.out.println(bin_nums[i]); 
    } 
    //Imprimir binarios flipped 
    System.out.print("Flipped: "); 
    System.out.println(" "); 
    for(int i=0; i<cases; i++){ 
     System.out.println(final_bin[i]); 
    } 

    System.out.println("Decimales"); 
    System.out.println(" "); 
    for(int i=0; i<cases; i++){ 
     System.out.println(final_dec[i]); 
    } 
} 
} 

Das Problem ist, wo ich Eingang 2147483647 Es zeigt:

Exception in thread "main" java.lang.NumberFormatException: Für input> string: "1111111111111111111111111111111" bei> java.lang .NumberFormatException.forInputString (NumberFormatException.java>: 65) bei java.lang.Long.parseLong (Long.java:592) bei java.lang.Long.parseLong (Long.java:631) bei flipping_bits_v3.Solution. Haupt (Solution.java:17)

und ich weiß nicht, was es sein könnte, ist es ein Sonderfall, den ich nicht behandelt habe? Danke.

Antwort

0

Ich denke, die Linie, die die Fehler zu erzeugen ist:

bin_nums[i] = (String.format("%032d", (Long.parseLong(Long.toBinaryString(dec_nums[i]))))); 

Du dec_nums[i] in eine binäre Zeichenfolge konvertieren und dann das als long zu analysieren versucht. Wahrscheinlich löst das Ihren Fehler aus.

Es sieht aus wie Sie den string Wert Ihrer Zahlen als Binärdateien in bin_nums nur speichern möchten, so was ich denke, Sie wollen, ist einfach:

bin_nums[i] = Long.toBinaryString(dec_nums[i]); 

Dass Sie über die erste Hürde bekommen sollte. Es kann andere Probleme geben.

0

Ich habe Ihre Lösung so modifiziert, dass sie einfach, prägnant und sauber bleibt !!! Bitte schauen Sie:

import java.io.*; 
import java.util.*; 

public class Solution { 

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    int cases = input.nextInt(); // Número de casos 
    /*Long[] dec_nums = new Long[cases]; You don't need this. Read a number and flip it on the go, without storing*/ 
    long n; 
    int bin[] = new int[32]; 
    for (int i = 0; i < cases; i++) { 
     n = input.nextLong(); // Almacenamiento de casos 
     for(int j = 0; j < 32; j++){ 
      bin[j] = 0; 
     } 
     long num = n; 
     int k = 0; 
     while(num != 0){ 
      bin[k++] = (int)num%2; 
      num = num/2; 
     } 
     //Flipping the binary digits now 
     k = 0; 
     while(k < 32){ 
      bin[k] = (bin[k] + 1)%2; 
      k++; 
     } 
     long ans = 0; 
     long p = 1; 
     k = 0; 
     while(k < 32){ 
      ans = ans + (bin[k]*p); 
      k++; 
      p = p*2; 
     } 
     System.out.println(ans); 
    } 

} 
}