给定字符串(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
|