题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
# -*- coding:utf-8 -*- class Solution: # s 源字符串 def replaceSpace(self, s): # write code here
思路解答:
将长度为1的空格替换为长度为3的“%20”,字符串的长度变长。
如果允许我们开辟一个新的数组来存放替换空格后的字符串,
那么这道题目就非常简单。设置两个指针分别指向新旧字符串首元素,
遍历原字符串,如果碰到空格就在新字符串上填入“%20”,
否则就复制元字符串上的内容。
# -*- coding:utf-8 -*- class Solution: # s 源字符串 def replaceSpace(self, s): # write code here new_s = '' for i in s: if i == ' ': i = '%20' new_s = new_s + i return new_s if __name__ == '__main__': s = 'We Are Happy' print(Solution().replaceSpace(s))
但是如果面试官要求在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,
那么我们就得另想方法。
首先遍历原字符串,找出字符串的长度以及其中的空格数量,
根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
(这里为什么取末尾开始遍历,而不是取起始开始遍历,是为了利用point1==point2这个判断条件)
如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,
如果point1指向为空格,那么从point2开始赋值“02%”
直到point1==point2时表明字符串中的所有空格都已经替换完毕。
# -*- coding:utf-8 -*- class Solution: # s 源字符串 def replaceSpace(self, s): # write code here blankNumber = 0#空格的数量 oldStringLen = len(s)##原字符串的长度 # 遍历原字符串,找出字符串的空格数量 for i in range(oldStringLen): if s[i] == ' ': blankNumber += 1 # 计算新字符串的长度 newStringLen = oldStringLen + blankNumber * 2 # 声明新字符串列表(因为字符串是不可改变的) newStringList = [' '] * newStringLen # 设置两个指针,分别指向那个原字符串和新字符串的末尾位置 point1 = oldStringLen - 1 point2 = newStringLen - 1 # 遍历替换 while point1 != point2: # 如果两个指针位置不同,则表明没有替换完成 if s[point1] != ' ':#字符不为空 newStringList[point2] = s[point1] point1 -= 1 point2 -= 1 else: newStringList[point2] = '0' newStringList[point2-1] = '2' newStringList[point2-2] = '%' point1 -= 1 point2 -= 3 # 把指针恰好相同时,之前的字符也补上 if point1 > 0: for i in range(point1, -1, -1): newStringList[i] = s[i] # 把字符串数组组合为字符串 newString = '' for i in range(newStringLen): newString += str(newStringList[i]) return newString #测试用例 s = Solution() print(s.replaceSpace('We Are Happy'))
相关题目:
有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的。
解答:
和前面的例题一样,很多人首先想到的办法是在A1中从头到尾复制数字,但这样会出现多次复制1个数字的情况。更好的办法是从尾到头比较A1和A2中的数字,并且把较大的数字复制到A1中的合适位置。
# -*- coding:utf-8 -*- class Solution: # s 源字符串 def Sort_array(self, arry1,arry2): i = len(arry1) + len(arry2) -1 point1 = len(arry1) - 1 point2 = len(arry2) - 1 arry1 += [' '] *len(arry2) while point2 >= 0 and point1 >= 0: if arry1[point1] >= arry2[point2]: arry1[i] = arry1[point1] point1 -= 1 else: arry1[i] =arry2[point2] point2 -= 1 i -= 1 while point1 >= 0: arry1[i] = arry1[point1] point1 -= 1 i -= 1 while point2 >= 0: arry1[i] = arry2[point2] point2 -= 1 i -= 1 return arry1 #测试用例 s = Solution() arry1 = [3,4,6,7,9] arry2 = [1,2,2,5,8] print(s.Sort_array(arry1,arry2))