码不停题: 替换空格

90 阅读1分钟

题目简述: 替换字符串s中的空格为'%20'

python:

    def replaceSpace(self, s):
        return s.replace(' ', '%20')

C++:

class Solution {
public:
    string replaceSpace(string s) {

        if(s.size() == 0) return s;

        int originalLength = 0;
        int numberOfBlank = 0;
        
        // 统计有多少个字符以及空白字符
        for(int i=0; s[i] != '\0'; i++) {
            originalLength++;
            if(s[i] == ' ') numberOfBlank++;
        }

        int newLength = originalLength + numberOfBlank*2;

        if(newLength > s.size()) s.resize(newLength); // 增加数组内存

        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;

        while(indexOfOriginal >= 0 && indexOfNew >= indexOfOriginal) {
            if(s[indexOfOriginal] == ' ') {
                s[indexOfNew--] = '0';
                s[indexOfNew--] = '2';
                s[indexOfNew--] = '%';
            } else {
                s[indexOfNew--] = s[indexOfOriginal];
            }
            
            --indexOfOriginal;
        }
        return s;
    }
};

C:

char* replaceSpace(char* s){
    int count = 0; // 记录空格个数
    int length = 0; // 记录数组长度

    for(int i=0; s[i] != '\0'; i++, length++) {
        if(s[i] == ' ') ++count;
    }

    int newLength = length + count*2;

    char* result = malloc(sizeof(char) * (newLength+1));

    int indexOfOriginal = length;
    int indexOfNew = newLength;

    while(indexOfOriginal >= 0 && indexOfNew >= indexOfOriginal) {
        if(s[indexOfOriginal] == ' ') {
            result[indexOfNew--] = '0';
            result[indexOfNew--] = '2';
            result[indexOfNew--] = '%';
        } else {
            result[indexOfNew--] = s[indexOfOriginal];
        }

        indexOfOriginal--;
    }
    return result;
}

解析:

  1. 思路:

    a. 统计非结束符字符个数, 确定数组有效长度.

    b. 双指针倒序操作, 避免(正序)多次重复移动元素.

    c. 通过推算得到增加的数组内存.

  2. 技巧:

    a. C++中的数组resize()等价于C手动malloc(sizeof(type)*len)

    b. 多使用自增自减运算符简化代码.

  3. 对比:

image.png

性能上: C>C++>python.