欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode:397. 整数替换(数学)---位运算

程序员文章站 2022-07-15 09:43:12
...

题目:

leetcode:397. 整数替换(数学)---位运算

分析:

第一次接触到位运算。嗯。虽然还是有点模糊。
最后一位是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;