代码随想录算法训练营第八天

84 阅读1分钟

344.反转字符串

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left=0;right=len(s)-1
        while left<=right:
            s[left],s[right]=s[right],s[left]
            left+=1
            right-=1
        return s

541.反转字符串

本题解决的关键在于要将操作放在整个切片上去移动,如果单纯按照题干的要求,可能会陷入逻辑陷阱中

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        n=len(s);cnt=0
        for i in range(n):
            def reverse_substring(text):
                left=0;right=len(text)-1
                while left<=right:
                    text[left],text[right]=text[right],text[left]
                    left+=1
                    right-=1
                return text
        res=list(s)
        for i in range(0,len(s),2*k):
            res[i:i+k]=reverse_substring(res[i:i+k])
        return "".join(res)

替换数字

数组填充类问题,典型做法都是先给数组扩容成填充后的大小,再从后向前进行操作。这样做的好处是:避免了从前往后填充数组时,每次都需要将填充之后的元素向后移动的问题。

大概的想法:先搞一个新的列表,长度为扩容后的列表的长度。然后得到老的列表的长度和新的列表的长度的索引。然后从后往前去判断老的位置的索引是否是数字,是的话将新的列表的对应位置的值填写成"number"字符。否则就将老的列表对应位置的值赋给新的列表。

def subsitute(s):
    count=sum(1 for char in s if char.isdigit())
    expand_len=len(s)+count*5
    res=['']*expand_len
    old_index=len(s)-1;new_index=expand_len-1
    while old_index >= 0:
        if s[old_index].isdigit():
            res[new_index-5:new_index+1]="number"
            new_index-=6
        else:
            res[new_index]=s[old_index]
            new_index-=1
        old_index-=1

    return "".join(res)

while True:
    try:
        s=input()
        result=subsitute(s)
        print(result)
    except EOFError:
        break