【题目】
给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序逆序即可,对空格的位置没有特别要求。例如把chas看成字符串为“I love you”,调整成“you love I”。
【补充题目】
给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边。例如,如果把chas看作字符串“ABCDE”,size = 3,调整成“DEABC”。
【基本思路】
原问题。首先对整个数组逆序,然后遍历数组找到每一个单词,将每个单词里的字符进行逆序即可。
补充问题。
方法一。先把chas[0…size-1]部分逆序,再把chas[size…N-1]部分逆序,最后再将整体逆序即可。
方法二。举例说明,chas = “1234567ABCD”,size = 7。
- 将 “ABCD”与 “1234”整体进行交换,得到结果“ABCD5671234”。
- 保持 “ABCD”不动,将“567”和“234”整体进行交换,得到结果“ABCD2341567”。
- 保持“ABCD”“567”不动,将“1”与“2”进行替换,得到结果“ABCD1342567”。
- 将“2”与“3”交换,得到结果“ABCD1243567”。
- 将“3”与“4”交换,最终结果为“ABCD1234567”。
下面是用python3.5实现的代码。
#翻转字符串
#原问题
def rotateWord(chas):
def reverse(chas, start, end):
while start < end:
chas[start], chas[end] = chas[end], chas[start]
start += 1
end -= 1
if chas == None or len(chas) == 0:
return
reverse(chas, 0, len(chas)-1)
left = -1
right = -1
for i in range(len(chas)):
if chas[i] != ' ':
left = i if i == 0 or chas[i-1] == ' ' else left
right = i if i == len(chas)-1 or chas[i+1] == ' ' else right
if left != -1 and right != -1:
reverse(chas, left, right)
left = -1
right = -1
return chas
#补充问题
#方法一
def rotate2(chas, size):
def reverse(chas, start, end):
while start < end:
chas[start], chas[end] = chas[end], chas[start]
start += 1
end -= 1
if chas == None or len(chas) == 0 or size < 0:
return
reverse(chas, 0, size-1)
reverse(chas, size, len(chas)-1)
reverse(chas, 0, len(chas)-1)
return chas
#方法二
def rotate1(chas, size):
def exchange(chas, start, end, size):
i = end - size + 1
while size > 0:
chas[start], chas[i] = chas[i], chas[start]
start += 1
i += 1
size -= 1
if chas == None or len(chas) == 0 or size < 0:
return
start = 0
end = len(chas) - 1
lpart = size
rpart = len(chas) - size
s = min(lpart, rpart)
d = lpart - rpart
while True:
exchange(chas, start, end, s)
if d == 0:
break
elif d < 0:
rpart = -d
end -= s
else:
lpart = d
start += s
s = min(lpart, rpart)
d = lpart - rpart
return chas