字符串问题---翻转字符串

【题目】

  给定一个字符类型的数组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。

  1. 将 “ABCD”与 “1234”整体进行交换,得到结果“ABCD5671234”。
  2. 保持 “ABCD”不动,将“567”和“234”整体进行交换,得到结果“ABCD2341567”。
  3. 保持“ABCD”“567”不动,将“1”与“2”进行替换,得到结果“ABCD1342567”。
  4. 将“2”与“3”交换,得到结果“ABCD1243567”。
  5. 将“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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值