4.8华为笔试第2题,这个解法有问题吗
题目大概意思是:给个二进制串,其中00可以修改为10,10可以修改为01,设计个算法,使修改后的二进制最大
如:输入0001,输出1101
#include<iostream>
#include<vector>
using namespace std;
void maxchange(vector<int>&v)
{
for(int i=0;i<v.size()-1;i++)
{
if(v[i]==0) //如果当前v[i]为0,则进行修改操作
{
/*下面代码功能是,找到下一个0,这里有3中情况:
1.v[i+1]=0,则修改v[i]=1;
2.v[j]=0,j>i+1,且j没超过数组下标,修改v[i]=v[j]=1,v[i+1]=0;
3.若j超过数组下标,结束循环,这时说明只剩1个0了**/
int j=i+1;
while(j<v.size()&&v[j]==1) j++;
if(j>=v.size()) break;
else if(j==i+1) v[i]=1;
else
{
v[i]=v[j]=1;
v[i+1]=0;
}
}
//当前为1不用修改,继续
}
}
int main()
{
vector<int>v;
int n;
cin>>n;
cout<<"请输入二进制串,以空格分开:"<<endl;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
v.push_back(x);
}
maxchange(v);
cout<<"------------------------结果--------------------------------"<<endl;
for(int i=0;i<n;i++) cout<<v[i];
return 0;
}
查看11道真题和解析