给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。

给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:"   i    am a      little boy.    ",变成"i am a little boy",语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
1
2
3
C++函数原型:
void FormatString( char str[], int len){
}

思路:首先从开头开始遍历找到第一个不是空格的位置,并且记录为i,从j=0开始依次复制i的元素,如果i为空格,则知道找到第一个不是空格
复杂度 o(N)
   操作依然是基础的字符串搬运,遇到连续空格就省略当前的空格,利用现有数组空间。
   难点在于:头部和尾部的处理。
//#define  xFormatString //给定字符串(ASCII码0-255)数组, 优化
#ifdef xFormatString  //no other space;
void FormatString( char str[], int len)
{

  int i= 0 , j= 0 ,  k = 0 ;
  while ( str[i] ==  ' ' )i++;  //find i;
  while ( str[i] != '\0' ) //不要随意的使用while(str[i++])
  {
  if (str[i] ==  ' ' && str[i+ 1 ] ==  ' ' || str[i+ 1 ] ==  '\0' ) //完善不容易
  {
  i++;
  continue ;
  }
  str[j++] = str[i++];
  }
  str[j]= '\0' ;
}
int main(){
  char a[]= " i    am a      little boy.    " ;
  //char a[]="           begin";
  //char a[]="end ";
  //char *pa=a;
  unsigned  int len=strlen(a);
  FormatString(a,len);
  printf( "%s\n" ,a);
  system( "pause" );
  return 0 ;
}
#endif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值