剑指Offer系列---(6)替换空格

1.题目描述:
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入”We are happy.”则输出”We%20are%20happy.”。

2.分析:
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
1)首先遍历原字符串,找出字符串的长度以及其中的空格数量;
2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;
3)设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置;
4)如果point1指向的内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值”%20”,并且第一个指针向前移动一格,第二个指针向前移动三格;
5)直到point1==point2时表明字符串中的所有空格都已经替换完毕。
3.源代码:

//  Copyright (c) 2015年 skewrain. All rights reserved.
//

#include <iostream>
#include <stdio.h>
using namespace std;
//length为字符串总容量

void ReplaceBlank(char string[],int length)
{
    if (string == NULL || length <= 0) {
        return;
    }
    //originalLength为字符串string的实际长度
    int originalLength = 0;
    int numberOfBlank = 0;
    int i = 0;
    while (string[i] != '\0') {
        ++ originalLength;
        
        if (string[i] == ' ') {
            ++ numberOfBlank;
        }
        ++i;
    }
    
    //newLength为把空格替换成'%20'之后的长度
    int newLength = originalLength + numberOfBlank*2;
    if (newLength > length) {
        return;
    }
    
    int indexOfOriginal = originalLength;
    int indexOfNew = newLength;
    while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
        if (string[indexOfOriginal] == ' ') {
            string[indexOfNew--] = '0';
            string[indexOfNew--] = '2';
            string[indexOfNew--] = '%';
        }
        else
        {
            string[indexOfNew--] = string[indexOfOriginal];
        }
        -- indexOfOriginal;
    }
}

int main(int argc,char *argv[]){

    char *string = new char[50];
    while (gets(string)) {
        ReplaceBlank(string, 50);
        puts(string);
    }

    return 0;
}


拓展:清除空格

分析:
1)设定两个指针p1和p2,初始状态都指向字符串首字符;
2)如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素;
3)直到p2指向字符串末尾的’\0’时清除空格结束。

源代码:

#include <iostream>
#include <stdio.h>
using namespace std;

void RemoveBlank(char *s)
{
    //设置两个指针指向数组首元素
    char *p1 = s;
    char *p2 = s;
    while ('\0'!=*p1) {
        if(' '!=*p2)//如果p2指向不为空格,则将p2指向内容复制给p1指向
            *p1++ = *p2++;
        else//如果p2指向为空格,则p2指针向前移动一格。
            p2++;
    }
}

int main(int argc,char *argv[]){

    char string[100] = "we are happy.";
    cout<<string<<endl;
    RemoveBlank(string);
    cout<<string<<endl;
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值