397. 整数替换
给定一个正整数 n,你可以做如下操作:
- 如果 n 是偶数,则用 n / 2替换 n。
- 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:
8
输出:
3
解释:
8 -> 4 -> 2 -> 1
示例 2:
输入:
7
输出:
4
解释:
7 -> 8 -> 4 -> 2 -> 1
或
7 -> 6 -> 3 -> 2 -> 1
思路
找规律。当n >= 4
时,如果n
为偶数则直接除2,如果n
为奇数且以二进制01
结尾则减1,如果n
为奇数且以二进制11
结尾则加1。注意当n == Integer.MAX_VALUE
时n+1
会溢出变成Integer.MIN_VALUE
,因此要用Java的无符号右移运算>>>
替代有符号右移运算>>
. 两者的区别仅仅在右移的对象是负数的时候体现,>>>
右移高位补0,>>
右移高位补1. 这里我们希望即使是负数,右移高位也是补0.
代码
class Solution {
public int integerReplacement(int n) {
int ret = 0;
while (n > 1) {
if ((n & 1) == 0) {
n >>>= 1;
++ret;
} else if (n == 3) {
ret += 2;
break;
} else if ((n & 2) == 0) {
n >>>= 2;
ret += 3;
} else {
n += 1;
n >>>= 2;
ret += 3;
}
}
return ret;
}
}