我正在解决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)
而且我不知道它可能是什么,这是一个特殊情况我还没有处理过吗? 谢谢。
答案 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);
}
}
}