剑指Offer 58.翻转字符串(Python)

目录

翻转单词顺序
左旋转字符串


翻转单词顺序

输入一个英文橘子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
样例:

输入:"I am a student."
输出:"student. a am I"

解题思路

split / join

利用内置方法可以一行写完,除了体现python的强大以外,毫无用处。

class Solution:
    def ReverseSentence(self, s):
        # write code here
        return ' '.join(s.split(' ')[::-1])

两次翻转
  • 先翻转整个句子,得到“.tneduts a ma I”;
  • 然后在逐个翻转单词,得到“student. a am I”.
class Solution(object):
	# 定义翻转函数
    def reverse(self, s, start, end):
        if not s or start < 0 or end >= len(s): return ''
        
        while start < end:
            s[start], s[end] = s[end], s[start]
            start += 1
            end -= 1
        
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s: return ''
        
        # str在python中是不可变类型,要转换为list
        s = list(s)
        self.reverse(s, 0, len(s)-1)
        
        start, end = 0, 0
        while start < len(s) and end < len(s):
        	# 遇到空格
            if s[end] == ' ' :
                self.reverse(s, start, end-1)
                start = end + 1
            # 到字符串结尾
            if end == len(s)-1:
                self.reverse(s, start, end)
            end += 1
            
        return ''.join(s)

左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
样例:

输入:字符串“abcdefg”和数字2
输出:左旋转两位的结果“cdefgab”

解题思路

字符切片

看到这题的第一想法就是用切片,Python对字符串的处理真的太强了。

class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        return s[n:] + s[:n] if s else ""

三次翻转

参考上一题的思路:

  • 先对前面部分进行翻转,得到"bacdefg";
  • 再对后面部分进行翻转,得到"bagfedc";
  • 先对整个字符进行翻转,得到"cdefgab".
class Solution:
    def reverse(self, s, start, end): 
        if not s or start < 0 or end >= len(s): return

        while start < end:
            s[start], s[end] = s[end], s[start]
            start += 1
            end -= 1
                
    def LeftRotateString(self, s, n):
        # write code here
            
        if not s or n < 0 : return ""
        if n >= len(s):
            n = n % len(s)
            
        s = list(s)
        self.reverse(s, 0, n-1)
        self.reverse(s, n, len(s)-1)
        self.reverse(s, 0, len(s)-1)
        return ''.join(s)

你可能感兴趣的:(剑指Offer)