华为机试第二题测试集错误
题目描述有一段全是0和1的字符串,可以将00变成10也可以将10变成01,可以无限次调整,问调整后的最大字串。
简单说下我的思路:
从左到右遍历,1直接过,对于0i就找后面第二个 0j,将i置1,i后面第二个数置0,再后面的数一直到j全部置1.
那么对于0110这个案例我们可以这么做
0110->0101->0011->1011,而测试库的解答应该是0110不变化。
附上我的代码:
#include<iostream>
using namespace std;
void help(string &s,int n){
int i=0;
while(i<n){
if(s[i]=='1') i++;
else{
int j=i+1;
while(j<n){
if(s[j]=='0'){
s[i]='1';
s[i+1]='0';
for(int k=i+2;k<=j;k++){
s[k]='1';
}
// cout<<s<<endl;这里输出了每次变化,正式代码里删除
break;
}
else j++;
}
if(j==n) break;
else i++;
}
}
}
int main(){
int n,m;
string s;
cin>>n;
while(n--){
cin>>m>>s;
help(s,m);
cout<<s<<endl;
}
}
#华为机试##华为##笔试题目#using namespace std;
void help(string &s,int n){
int i=0;
while(i<n){
if(s[i]=='1') i++;
else{
int j=i+1;
while(j<n){
if(s[j]=='0'){
s[i]='1';
s[i+1]='0';
for(int k=i+2;k<=j;k++){
s[k]='1';
}
// cout<<s<<endl;这里输出了每次变化,正式代码里删除
break;
}
else j++;
}
if(j==n) break;
else i++;
}
}
}
int main(){
int n,m;
string s;
cin>>n;
while(n--){
cin>>m>>s;
help(s,m);
cout<<s<<endl;
}
}