剑指offer2_替换空格_题解

替换空格

题目描述

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

分析

方案一:逆向遍历

\[结果字符串长度 = 原字符串长度 + 2 * 原字符串中空格数 \]

\[即new\_length = length + 2 * cnt \]

从右向左遍历原字符串,当遇到原字符串当前字符为空格时,在结果字符串对应位置j左侧连续3个位置分别填充“02%“,否则将原字符串当前字符复制到结果字符串位置j

代码

/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
void replaceSpace(char *str, int length)
{
    int cnt = 0; //空格个数
    // 统计空格个数
    for (int i = 0; i < length; i++)
    {
        if (str[i] == ' ')
            ++cnt;
    }
    if (!cnt)
        return; //没有空格,直接返回
    // 计算结果字符串长度
    int new_length = length + 2 * cnt;
    int j = new_length - 1; //j:结果字符串最后一个字符所在下标
    // 替换空格
    for (int i = length - 1; i >= 0; i--)
    {
        if (str[i] == ' ')
        {
            str[j--] = '0';
            str[j--] = '2';
            str[j--] = '%';
        }
        else
            str[j--] = str[i];
    }
}

方案二:增加一个新的字符串

增加一个新字符串,遍历原来的字符串,遍历过程中,如果非空格则将原来的字符直接拼接到新字符串中,如果遇到空格则将%20拼接到新字符串中

代码

/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(n)
开辟了新的字符数组
**/
void replaceSpace(char *str, int length)
{
    // 动态分配一个新的字符数组,最大长度为3倍原来的字符串长度
    char *ans = (char *)malloc(sizeof(char) * 3 * length);
    int j = 0;//新的字符数组下标
    // 将替换结果存储到新的字符数组中
    for (int i = 0; i < length; i++, j++)
    {
        if (str[i] == ' ')
        {
            ans[j] = '%', ans[j + 1] = '2', ans[j + 2] = '0';
            j += 2;//替换完成,新的字符数组下标右移2位
        }
        else
            ans[j] = str[i];
    }
    // 将结果字符数组拷贝到原字符数组
    strcpy(str, ans);
    // 释放结果字符数组所占的空间
    free(ans);
}
posted @ 2020-12-01 21:36  RiverCold  阅读(46)  评论(0编辑  收藏  举报