1. 程式人生 > >[LeetCode][7]Reverse Integer解析與位運算實現 -Java實現

[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;
	}
}
在計算中使用位運算應該會快很多,很佩服這些工程師。。我寫這麼一點位運算就寫了十幾分鍾。。。。。