替换与调整字符串
替换字符串
【题目】
给定一个字符类型的数组chas[],chas右半区全是空字符,左半区不含有空字符。
现在想将左半区中所有的空格字符替换成"%20",假设chas右半区足够大,可以满足替换所需要的空间,请完成替换函数。
【举例】
如果把chas的左半区看作字符串,为"a b c",假设chas的右半区足够大。
替换后, chas的左半区为"a%20b%20%20c"。
【要求】
替换函数的时间复杂度为
O
(
N
)
O(N)
O(N),额外空间复杂度为
O
(
1
)
O(1)
O(1)。
算法思路
统计左半区的总字符数量left_len
,空格数量space_num
替换后的长度为left_len + 2 * space_num
从右往左,复制字符
若为空格字符(’ ‘),则依次复制’0’,‘2’,’%'字符;
否则复制相应的字符。
相应代码
# 替换字符串
def replace(chas):
if chas is None or len(chas) == 0:
return chas
space_num = 0
left_len = 0
for i in range(len(chas)):
if chas[i] != 0:
if chas[i] == ' ':
space_num += 1
left_len += 1
else:
break
size = left_len + 2 * space_num
j = size - 1
for i in range(left_len - 1, -1, -1):
if chas[i] != ' ':
chas[j] = chas[i]
j -= 1
else:
# chas[j - 2: j + 1] = "%20", j -= 3
chas[j] = '0'
j -= 1
chas[j] = '2'
j -= 1
chas[j] = '%'
j -= 1
# 简单测试
if __name__ == '__main__':
print("替换字符串")
chas = ['a', ' ', 'b', ' ', 'c', 0, 0, 0, 0]
replace(chas)
print(chas)
调整字符串
【补充题目】
给定一个字符类型的数组chas[],其中只含有数字字符和’*‘字符。
现在想把所有的’*'字符挪到chas的左边,数字字符挪到chas的右边。请完成调整函数。
【举例】
如果把chas看作字符串,为"12**345"。调整后chas为"**12345"。
【要求】
- 调整函数的时间复杂度为 O ( N ) O(N) O(N),额外空间复杂度为 O ( 1 ) O(1) O(1)。
- 数字字符仍按从左到右的顺序出现。
算法思路
从右往左,复制字符
遇见数字字符,复制;
遇见’*‘字符,跳过;
最终统一填充’*'字符。
相应代码
# 调整字符串
def modify(chas):
size = len(chas)
j = size - 1
for i in range(size - 1, -1, -1):
if chas[i] != '*':
chas[j] = chas[i]
j -= 1
while j > -1:
chas[j] = '*'
j -= 1
# 简单测试
if __name__ == '__main__':
print("调整字符串")
s = "12**345"
chas = list(s)
modify(chas)
print(chas)
print("字符串形式", ''.join(chas))
print()
s = "1*2**34*5"
chas = list(s)
modify(chas)
print(chas)
print("字符串形式", ''.join(chas))
print()
小结
两题都采用从右往左,复制字符。
其实很多字符串问题也和这个小技巧有关。
字符串的面试题一般不会太难,很多题目都是在考查代码实现能力。
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!