剑指offer——替换空格

本文介绍了一种高效的字符串处理算法,用于将字符串中的空格替换成“%20”。通过从后向前遍历并预先计算替换后字符串的长度,避免了频繁的元素移动,降低了时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
Input:
“A B”
Output
“A%20B”

解题思路:一看是字符串处理问题,最先想到的是从前往后遍历,然后根据需求处理。这个题,如果从前往后遍历,每次遇到空格,便要将空格替换为%20,也就是说,每遇到一个空格,需要往后移动2个元素,如果字符串很长空格很多,那开销会非常大,时间复杂度也比较高。
所以这种问题可以换个思路想:既然不想每遇到一个空格都移动两个元素,那么我们可以事先计算好这个字符串有几个空格,那不就知道了 替换后的字符串总长了吗。那我们又可以从这个**“替换后的字符串总长"的最后一个元素开始往前走**,遇到空格就加个"02%"(下标从大到小),没遇到空格就让这个元素等于原来位置的字符。这其实就可以理解为 在原字符串上的“扩充”,原字符串最大长度为originLength,替换后为NewLength,那我们就将originLength长度的字符串扩充到NewLength长度的字符串,然后给NewLength长度字符串赋上结束符’\0’,就完成了字符串的空格替换。接下来是代码和演示:

void replaceSpace(char* p1, int Strlen) {
    if (p1 == NULL || Strlen <= 0) {
        return;
    }
    int BlankNum = 0;
    int originLength = Strlen;     //p1的长度
    int i = 0;
    while (p1[i] != '\0') {
        if (p1[i] == ' ') {
            ++BlankNum;    //统计空格数
        }
        ++i;
    }
    int NewLength = originLength + 2 * BlankNum;  //替换后p1的长度
    int index_original = originLength - 1;   //原始p1的初始指向(最后一个元素)
    int index_new = NewLength - 1;           //替换后p1的初始指向(最后一个元素)
    p1[index_new + 1] = '\0';                //替换后为新的字符串赋结束符
 
    while (index_original >= 0) {        //保证原始 p1在长度范围内
                                   //可以只有一个条件,&&index_new>index_original可以不用加
                                   //因为新旧字符串大小都已经固定,index_new必然走在index_origin之前
    if (p1[index_original] == ' ') {
           p1[index_new--] = '0';  //注意顺序
           p1[index_new--] = '2';
           p1[index_new--] = '%';
       }
    else {
           p1[index_new--] = p1[index_original];  //无空格
       }
        --index_original;
    }
 }
 
 //测试
    char p1[] = "leborn is a great player ";
    char p2[] = "Bryant 24 ";
    char p3[] = " Jordan6 rings";
    char p4[] = "M A G IC";
    char p5[] = "a  \0 b";
    char p6[] = "     ";
    replaceSpace(p1, strlen(p1));
    cout << p1 << endl;
 
    replaceSpace(p2, strlen(p2));
    cout << p2 << endl;

    replaceSpace(p3, strlen(p3));
    cout << p3 << endl;

    replaceSpace(p4, strlen(p4));
    cout << p4 << endl;

    replaceSpace(p5, strlen(p5));
    cout << p5 << endl;
 
    replaceSpace(p6, strlen(p6));
    cout << p6 << endl;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值