[LeetCode][7]Reverse Integer解析与位运算实现 -Java实现

Q:

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321


A:

以下解法和代码没有借阅以往任何资料,如果有更好的解法请在评论区留言

这题我们很久之前就做过了,相当年我还只会C++的时候老师就布置这种题目给做了,当时的解法应该是先判断正负然后从第一位开始做取余和除的运算然后输出大概时间复杂度是O(n)。今天我们来研究一下有没有什么奇葩的解法,不然这题就没啥意思了。

经过我的反复思考好像也没什么好弄的,想了想以前看的jdk源码里关于Integer.toString()的部分内容好像也涉及到了int分割成每个小单位然后换成char的操作,里面都用的位运算,或许能快点。代码如下:

public class ReverseInteger {
	public static void main(String[] args){
		System.out.println(method(-1234));
	}

	private static int method(int i) {
		// TODO Auto-generated method stub
		boolean isNegative = false;
		if (i < 0) {
			isNegative = true;
            i = -i;
        }
		int r =0;
		int q = 1;
		int result = 0;
		while (true) {
			q = (i * 52429) >>> 19;//去尾1位,2<<(16+3)=524288 52429/524288约为0.1
			r = i - ((q << 3) + (q << 1));//r=i-q*10,截出最后一位
			result = (result<<3)+(result<<1)+r;
			i=q;
			if(q==0)break;
		}
		if(isNegative) result = -result;
		return result;
	}
}
在计算中使用位运算应该会快很多,很佩服这些工程师。。我写这么一点位运算就写了十几分钟。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值