代码随想录算法训练营第8天 | 344.反转字符串 | 541. 反转字符串II | 卡码网:54.替换数字 | 151.翻转字符串里的单词 | 卡码网:55.右旋转字符串

本文介绍了四种与字符串相关的编程问题:使用双指针法反转字符串、将数字替换为number、翻转单词顺序以及右旋转字符串。提供了Python代码示例,展示了如何在实际场景中应用这些技术。
摘要由CSDN通过智能技术生成

344.反转字符串

  • 思路:采用双指针不断交换收尾字符直至收尾指针相遇。
  • 代码:
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        head, tail = 0, len(s)-1
        while head < tail:
            tmp = s[head]
            s[head] = s[tail]
            s[tail] = tmp
            head += 1
            tail -= 1
        return s

 541. 反转字符串II

  • 思路:

        内核和344反转字符串一样,重点在于如何找到待反转的s_list。

  • 找反转s_list的思路:

        1)s是str不能直接进行翻转操作,需要将其转化为list;

        2)每遍历2k次时,left和right的变化列表可得:        

         3)当i以2k的步长从0到n,此时翻转的那部分数组的左下标为i,右下标为i + k - 1,将这部分数组放入翻转数组的函数中处理即可。值得注意的是,right的最大值为n-1,因此可以用min(i +k -1, n - 1)作为右下标;当右下标取n - 1时,i = n - k,即完成最后一次的翻转,循环结束。

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

 卡码网:54.替换数字

卡码网均为ACM模式(不是leetcode上面那种核心代码模式)

1)实例化对象 sol = Solution()

2)设定输入值 s = input()

3)调用实例并输出结果 res = sol.replaceNumber(s)  print(s)

注意:最后的结果是打印出来的。

class Solution:
    def replaceNumber(self, s):
        l = list(s)
        n = len(l)
        for i in range(n):
            if l[i] in ['1','2','3','4','5','6','7','8','9']:
                l[i] = 'number'
        return ''.join(l)
        
sol=Solution()
s=input()
result=sol.replaceNumber(s)
print(result)

 151.翻转字符串里的单词

  • 思路:去除字符串里面多余的空格,反转字符。
  • 注意:split只能去除单词之间多余的空格,不能去除收尾空格,因此收尾空格用strip()去除。
  • 注意:split空格中不需要输入任何参数。
class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()
        s_list = s.split() 
        
        l, r = 0, len(s_list) - 1
        while l < r:
            s_list[l], s_list[r] = s_list[r], s_list[l]
            l += 1
            r -= 1
        return ' '.join(s_list)

卡码网:55.右旋转字符串

  • 思路1:先将s翻转,随后将s切片为s1和s2, s1和s2执行“反转字符串”,拼接s1和s2。
k = int(input())
s = input()
l = list()

def reverseStr(s):
    s_list = list(s)
    l, r = 0, len(s_list)-1
    while l < r:
        s_list[l],s_list[r] = s_list[r],s_list[l]
        l += 1
        r -= 1
    return ''.join(s_list)
                
s = s[::-1]
s1 = s[:k]
s2 = s[k:]
s1 = reverseStr(s1)
s2 = reverseStr(s2)
        
s = s1 + s2
print(s)
  • 思路2:直接用切片拼接。 
k = int(input())  # 输入数字
s = input() # 输入字符串

length = len(s)
s = s[length-k:] + s[:length-k] # 右旋

print(s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值