leetcode:397. 整数替换(数学)---位运算
程序员文章站
2022-07-15 09:43:12
...
题目:
分析:
第一次接触到位运算。嗯。虽然还是有点模糊。
最后一位是0,显然右移。
11,显然先加1.(到3除外)
01,可以试下,加1,起那面是11111是和-1是相同的。所以减一。
代码1:借助一个向量(代码正确但内存没有通过):
vector<int> v;
if(n==0||n==1) return 0;
while(n)
{
int c=n%2;
n=n/2;
//v的0对应的是二进制的最高位
v.push_back(c);
}
int all=0;
//reverse(v.begin(),v.end());
for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
for(int i=0;;i++)
{
if(i==v.size()-2)
{
cout<<"---";
if(v[v.size()-2]==0&&v[v.size()-1]==1)
{
cout<<all+1;return all+1;
}
if(v[v.size()-2]==1&&v[v.size()-1]==1)
{
cout<<all+2;return all+2;
}
}
if(v[i]==0) {
all++;
continue;
}
if(v[i+1]==0) {
all=all+2;
continue;
}
all+=2;
int c=i+1;
while(v[c]==1&&c<v.size())
{
v[c]=0;
c++;
}
if(c==v.size()) v.push_back(1);
}
代码2:大佬的高效代码:
涉及到的位运算的知识。点击进入。
int step = 0; //记录步数
while (n != 1) {
if ((n & 1) == 0) {
n >>= 1;
step++;
} else {
n += ((n & 2) == 0 || n == 3) ? -1 : 1;
step++;
}
}
return step;