字符串空格替换

【附加题】--替换字符串中的空格为$$$。要求时间复杂度为O(N) 
例如:将"talk is cheap show me the code"替换。为"talk$$$is$$$cheap$$$show$$$me$$$the$$$code"

解题思路:
1.先求出原字符串中空格的个数NumBerOfBlank;
2.求出源字符串的的字符个数(不含‘\0’)OldLength;
3.求出加上替换符以后的新字符串的长度NewLength;
4.要判断新字符串字符个数和字符数组总大小的关系;避免访问越界,造成系统崩溃;
5.分别从原字符串的末尾和新字符串的末尾从后向前将原字符串的字符拷贝到新字符串对应的位置;期间原字符指针遇见了空格,那么原字符指针向后走一步,新字符指针向前走三步,每一步将要替换的字符填入指针所对应的位置;
6.直到源字符串访问完毕,或者新旧字符指针相遇,说明此时空格替换完毕;

#include<iostream>
#include<cassert>
using namespace std;
//空格替换函数
void ReplaceBlank(char* str,int len)
{
    //1.排除异常情况
    if (str==NULL||len<0)
    {
        return ;
    }
    //2.求加上$替换符以后的长度
    int OldLength=0;//源字符串长度
    int NumBerOfBlank=0;//统计空格的个数
    int NewLength=0;//加上$替换符以后的字符串总长度
    char* cur=str;
    while (*cur!='\0')
    {
        if (*cur==' ')
        {
            NumBerOfBlank++;//统计空格
        }
        cur++;
        OldLength++;
    }
    NewLength=NumBerOfBlank*2+OldLength;//把$加上以后的长度
    if (NewLength+1>len)
    {
        return ;
    }
    cur=str;
    //3.开始替换空格
    while (OldLength>=0&&OldLength<NewLength)
    {
        if (str[OldLength]==' ')
        {
            OldLength--;
            str[NewLength--]='$';
            str[NewLength--]='$';
            str[NewLength--]='$';
        }
        else
        {
            cur[NewLength--]=cur[OldLength--];      
        }
    }
}
//1.空格在中间
void test1()
{
    char str[50]="talk is cheap show me code";
    printf("%s\n",str);
    ReplaceBlank(str,50);
    printf("%s\n",str);
};
//2.两端也有空格
void test2()
{
    char str[50]=" talk is cheap show me code ";
    printf("%s\n",str);
    ReplaceBlank(str,50);
    printf("%s\n",str);
};
//3.没有主体,只有空格的字符串
void test3()
{
    char str[50]="  ";
    printf("%s\n",str);
    ReplaceBlank(str,50);
    printf("%s\n",str);
};
//空字符串
void test4()
{
    char str[50]="";
    printf("%s\n",str);
    ReplaceBlank(str,50);
    printf("%s\n",str);
};
int main()
{
    /*test1();*/
    /*test2();*/
    /*test3();*/
    test4();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值