在二进制字符串中删除前0

时间:2012-12-23 11:19:32

标签: c++ string

给出二进制字符串,例如            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

4 个答案:

答案 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'的可能性,实际打印前一个字符需要一个字符缓冲区。