题目链接:https://leetcode.com/contest/4/problems/integer-replacement/
题目:
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
orn - 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
UPDATE:
We have fixed the error in Integer Replacement. For input n = 3, the answer should be 2, not 3. Please try submitting again, thanks. We will rejudge your submissions after the contest finished and adjust your ranking accordingly.
思路:
easy 每遇到奇数时,分别判断n-1还是n+1的尾部零更多,越多的当然步骤越少。
特殊case:当n==Integer 最大值时,当n==3时
算法:
public int integerReplacement(int n) {
if (n == Integer.MAX_VALUE)
return 32;
int count = 0;
while (n != 1) {
if ((n & 1) == 0) {
n = n >> 1;
count++;
} else {
if (n == 3)
n = 2;
else {
if (countTrailZero(n - 1) > countTrailZero(n + 1)) {
n = n - 1;
} else {
n = n + 1;
}
}
count++;
}
}
return count;
}
public int countTrailZero(int n) {
int c = 0;
while ((n & 1) == 0) {
n = n >> 1;
c++;
}
return c;
}