190,reverse bits:​​https://leetcode.com/problems/reverse-bits/?tab=Description​

把一个int的二进制反转。要得到一个int的二进制的每一位,需要使用移位操作,但是取得的每一位如何赋值给结果?一个思路就是先移位再或操作,更好的的是每次对结果的最低位赋值,然后把结果左移一位,那么结果和输入每一次只移动一位。

最后一次结果不能移位。

public int reverseBits(int n) {
int result = 0;
for(int i = 0 ; i < 32; i++){
int v = n & 1;
result += v;
n >>>= 1;
if(i < 31)
result <<= 1;
}
return result;
}


这个解法是O32的。


7.reverse integer:​​https://leetcode.com/problems/reverse-integer/?tab=Description​

这次是reverse一个integer。可以沿用上次的思路,不过有一些注意点。越界检测。越界发生在输入首先有10位,然后原本不越界,但是reverse以后越界。那么取得输入的第二高位时,赋值给结果,结果乘10,这时结果是10位数,可能越界。乘法的越界和加法不同。加法我们只要检测为负就是越界。乘法不然,因为乘法结果更大,可能越界为负然后又为正,因此不能通过正负数检测,一个好的办法是检测除以10以后是否为原先的值。所以使用一个pre变量。

public int reverse(int x) {
int r = 0, pre = 0;
while(x != 0){
r += x % 10;
x /= 10;
pre = r;
if(x != 0){
r *= 10;
if(r / 10 != pre) return 0;
}
}
return r;
}