咪咕2020春招4⽉笔试编程题(java实现)
本⽂记述笔者参加的咪咕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 = ();
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
java valueofif(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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。