我正在解决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]);
}
}
}
问题是我输入2147483647它显示:
线程中的异常" main" java.lang.numberformatexception:for Input> String:" 111111111111111111111111111111111" at> 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)
我不知道会是什么,这是我没有处理的特殊情况吗?谢谢。
我认为生成错误的行是:
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]);
应该让您摆脱第一个障碍。可能还有其他问题。
我修改了您的解决方案,以使其保持简单,简洁明了!!!请看看:
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);
}
}
}
- 将给定的字符串转换为base2是二进制的
- 然后创建一个数组,然后将其填充零,然后再将其附加到数字的转换二进制形式,然后使用映射转动数字并加入
function flippingBits(n: number): number {
const binaryForm = n.toString(2)
let bit32 = (new Array(32 - binaryForm.length).fill(0).join('') + binaryForm).split('').map((x) => 1 - Number(x)).join('')
return (parseInt(bit32, 2))
}