算法学习 Day07 字符串1

100 阅读2分钟

344. 反转字符串

文章讲解

视频讲解

题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

解题思路

反转数组是对称的操作,直接使用双指针相向而行,两两交换直到到达中点。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        if len(s)<=1:
            return s
        
        low, high = 0, len(s)-1
        while low<high:
            # 交换元素
            s[low], s[high] = s[high], s[low] 
            low += 1
            high -= 1

        # return s  # return None

总结

注意循环条件是low<high,如果奇数时low=high到中点不需要再反转了。

541. 反转字符串 II

文章讲解

视频讲解

题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

解题思路

分组处理,每次处理2k个子串,其中前k个用双指针进行原地交换。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        ''' 2k个一组进行处理,每组的前k个反转 '''
        sz = len(s)
        results = []
        for i in range(0, sz, 2*k):
            chunk = s[i:i+2*k]
            if len(chunk) < k:
                # 直接反转
                results.append(self.reverse(chunk))
            else:
                # 反转前k个
                results.append(self.reverse(chunk[:k]))
                results.append(chunk[k:])
        return "".join(results)


    def reverse(self, s: str) -> None:
        ''' 原地反转字符串 '''
        if len(s)<=1:
            return s
        
        chars = list(s)
        low, high = 0, len(s)-1
        while low<high:
            tmp = chars[low]
            chars[low] = chars[high]
            chars[high] = tmp
            low += 1
            high -= 1

        return "".join(chars)

总结

需要特别注意字符串长度可能不是 2k 的情况,以避免越界错误。

54. 替换数字(第八期模拟笔试)

文章讲解

题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

解题思路

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
import sys


ipt = sys.stdin.read().strip()

# res = []
# for c in ipt:
#     if c.isdigit():
#         res.append("number")
#     else:
#         res.append(c)

res = list(ipt)
for i in range(len(res)):
    if res[i].isdigit():
        res[i] = "number"
        

print("".join(res))

总结

额,没啥好说的,直接遍历吧~