### 题目:实现一个函数,把字符串中的每个空格替换成 "%20"。(原字符串有足够的空间容纳替换后的字符串) ### 思路:因为要将一个字符替换成三个字符,因此如果从前往后遍历原字符串的话,则每遇到一个空格就需要将该空格后面的字符串往后移动两个位置。移动一次数组的时间复杂度为 O(n),所以总的时间复杂度为O(n<sup>2</sup>)。因此换种思路:从后往前遍历。我们先遍历一次原字符串,所花时间为 O(n),设置两个指针,一个指向原字符串尾部('\0'),另一个指向替换之后的字符串的末尾,保持使第一个指针永远指向第一个没有被复制的字符,第二个指针指向将要被复制的字符或要被替换的字符存储的最后一个位置,这样当两个指针重叠时,则表示空格已被替换完。因此最多也只遍历了一遍原字符串,所以时间复杂度为 O(n)。总的时间复杂度也为 O(n)。 ``` void replaceBlank(char str[]) { if (str == nullptr || strlen(str) <= 0) return; int originalLen = 0, blankCnt = 0; while (str[originalLen] != '\0') [ if (str[originalLen] == ' ') [ ++blankCnt; } ++originalLen; } int newLength = originalLen + blankCnt * 2; int indexOfOriginal = originalLen; int indexOfNew = newLength; while (indexOfOriginal >=0 && indexOfOriginal < indexOfNew) { if (str[indexOfOriginal] == ' ') { str[indexOfNew--] = '0'; str[indexOfNew--] = '2'; str[indexOfNew--] = '%'; } else { str[indexOfNew--] = str[indexOfOriginal]; } --indexOfOriginal } } ```