题目:
Given a positive integer n and you can do operations as follow:
If n is even, replace n with n/2.
If n is odd, you can replace n with either n + 1 or n - 1.
What is the minimum number of replacements needed for n to become 1?
Example 1:
Input:
8
Output:
3
Explanation:
8 -> 4 -> 2 -> 1
Example 2:
Input:
7
Output:
4
Explanation:
7 -> 8 -> 4 -> 2 -> 1
or
7 -> 6 -> 3 -> 2 -> 1
将数字写成二进制。
如果为偶数,明显数字大的时候用右移1位大小会下降更快。
如果为奇数,以11结尾,那么+1再右移两位(共3步)可以将最后两位消除;以01结尾,那么-1再右移两位(共3步)可以将最后两位消除。所以在这种情况下,这两种方法步数一样。但如果以111结尾,显然+1再右移可以再更少的步数使数字减少同样的位数。所以,可以认为,以11结尾时,采用+1再右移更优。
但注意,有一个特例,n=3的时候,-1再右移更优。
这题还要注意==和位运算的优先级,搞不清楚还是多加括号为妙。
class Solution {
public:
int integerReplacement(int n) {
if (n == 0) return 1;
long long nn = n;
int ans = 0;
while (nn != 1LL) {
if (nn == 3LL) {
ans += 2;
nn = 1LL;
continue;
}
if ((nn & 1LL) == 0LL) {
nn >>= 1LL;
ans++;
}
else {
if ((nn & 3LL) == 1LL) {
ans += 2;
nn >>= 1LL;
}
else {
ans += 1;
nn++;//可能会进位,不能左移
}
}
}
return ans;
}
};