1、题目描述
给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少?
2、算法分析
因为题目中给的范围是:
1 <= n <= 2^31 - 1,所以使用long类型。
给定一个正整数
n
,你可以做如下操作:
- 如果
n
是偶数,则用n / 2
替换n
。- 如果
n
是奇数,则可以用n + 1
或n - 1
替换n
。注意n为奇数:
主要处理n是奇数的情况,n != 1。题目中说最少题目次数是多少。所以n是奇数的时候,默认n-1。
定义中间值,temp = n-1。因为奇数n有n-1 和n+1 两种情况。但是注意,比如7,(7-1)/2 = 3为奇数,奇数还是需要判断,(7+1)/2=4,4是偶数,所以直接除以2就可以。那我们就应该选择除以我是偶数的情况。
偶数的话直接判断就可以。
3、代码实现
class Solution {
public int integerReplacement(int m) {
long n = (long)m;
int count = 0;
while(n != 1){
// n为奇数的时候
if(n % 2 == 1){
long temp = n - 1;
/*
判断奇数经过n-1和n+1后/2是否为整数
5-1 = 4 4/2 = 2
5+1 = 6 6/2 = 3
*/
if((temp/2) % 2 == 1 && temp/2 != 1){
// 5+1=6,变成偶数
n += 1;
}else{
// n = n-1
n = temp;
}
// n为偶数的情况
}else{
n = n/2;
}
// 计数
count++;
}
return count;
}
}