
/**
* 思路:贪心+位运算
* 对于偶数使用右移运算符实现除以2然后统计次数即可。
* 对于奇数需要考虑是加一和减一哪个需要的次数更少:
* 将数化为二进制,而将数最后化为 1.就是尽可能减少二进制中的 1 。
* 注意:奇数二进制最低位全是 1,偶数最低位全是 0
*
* 如果低位和次低位都是 1,加上 1 会连续消去多个二进制中的 1,
* 然后在前面补一位 1,在最低位到补的这一个 1 之间都是 0,
* 可以直接通过不断右移得到。而如果在这种情况下 -1,
* 之后每右移 1 位后都会遇到这些连续的 1,
* 这样每右移一位后都会比之前多一步减 1 的操作。
* 次低位是 0,就减去 1
* 唯一特例:3。只有 3 的时候,是直接 -1 最优。
*
* @auther start
* @create 2024-01-11 10:27
*/
//贪心:位运算:尽可能去掉1,奇数最后一位都是1,偶数最后一位都是0
public int integerReplacement(int _n) {
long n = _n;
int ans = 0;
while (n != 1) {
//偶数情况连续除以2
if (n % 2 == 0) {
n >>= 1;
} else { //奇数情况判断次低位是否为1,并且不为3直接加一。
if (n != 3 && ((n >> 1) & 1) == 1) n++;
else n--;
}
ans++;
}
return ans;
}