C++笔试题(剑指offer 面试题4 替换字符串中的空格)

#ifndef F_FIND_WORK_TEST4_REPLACE_BLANK_20171106_JHASKDFJHASF_H_
#define F_FIND_WORK_TEST4_REPLACE_BLANK_20171106_JHASKDFJHASF_H_

#include <stdio.h>

/*
剑指offer 面试题
替换字符串中的空格
将字符串出现的所有空格,替换为%20
1) 由于空格和%20所占用的字节不同,所以替换之后字符串长度变长
2) 由于长度不同,导致每一次替换时,空格之后的字符都要做一次移动,导致消耗时间大

因此: 采用双指针,重新申请内存,从末尾开始复制
*/

BOOL RepalceBlank(char szTest[], int nLen);

//测试
void F_Test4_ReplaceBlank()
{
    char szTest[] = "Hello Word, Welcome to my country, China!";

    RepalceBlank(szTest, strlen(szTest) + 80);
}

BOOL RepalceBlank(char szTest[], int nLen)
{
    if((nLen < 0) || (szTest == NULL))
    {
        return FALSE;
    }

    //计算长度 和 空格个数
    int nOldLen(0);
    int nBlankNums(0);
    while (szTest[nOldLen] != '\0')
    {
        if (szTest[nOldLen] == ' ')
        {
            nBlankNums++;
        }

        nOldLen++;
    }

    //每一个 %20 比' '多两个字符
    int nNewLen = nOldLen + nBlankNums*2;
    if(nNewLen > nLen)
    {
        return FALSE;//没有足够的空间存储替换后的字符串
    }

    //从尾部开始复制元素
    while(nNewLen >= 0)
    {
        if (szTest[nOldLen] == ' ')
        {
            szTest[nNewLen--] = '0';
            szTest[nNewLen--] = '2';
            szTest[nNewLen--] = '%';
        }
        else
        {
            szTest[nNewLen--] = szTest[nOldLen];
        }

        nOldLen--;
    }

    return TRUE;
}


#endif//F_FIND_WORK_TEST4_REPLACE_BLANK_20171106_JHASKDFJHASF_H_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值