一道2005金山笔试题

问题描述:
/*
2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符'*'移到串的前部分,
前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)
*/

  1. #include<iostream>
  2. using namespace std;
  3. int  charBackward(char P[], int c_length)
  4. {
  5.      int i=0, length=0;
  6.      while(i<c_length)
  7.      {
  8.           if(P[i]=='*' && length==0){ i++; continue; }
  9.           else if(P[i]=='*' && length!=0)
  10.           {
  11.                for(int j=i; j>i-length; j--)P[j]=P[j-1];
  12.                P[i-length]='*';
  13.                
  14.           }
  15.           else length++;
  16.           i++;
  17.      }
  18.      return length;
  19. }
  20. int main()
  21. {
  22.     int num;
  23.     //char PC[]="ab**cd**e*12";
  24.     char PC[]="abc***f**544******hhggs*ooo**************yd*";
  25.     //char PC[]="***a";
  26.     //char PC[]="*****";
  27.     //char PC[]="aaba";
  28.     //char PC[]="a*";
  29.     //char PC[]="*b";
  30.     cout<<"Before CharBackward, the string is:/n";
  31.     cout<<PC<<endl;
  32.     num=charBackward(PC, strlen(PC));
  33.     cout<<"NOT * character nums: "<<num<<endl;
  34.     cout<<"After CharBackward, the string is changed to:/n";
  35.     cout<<PC<<endl;
  36.     getchar();
  37.     return 0;
  38. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值