题目链接
思路一:递归
分析:遇到偶数直接除2,遇到奇数取+1和-1里面答案最小的。
代码:
class Solution {
public int integerReplacement(int n) {
if(n == 1){
return 0;
}
if(n == 2147483647) {
return 32;
}
if(n % 2 ==0 ){
return 1 + integerReplacement(n/2);
}else{
int a1 = integerReplacement(n-1);
int a2 = integerReplacement(n+1);
return 1 + Math.min(a1,a2);
}
}
}
思路二:位运算
分析,
1.如果一个数是2的次方,那么二进制中肯定只有一个1,那么答案就直接是1所在的位置-1
2.如果一个数是偶数,那么直接右移一位
3.如果是奇数,
3.1 二进制中最右边有连续的1,那么就加1,3除外,3是手算一下发现3是-1更快。
3.2 二进制中最右边没有不是连续的1,那就-1,3也是-1
3的二进制是(11).
代码:
class Solution {
public int integerReplacement(int n) {
if(n == 1){
return 0;
}
if(n == 2147483647) {
return 32;
}
int res = 0;
while(n!=1){
if( (n & (n-1) ) == 0 ){
//2的次方直接出答案
while(n!=1){
n = n>>1;
res++;
}
return res;
}
if( (n & 1) == 1){//奇数
//不等于3,并且右边有连续的1
if( n!=3 && (n & 3) == 3){
n++;
}else{
//等于3或者1不是连续的
n--;
}
}else{//偶数
n = n >> 1;
}
res++;
}
return res;
}
}