替换空格(Python and C++解法)

题目:

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

思路:

  pyhon中有很多非常方便的替换操作,如:

1 return s.replace(' ', '%20')  # 直接replace替换就行
1 s = s.split(" ")
2 return "%20".join(s)
1 strLen = len(s)
2 newStr = []
3 for i in range(strLen):
4     if s[i] == " ":
5         newStr.append("%20")
6     else:
7         newStr.append(s[i])
8 return ''.join(newStr)  # ''.join()表示什么也不添加;如果没有该句,则返回的是一个列表        

上述解法操作上很方便,但是涉及到了大量的字符重复搬移工作,且严格来说,题目需要自己实现一个函数实现该替换功能。

如果想降低复杂度,需要将所有的字符搬运次数降低为1次,时间复杂度变为O(n)。

方法是:先统计源字符串的长度L1和空格个数K,那么替换20%之后的新字符串长度L2 = L1 + 2*K。然后使用两个指针,一个P1指向源字符串的末尾,一个P2指向新字符串的末尾,逐个复制P1指向的字符给P2,直到P1遇到第一个空格,此时P1往前移一位,P2移动3位,插入20%。重复上述过程,直到两个指针相遇,代表空格已经插完。

Python解法:

 1 class Solution:
 2     def replaceSpace(self, s):
 3         s_len = len(s)  # 源字符串长度
 4         n_space = 0  # 空格计数
 5         if s is None or s_len == 0:
 6             return ""
 7 
 8         for i in range(s_len):  # 统计空格数量
 9             if s[i] == ' ':
10                 n_space += 1
11         s_new_len = s_len + 2 * n_space  # 新串的长度
12 
13         if s_new_len == s_len:  # 如果没有空格,直接返回源串
14             return s
15         s_new = [0] * s_new_len  # 新串
16 
17         while s_len >= 0 and s_new_len >= s_len:
18             if s[s_len-1] != ' ':
19                 s_new[s_new_len - 1] = s[s_len - 1]
20                 s_new_len -= 1
21                 s_len -= 1
22             else:
23                 s_len -= 1
24                 s_new[s_new_len-1] = '0'
25                 s_new_len -= 1
26                 s_new[s_new_len-1] = '2'
27                 s_new_len -= 1
28                 s_new[s_new_len-1] = '%'
29                 s_new_len -= 1
30         return ''.join(s_new)

C++解法:

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str, int length) {
 4         if (str == NULL || length == 0)
 5             return;
 6         int spaceCount = 0;  //  统计空格
 7         int index = 0;  // 由于不知所给的length识别包含'\0',所以实际统计一下字符
 8         while (str[index] != '\0') {
 9             if(str[index] == ' ')
10                 spaceCount += 1;
11             ++index;
12         }
13         int oriLentg = index, newLength = oriLentg + 2 * spaceCount;
14         
15         if(spaceCount == 0)
16             return;
17 
18         while (oriLentg >= 0 && newLength >= oriLentg) {
19             if (str[oriLentg] != ' ') {
20                 str[newLength] = str[oriLentg];
21                 oriLentg -= 1;
22                 newLength -= 1;
23             }
24             else {
25                 oriLentg -= 1;
26                 str[newLength--] = '0';
27                 str[newLength--] = '2';
28                 str[newLength--] = '%';
29             }
30         }
31         return;
32     }
33 };
posted @ 2020-06-20 21:21  孔子?孟子?小柱子!  阅读(188)  评论(0编辑  收藏  举报