2016-11-29 41 views
1

我解決從HackerRank一個挑戰,這就是所謂的翻轉位 從這裏:https://www.hackerrank.com/challenges/flipping-bits 當我看到,我已經嘗試是正確的每一種情況下 你先輸入要轉換號碼的數量。 然後給出一個數字,它將它轉換爲32位無符號位二進制。然後它翻轉所有位0-> 1 & 1-> 0,然後將其轉換爲十進制並打印。 這裏是我的代碼,我知道它不是最優的,它會給我運行時錯誤,但我想從這裏開始,讓代碼正確。錯誤而翻轉位

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

的問題是其中I輸入2147483647 它顯示:

異常在線程 「主」 java.lang.NumberFormatException:對於輸入>字符串: 「1111111111111111111111111111111」 在> java.lang中.NumberFormatException.forInputString(NumberFormatException.java>:65) at java.lang.Long.parseLong(Long.java:592) at java.lang.Long.parseLong(Long.java:631) at flipping_bits_v3.Solution。 main(Solution.java:17)

我不知道它可能是什麼,這是我沒有處理的特殊情況嗎? 謝謝。

回答

0

我認爲線上產生的錯誤是:

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

要轉換dec_nums[i]成二進制字符串,然後試圖解析,作爲一個long。這可能是觸發你的錯誤的原因。

看起來你只是想在string值的序號的二進制文件存儲在bin_nums,所以我想你想很簡單:

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

這應該讓你過了第一關。可能還有其他問題。

0

我已修改您的解決方案,以保持簡單和簡潔!請看看:

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

} 
}