class Solution {
public:
int integerReplacement(int n) {
int ans=0;
long m = n;
while(m!=1)
{
if((m&1)==0)m>>=1;//偶数
else if(m==3)m-=1;//3特殊减1更快
else if((m&3)==3)m+=1;//其他末位是11的,加一更快
else m-=1;//末位是01的,减一更快
ans+=1;
}
return ans;
}
};
偶数只有一种操作,而对奇数,有加一和减一,对3,减一要两次加一要三次,所以减一。其他奇数如果是32’bxxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xx11,加一更快,因为可以凑出100(2)或者更大的2的倍数,如果是01,减一更快,同样的道理