1、题目
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2、解题思路
python:
解题思路1:直接使用Python字符串的内置函数。(通过)
解题思路2:剑指offer中的思路
C++
解题思路2:剑指offer中的思路
最简单的方法就是从头到尾遍历,但是时间复杂度为O(n^2)。
本文采用一种时间复杂度为O(n)的方法。
我们可以先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以”We are happy”为例,”We are happy”这个字符串的长度为14(包括结尾符号”\n”),里面有两个空格,因此替换之后字符串的长度是18。
我们从字符串的尾部开始复制和替换。首先准备两个指针,P1和P2,P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串”%20”。由于”%20”的长度为3,同时也要把P2向前移动3格。
移动示意图:

3、Python 2.7.12版本实现(因为牛客网上为2.7版本)
3.1、自己写的(通过)
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
new_list = []
str_list = list(s)
length = len(str_list)
for i in range(length):
if str_list[i] != " ":
new_list.append(str_list[i])
else:
new_list.append('%20')
return (''.join(new_list))
if __name__ == "__main__":
str= "We Are Happy"
solution = Solution()
new_str = solution.replaceSpace(str)
print new_str
3.2、根据参考文献改进后的
# -*- coding:utf-8 -*-
'''
剑指offer之面试题5:替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
见程序标注
编程环境:
Python2.7.12
作者:
优快云博客:https://my.youkuaiyun.com/yeqiang19910412
Github:https://github.com/YeQiang1075736553
日期:
2018.8.20
'''
#-*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
"""
剑指offer中的思路:(通过)
step1:统计空格个数
step2:计算替换后的字符串长度
step:从字符串的后面开始复制和替换
"""
if not isinstance(s,str) or len(s) <= 0 or s == None: # 判断非法输入
return None
original_length = len(s)
space_num = 0
for i in range(original_length): # 统计空格数
if s[i] == ' ':
space_num += 1
new_str_length = original_length + space_num * 2
new_str = new_str_length * [None]
index_original = original_length - 1
index_new = new_str_length -1
while index_original >= 0 :
if s[index_original] == ' ': # 有空格就插入
new_str[index_new] = '0'
new_str[index_new-1] = '2'
new_str[index_new-2] = '%'
index_original -= 1
index_new -= 3
else:
new_str[index_new] = s[index_original]
index_original -= 1
index_new -= 1
return ''.join(new_str)
if __name__ == "__main__":
str1= "We Are Happy"
solution = Solution()
str2 = solution.replaceSpace(str1)
print str2
GitHub 代码地址 :GitHub 代码地址 t5.py
4、C++版本实现
#include"iostream"
using namespace std;
/*************************************************
剑指offer之面试题5:替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
见程序标注
编程环境:
visual studio 2017
作者:
优快云博客:https://my.youkuaiyun.com/yeqiang19910412
Github:https://github.com/YeQiang1075736553
日期:
2018.8.20
**************************************************/
class Solution {
public:
void replaceSpace(char *str, int length) {
/**
* @brief 剑指offer中的思路:
* step1:统计空格个数
* step2:计算替换后的字符串长度
* step:从字符串的后面开始复制和替换
* @param *str char 字符串
* @param length int 字符串的长度
*
* @return char 返回插入后的字符串
*
*/
if (str == nullptr && length <= 0) {
return;
}
int originalLength = 0;
int numberOfBlack = 0;
// 统计空格数
int i = 0;
while (str[i] != '\0') {
++originalLength; // 不包括'\0'
if (str[i] == ' ') {
++numberOfBlack;
}
++i;
}
int indexOfOriginal = originalLength; // indexOfOriginal = 13
int indexOfNew = originalLength + numberOfBlack * 2; // indexOfNew = 17
cout << indexOfNew << endl;
cout << indexOfOriginal << endl;
while (indexOfOriginal>=0)
{
if (str[indexOfOriginal] == ' ') {
str[indexOfNew] = '0';
str[indexOfNew-1] = '2';
str[indexOfNew-2] = '%';
indexOfNew -= 3;
indexOfOriginal -= 1;
}
else {
str[indexOfNew] = str[indexOfOriginal];
indexOfNew -= 1;
indexOfOriginal -= 1;
}
}
}
};
/////////////////////////////////////////////////////////////////////////////////////////////
//class Solution {
//public:
// void replaceSpace(char *str, int length)
// {
// // 剑指offer源代码
// if (str == nullptr && length <= 0)
// return;
//
// /*originalLength 为字符串str的实际长度*/
// int originalLength = 0;
// int numberOfBlank = 0;
// int i = 0;
// while (str[i] != '\0')
// {
// ++originalLength;
//
// if (str[i] == ' ')
// ++numberOfBlank;
//
// ++i;
// }
// /*newLength 为把空格替换成'%20'之后的长度*/
// int newLength = originalLength + numberOfBlank * 2;
// int indexOfOriginal = originalLength;
// int indexOfNew = newLength;
// cout << indexOfNew << endl;
// cout << indexOfOriginal << endl;
// while (indexOfOriginal >= 0)
// {
// if (str[indexOfOriginal] == ' ')
// {
// str[indexOfNew--] = '0';
// str[indexOfNew--] = '2';
// str[indexOfNew--] = '%';
// }
// else
// {
// str[indexOfNew--] = str[indexOfOriginal];
// }
//
// --indexOfOriginal;
// }
// }
//};
int main(void) {
char str[] = "We Are Happy.";
int length = sizeof(str) / sizeof(str[0]) ; // 包括'\0'
Solution solution;
solution.replaceSpace(str, length);
cout << str << endl;
system("pause");
return 0;
}
GitHub 代码地址 :GitHub 代码地址 t5.cpp
参考文献:
1. Jack-Lee-Hiter/AlgorithmsByPython/Target Offer/替换空格.py:解题思路1:直接使用Python字符串的内置函数。
2. gatieme/CodingInterviews/004-替换空格:C++
3. 剑指Offer(二):替换空格:C++