1. 题目:
题目摘自牛客网
给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:” i am a little boy. “,变成”i am a little boy”,语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
void FormatString(char str[],int len){ }
2. 分析:
这个题目如果没有不可辟额外空间的要求,我们可以另创建一个字符串数组,用于存放最终结果,做起来相对容易一些。但是本题要求不可另辟空间,也就是所有操作都需要在原字符串数组str[]上完成,所以题目相对而言要复杂一些。这里我们只需要明白一个地方,由于空格的存在,最终数组字符个数一定会比原数组长度短或相等。所以我们只要排除多余空格,后面数值指针依次前移即可,并不会发生数值覆盖引起数据丢失,最后结束提前增加一个字符串结束符’\0’即可。
3. C++程序:
#include<iostream>
#include<cstring>
using namespace std;
void FormatString(char str[],int len)
{
int cur=0, prev=0;
if (str == NULL || len <= 0) //算法鲁棒性
return;
while(str[cur] == ' ') // 处理开头空格,直到非空格字符出现
++cur;
while(cur < len)
{
if ( str[cur] == ' ' && str[cur+1] == ' ') //中间连着空格的处理,直到出现第一位是空格,第二位非空格
++cur;
else if ( str[cur] == ' ' && str[cur+1] == '\0') //末尾空格的处理,直接去除
break;
else //直接数值前移,去除中间多余空格
str[prev++] = str[cur++];
}
str[prev] = '\0'; //新字符数组末尾加上结束符,去除原字符数组影响
}
int main( )
{
char nArr[ ] = " i am a good boy! ";
FormatString(nArr, strlen(nArr));
cout<< nArr <<endl;
return 0;
}
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!