2016-11-29 1 views
1

Je résolvait un défi de HackerRank, il est appelé Flipping Bits De là: https://www.hackerrank.com/challenges/flipping-bits Comme je vois tous les cas que je l'ai essayé est correct Vous devez d'abord saisir le nombre de chiffres que vous voulez convertir. Puis donné un nombre, il le convertit en un bit binaire de 32 bits non signés. Ensuite, il retourne tous les bits 0-> 1 & 1-> 0, puis il est converti en décimal et imprimé. Voici mon code, je sais que ce n'est pas optimal et cela me donnerait une erreur d'exécution mais je veux partir d'ici, avoir le bon code.Erreur tandis que les bits flipping

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]); 
    } 
} 
} 

Le problème est là où je l'entrée 2147483647 Il montre:

Exception dans le thread "principal" java.lang.NumberFormatException: Pour l'entrée> string: "1111111111111111111111111111111" à> java.lang .NumberFormatException.forInputString (NumberFormatException.java>: 65) à java.lang.Long.parseLong (Long.java:592) à java.lang.Long.parseLong (Long.java:631) à flipping_bits_v3.Solution. main (Solution.java:17)

et je ne sais pas ce que cela pourrait être, est-ce un cas particulier que je n'ai pas géré? Merci.

Répondre

0

Je pense que la ligne génère l'erreur est:

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

Vous transformez dec_nums[i] à une chaîne binaire, puis essayer d'analyser cela comme un long. C'est probablement ce qui déclenche votre erreur.

Il semble que vous voulez juste pour stocker la valeur string de vos numéros sous forme de binaires dans bin_nums, donc ce que je pense que vous voulez est simplement:

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

Cela devrait vous aider à surmonter le premier obstacle. Il peut y avoir d'autres problèmes.

0

J'ai modifié votre solution pour la garder simple et concise et propre !!! Regardez s'il vous plaît:

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); 
    } 

} 
}