day 8 |344. 反转字符串 541. 反转字符串 II 54. 替换数字 151. 反转字符串中的单词 55. 右旋字符串

344. 反转字符串

题目:

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

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

思路:开始想到的是双指针,小细节写错了又看到可以用s.reverse()解决。这题比较简单,直接换位置就能完成。

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

时间复杂度:O(1)

541. 反转字符串 II

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

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

思路:

  • s[:p]:表示从字符串 s 的开头到索引 p 之前的部分,即不包括索引 p 处的字符。
  • s[p:p2]:表示从索引 p 到索引 p2 之间的部分,即包括索引 p 处的字符,但不包括索引 p2 处的字符。
  • s[p:p2][::-1]:对切片得到的部分进行反转操作,即将这一部分的字符顺序颠倒。
  • s[p2:]:表示从索引 p2 开始到字符串 s 的末尾的部分,包括索引 p2 处的字符。
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        p=0
        while p <len(s):
            p1=p+k
            s=s[:p]+s[p:p1][::-1]+s[p1:]
            p+=2*k
        return s

2.把字符串s转化为一个列表。从0到n,步长为2*k,反转i到i+k,连接起来形成新的字符串。

return "".join(t)的意思是列表t中存储了经过处理后的字符串s,将列表t中的元素连接成一个字符串并返回

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        t=list(s)
        n=len(s)
        for i in range(0,n,2*k):
            t[i:i+k]=reversed(t[i:i+k])
        return "".join(t)

54. 替换数字

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

思路:定义一个新字符串,遍历字符串s,如果是数字,则在空字符串中添加number,否则填入字符

class Solution:
    def switch(self, s: str) -> str:
        res=""
        for i in s:
            if i.isdigit():
                res+='number'
            else:
                res+=i
        return res
a=input()
sol=Solution()
print(sol.switch(a))


#笨办法
if res[i] in ['1','2','3','4','5','6','7','8','9']:
                res[i]='number'

151. 反转字符串中的单词

题目:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

思路:先把字符串变成一串无空格的字符串,直接翻转。split()函数用于分割。第二个代码是比较容易想出来的。

class Solution:
    def reverseWords(self, s: str) -> str:
        #清空空格
        s=s.strip()
        #翻转字符串
        s=s[::-1]
        s=" ".join(i[::-1] for i in s.split())
        return s
class Solution:
    def reverseWords(self, s: str) -> str:
        nums=s.split()
        left=0
        right=len(nums)-1
        while left<right:
            nums[left],nums[right]=nums[right],nums[left]
            left+=1
            right-=1
        return " ".join(nums)

55. 右旋字符串

题目:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

思路:假设字符串长度为 n,当 k 大于 n 时,右旋转 k 个字符实际上等价于右旋转 k % n 个字符。因此,我们对 k 进行取模运算,可以确保 k 的值在 [0, n-1] 的范围内,从而保证右旋转操作的正确性。取模运算。

class Solution:
    def rightRotate(self,s,k):
        if not s or k <= 0:
            return s
        
        n = len(s)
        k = k % n  # 处理k大于字符串长度的情况
        
        return s[-k:] + s[:-k]

# 测试
s = "abcdefg"
k = 2
solution = Solution()
result = solution.rightRotate(s, k)
print(result) 

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值