题目
给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。 如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少?
题目链接
思路dfs
当时偶数时候 直接 +1次 当时奇数时候,n + 1 和 n - 1的次数 最小的 + 2 此
代码
public int f2(int n){
if(n == 1){
return 0;
}
// 偶数一次
if (n % 2 == 0){
return 1 + f2(n / 2);
}
// 奇数 + 2次
return 2 + Math.min(f2(n/2),f2(n/2+1));
}
思路 位运算动态规划
假设n 为奇数7的二进制 111 当7 + 1 = 8的二进制为 1000 一共4此即可变为1 如果是偶数 直接右移 1 当是 3的时候要做特殊处理 3-1 到1 只需要2次,3+1需要3次
代码
public int f(long n){
int ans = 0;
while(n != 1){
// 偶数 1110 右移一位 111 就是除2
if (n % 2 == 0){
n >>= 1;
}else {
// 111 >> 1位 11 & 1 等于0 表示第二位是0,等于1表示第二位是1 + 1等消除多个二进制1的话就要+1
if (n != 3 && ((n >> 1) & 1) == 1)
n++;
else
n--;
}
ans++;
}
return ans;
}