题目:给定一个字符类型的数组chas[],chas的右半区全是空字符,左半区不含有空字符。现在想将左半区中所有的空格字符替换成“%20”,假设chas的右半区足够大,可以满足替换所需要的空间,请完成替换函数。要求时间复杂度O(N),空间复杂度O(1)。
补充题目:给定一个字符类型的数组chas[],其中只含有数字字符和‘ * ’字符。现在想将所有的 ‘ * ’字符都放在chas的左边,数字字符放在chas 的右边。请完成调整函数。
基本思路:以上两个题目都是利用倒着复制的技巧;对于原问题首先求出左半区的长度length,然后求出空格字符的个数num,进而可以求出替换后的有效长度,即newlen = length + num * 2。然后从chas的最后一个有效字符开始倒着遍历,同时将字符复制到新长度的最后位置,并依次倒着向左复制。遇到空格字符就依次把‘0’,‘2’,‘%’进行复制;对于补充问题。同样是从右到左倒着复制,遇到数字字符就直接复制,遇到‘ * ’不复制。当把数字字符复制完,数组的其余部分都设置成‘ * ’
def replace(chas):
if chas == None or len(chas) == 0:
return
num = 0
for i in range(0,len(chas) and chas[i]!=0):
if chas[i] == ' ':
num +=1
j = len(chas) + 2 * num
for i in range(len(chas)-1,-1):
if chas[i]!=' ':
chas[j] = chas[i]
j -=1
else:
chas[j] = '0'
j -= 1
chas[i] = '2'
j -= 1
chas[i] = '%'
j -= 1
def modify(chas):
if chas == None or len(chas) == 0:
return
j = len(chas) - 1
for i in range(len(chas)-1,-1,-1):
if chas[i] !='*':
chas[j] = chas[i]
j -=1
for i in range(j,-1,-1):
chas[i] = '*'