《剑指offer》替换空格
本题来自《剑指offer》 替换空格
题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
方案一:空间优先,在原数组的基础上进行替换,没替换一次就将后面的字符串向后挪两个位置
step1:查询空格的个数,在此基础上申请空格数两倍的位置
step2:从后面向前遍历,如果遇到空格就加入‘’02%‘’,否则就继续挪动非空格字符,直到空格遍历完。代码采用了c++编程
方案二:可申请额外的空间,当遇到空格就替换成'%20',采用python编程。
C++ Code:
class Solution { public: void replaceSpace(char *str,int length) { if (str == NULL || length <= 0){ //审核为空或者length小于0直接返回 return ; } int originallLength = 0; //定义数组原始长度 int numberOfBlank = 0; //定义空格的长度 int i = 0; while (str[i] != '\0'){ //统计空格的个数 originallLength ++; if (str[i] == ' '){ numberOfBlank ++; } i++; } int newLength = originallLength + numberOfBlank * 2; //数组新的长度,假设传入的数组后面还有空格 if (newLength > length){ return ; } int newIndex = newLength; //赋予新长度的下标 int originIndex = originallLength; //赋予原始数据的下标 while (originIndex >= 0 && newIndex > originIndex){ //开始遍历,当原始下标越界或者新下标与原始下标持平便退出 if (str[originIndex] == ' '){ //当有空格时候,新数组的小标往前移动三个位置 str[newIndex --] = '0'; //加入%20数据 str[newIndex --] = '2'; str[newIndex --] = '%'; }else{ str[newIndex --] = str[originIndex]; //正常情况下,将前面的数据向后挪动 } originIndex --; //原始下标往前移动 } } };
Python Code:
# -*- coding:utf-8 -*- class Solution: def replaceSpace(self, s): # write code here # s 源字符串 # write code here s = list(s) count=len(s) for i in range(0,count): if s[i]==' ': s[i]='%20' return ''.join(s)
总结:
根据需求,衡量的准则是时间和空间。
若以时间换空间,则采用第一种方法,只需要申请其空格数量两倍的空间。
若以空间换时间,则直接另外申请一块空间,遇到直接替换即可。
若在数组中遇到前面的元素的操作会影响到后面的元素,可以考虑从面操作,前天是存储空间的充足。如果从前面操作,就不停的对后面数据进行造成影响,依次迭代,就会出现重复操作的,虽然可以,但是时间效率会比较高。若从后面操作就会只有一次操作了。