原题链接:3998. 变成1 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/description/4001/
思路:
高精度+模拟
本题思维难度一般,难点在于细节比较多。如果当前位置是0,直接移出数组,如果是1就处理一下该位置左侧连续的1,将连续的1全都变成0,然后将最后一个连续1的左侧的0变成1
比如10111,遍历最后一位时需要+1,于是变成了11000,这也就是将该位置连续的1全都变成0,然后将最后一个连续1的左侧的0变成1
本题做法已经说完了,就不再列举了,具体细节我会在代码中写成注释供参考
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> A;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++) A.push_back(s[i]-'0');//用高精度操作
int res=0;
while(A.size())
{
/*for(int k=0;k<A.size();k++) cout<<A[k];
cout<<endl;
cout<<A.size()<<" "<<res<<endl;*/
int t=A[A.size()-1];//每次处理最后一位
if(!t)//如果该位为0,直接移除就行了
{
res++;
A.pop_back();
continue;
}
if(A.size()==1&&t) break; //只剩1位的话,如果是1任务完成,直接结束
int i=A.size()-1;
res++;
while(A[i]&&i>=0)//操作连续的1,注意i得合法
{
A[i]=0;
i--;
}
if(i>=0) A[i]=1;//注意if语句,处理到最后1位时i可能是负数
//比如处理11,i会退到-1,就非法了
}
cout<<res<<endl;
return 0;
}
作者:机械之忍
链接:https://www.acwing.com/activity/content/code/content/2014369/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本人刚开始写题解不久,很多地方还不成熟,为了让读者更好的理解思路和细节,我做这道题时的调试代码片段也保留了,我觉得这样能更直观的表达我的想法,如果各位有疑问之处,或者我写的哪里有错误,欢迎私信我或者在下方留言
我的QQ:2907065305