代码随想录算法训练营第八天 | Python | LeetCode344.反转字符串、LeetCode541.反转字符串II、卡码网54.替换数字

LeetCode 344. 反转字符串

题目:https://leetcode.cn/problems/reverse-string/description/
解析:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

看到原地就想到双指针。

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

其他:

  1. 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低
  2. 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用range
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(n // 2):
            s[i], s[n-i-1] = s[n-i-1], s[i]

LeetCode 541. 反转字符串II

题目:https://leetcode.cn/problems/reverse-string-ii/
解析:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

注1:如何切片?

  1. range(0, (2*k)*n, 2*k)还是range(0, (2*k+1)*n, 2*k)0是起点,(2*k)*n是长度,不需要+1
  2. elf.reverse(s[i:i+k])还是elf.reverse(s[i:i+k+1])i是起点,k是长度,不需要+1

注2:字符串时不可变的,在处理字符串时不要直接修改其值,即,不可以s[0]='l'

注3: 最终list的形式是['a', 'b', 'c', 'd', 'e', 'f', 'g'],不能直接str(s),而是应该''.join(s).

class Solution:
    def reverse(self, s):
        left, right = 0, len(s)-1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return s
    def reverseStr(self, s: str, k: int) -> str:
        s = list(s)
        l = len(s)
        n = l//(2*k) + 1
        for i in range(0, (2*k)*n, 2*k):
            s[i:i+k] = self.reverse(s[i:i+k])
        return ''.join(s)

卡码网 54. 替换数字

题目:https://kamacoder.com/problempage.php?pid=1064
链接:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html

ACM模式

卡码网使用acm模式

【来自ChatGPT】
在编程竞赛中,ACM 模式通常指的是通过标准输入读取数据。在这种情况下,我们通常会使用 Python 的 input() 函数来读取输入,或者在一些更复杂的竞赛平台上,可能需要使用 sys.stdin.read() 来读取多行输入。

在 ACM 模式中,您可能会遇到如下输入格式:

例如,输入数据如下:

2
a1b2c3
d4e5f6

这里的第一行表示接下来将有多少行数据。接下来的每一行都是我们需要处理的字符串。

示例代码:从标准输入读取数据

以下是一个示例代码,展示如何在 ACM 模式下读取数据并处理它:

import sys

# 从标准输入读取第一行,表示接下来有多少行数据
n = int(input().strip())

for _ in range(n):
    input_str = input().strip()  # 读取每一行输入
    letters = []
    numbers = []

    for char in input_str:
        if char.isalpha():  # 如果是字母
            letters.append(char)
        elif char.isdigit():  # 如果是数字
            numbers.append(char)

    # 将字符列表转换为字符串
    letters_str = ''.join(letters)
    numbers_str = ''.join(numbers)

    print("Letters:", letters_str)  # 输出字母部分
    print("Numbers:", numbers_str)   # 输出数字部分

示例输入输出

假设输入为:

2
a1b2c3
d4e5f6

程序会输出:

Letters: abc
Numbers: 123
Letters: def
Numbers: 456

其他读取方式

如果输入数据非常多,或者您希望一次性读取所有数据,可以使用 sys.stdin.read() 方法:

import sys

# 读取所有输入
input_data = sys.stdin.read().strip().splitlines()
n = int(input_data[0])  # 第一行是行数

for i in range(1, n + 1):
    input_str = input_data[i]  # 读取每一行输入
    # 处理逻辑与上面相同

对于input_data = sys.stdin.read().strip().splitlines()
sys.stdin.read():读入str
sys.stdin.read().strip():去除两端空格
sys.stdin.read().strip().splitlines():按行分开

解题

import sys

s = sys.stdin.read().strip()#只有一行
res = ""
for i in s:
    if i.isalpha():
        res += i
    else:
        res += 'number'
print(res)

原解析里面用的是c++,提供了不额外占用空间的办法,但python中字符串是不可变的,不能采用这种方法。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值