给出二进制字符串,例如 10101011111001 我想删除第一个零(在上面的情况下是第二个),如果没有0则删除任何1,所以上面的字符串的输出将是 1101011111001。
如果我使用
for( int i = 0 ; i < siz-1 ; i++ ){
if( s[i] =='0' && bit ==1) {
bit = 0;
}else {
ans = ans + s[i];
}
}
if( bit == 1 ) {
cout << ans <<endl;
}else {
ans = ans + s[siz-1];
cout << ans <<endl;
}
上面的解决方案给了我TLE和使用擦除功能正常工作的解决方案,是什么导致了这种行为?
注意:字符串的大小最多可以是10 ^ 5
答案 0 :(得分:1)
pos = s.find('0');
if (pos == string::npos) {
result = s.substr(1);
} else {
result = s.substr(0, pos) + s.substr(pos+1);
}
答案 1 :(得分:0)
这是示例代码(不是正确的代码而不是c ++,只是伪代码)
int count=0;
bool zerofound==false;
while(yourstring.contains('0'))
{
if(yourstring.elementAt(count)=='0')
{
yourstring.replace('0','');
zerofound==true;
break;
}
count++;
}
if(!zerofound)
{
yourstring.replaceAt(0,'');
}
答案 2 :(得分:0)
在循环中执行此操作会很慢:
ans = ans + s[i];
每次都需要复制字符串。相反,你应该使用:
ans.push_back(s[i]);
将就地修改字符串。这将为您提供线性运行时而不是现在的二次运行时,这将是长字符串的主要改进。
为了获得最佳效果,您还可以在循环之前放置ans.reserve(siz);
,以便不需要执行重新分配。
答案 3 :(得分:0)
您的代码看起来像是需要在最后打印字符串。 如果是这种情况,那么另一个解决方案是检查每个字符并打印它,如果它不是第一个零。
这样就可以避免在打印前对字符串进行所有操作。
附录:显然,为了解释当字符串只有1时不打印最后一个'1'的可能性,实际打印前一个字符需要一个字符缓冲区。