【剑指offer】面试题4---替换空格

1、题目描述

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


2、解题思路

时间复杂度为O(n)

首先遍历一遍字符串,统计出字符串中空格的总数,并且根据空格的总数计算出替换后字符串的新长度。

从字符串的后面开始复制和替换。

准备两个指针,pNew和pOld,pNew指向替换后德字符串的尾部位置,pOld指向原始字符串的尾部位置。

如果pOld指向空格,就分别将‘0’‘2’‘%’(因为指针是从后向前走的)赋给pNew所指向的空间。否则将POld所指向空间的内容赋给PNew所指向空间的内容,两个指针分别朝前移动。

【图源于剑指offer】

这里写图片描述


3、源码实现

#include<stdio.h>
#include<stack>
#include<iostream>
#pragma warning(disable : 4996)
using namespace std;

void Print(char arr[], int size){
    for (size_t i = 0; i < size; ++i){
        cout << arr[i];
    }
    cout << endl;
}

int main(){
    char str[] = "hello world!\n";
    int count = 0;
    int size = 0;//原字符串大小
    size = strlen(str);
    //遍历字符串,计算有多少个需要替换的空格,并计算出新的字符串大小
    for (size_t i = 0; i < size; ++i){
        if (str[i] == ' ')
            count++;
    }
    Print(str, size);
    int new_size = size + 2 * count;
    //采用前后指针,从后向前遍历,遇见空格就替换
    char* pOld = &str[size - 1];
    char* pNew = &str[new_size - 1];
    while (pOld < pNew){
        if (*pOld == ' '){
            *pNew-- = '0';
            *pNew-- = '2';
            *pNew-- = '%';
            pOld--;
        }
        *pNew-- = *pOld--;

    }
    Print(str, new_size);
    return 0;
}

4、结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sofia_m/article/details/81238976