咪咕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 = 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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值