翻转位时出错

时间:2016-11-29 06:12:11

标签: java binary bit

我正在解决HackerRank的挑战,它被称为Flipping Bits 从这里开始: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]);
    }
}
}

问题出在我输入2147483647的地方 它显示:

  

线程中的异常&#34; main&#34; java.lang.NumberFormatException:对于输入&gt; string:&#34; 1111111111111111111111111111111&#34;     at&gt; java.lang.NumberFormatException.forInputString(NumberFormatException.java&gt ;:65)     在java.lang.Long.parseLong(Long.java:592)     在java.lang.Long.parseLong(Long.java:631)     在flipping_bits_v3.Solution.main(Solution.java:17)

而且我不知道它可能是什么,这是一个特殊情况我还没有处理过吗? 谢谢。

2 个答案:

答案 0 :(得分: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]);

这应该让你超越第一个障碍。可能还有其他问题。

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

}
}