本文记述笔者参加的咪咕2020春招开发类笔试中的一道编程题。
题干
(题目背景较长,关于疫情期间的小区人口进出需要对暗号balabala,下面是抛开背景后的题干)
给定一个32位无符号整数的二进制表示,将其按位反转,即最后一位的数字,反转到第一位,倒数第二位的数字,反转到第二位,以此类推。写一个算法:
输入:一个32位无符号整数;
输出:它对应的二进制反转数的十进制数表示。
(题中注:注意,在Java中不支持无符号整数,此时,输入输出都是有符号整数,但这不应该影响到Java方案的实现,因为无论是有符号无符号,内部都是二进制表现,此时最好判断以下输入数的范围,如果超出表数范围,如果超出表数范围,则返回0即可)
输入:2861866653
输出:3111725397
方案一
根据题中注释部分,不难理解这里说的超出表数范围一定指的是32位数字超出了int型的表示范围,所以由此得出,输入若超出int型表示范围,可以直接输出0。那么,题中的示例中的输出在Java方案中应该可以变为0(如果我理解没错的话)。
import java.io.*;
import java.util.*;
public class Test{
public static void main(String args[]){
Scanner cin = new Scanner(System.in);
String str = cin.next();
long a = Long.valueOf(str); //32位可以用long储存
if(a > Integer.MAX_VALUE || a < Integer.MIN_VALUE) {
System.out.println(0); //int表示范围外的的数排除
}else {
int[] arr = new int[32]; //二进制表示,默认值都是0
if(a > 0)
arr[0] = 1; //正数为1,负数为0
//二进制转换
int i = 31;
do{
arr[i--] = (int) (a % 2);
a = a / 2;
}while(a != 1);
arr[i] = 1;
//按位反转
int left = 0;
int right = 31;
while(left < right){
int temp = arr[left];
arr[left++] = arr[right];
arr[right--] = temp;
}
//二进制转十进制
int res = 0;
int k = 0;
for(int j = 31; j > 0; j--){
if(arr[j] == 1)
res += Math.pow(2,k);
k++;
}
System.out.println(res);
}
}
}
2020.4.12