剑指 Offer 58 - II:左旋转字符串

简介: 剑指 Offer 58 - II:左旋转字符串

题目

题目链接

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

解题

此题的方法和leetcode-189:旋转数组可以说是一模一样的,我们先是转换列表,然后再进行操作

方法一:pop和append

python写法

对列表直接进行pop和append时间复杂度会很高,所以使用了deque(双向队列),时间复杂度低

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        t = collections.deque(s)
        for _ in range(n):
            c = t.popleft()
            t.append(c)
        return "".join(t)

方法二:切片

python写法

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        return s[n:]+s[0:n]

c++写法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int l=s.size();
        return s.substr(n,l-n+1)+s.substr(0,n);
    }
};

不过面试可能会不让你使用切片

方法三:三次反转

python写法

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        def swap(l,r):
            while l<r:
                t[l],t[r]=t[r],t[l]
                l+=1
                r-=1
        t = list(s)
        swap(0,n-1)
        swap(n,len(s)-1)
        swap(0,len(s)-1)
        return "".join(t)

c++写法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;
    }
};

java写法

class Solution {
    void reverse(char[] str,int l,int r){
        for(int i=l,j=r;i<j;i++,j--){
            char tmp=str[i];
            str[i]=str[j];
            str[j]=tmp;
        }
    }
    public String reverseLeftWords(String s, int n) {
        int len=s.length();
        char[] str=s.toCharArray();
        reverse(str,0,n-1);
        reverse(str,n,len-1);
        reverse(str,0,len-1);
        return String.valueOf(str);
    }
}

方法四:rotate方法

python写法

rotate中参数为正的代表向右旋转,负的代表向左旋转

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        t = collections.deque(s)
        t.rotate(-n)
        return "".join(t)

c++写法

c++中的rotate是默认向左旋转的

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        rotate(s.begin(),s.begin()+n,s.end());
        return s;
    }
};

如果想要右旋转,可以向左旋转s.size()-n

方法五:拼接

字符串的拼接与旋转有一个挺好的办法 就是将字符串倍增成为两个同样的字符串拼接的长字符串

然后想旋转均可

c++写法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int len = s.size();
        s += s;
        return s.substr(n,len);
    }
};

再精简点

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        s += s;
        return s.substr(n,s.size()/2);
    }
};

java写法

class Solution {
    public String reverseLeftWords(String s, int n) {
        int l=s.length();
        return s.substring(n,l)+s.substring(0,n);
    }
}


相关文章
|
6月前
|
Java C++ Python
剑指 Offer 05:替换空格
剑指 Offer 05:替换空格
41 0
|
2月前
|
C语言 C++
剑指 Offer(第 2 版)刷题 | 05. 替换空格
本文是作者在刷《剑指 Offer(第 2 版)》时对 "替换空格" 问题的解法分享,包括正确处理字符串中空格替换为"%20"的解法以及未刷题小白可能会犯的错误,同时记录了在解决过程中遇到的运行时错误。
剑指 Offer(第 2 版)刷题 | 05. 替换空格
【LeetCode】剑指 Offer(22)
【LeetCode】剑指 Offer(22)
70 0
|
6月前
剑指 Offer 10- II:青蛙跳台阶问题
剑指 Offer 10- II:青蛙跳台阶问题
47 1
|
6月前
剑指 Offer 49:丑数
剑指 Offer 49:丑数
35 0
|
6月前
剑指 Offer 07:重建二叉树
剑指 Offer 07:重建二叉树
32 0
【LeetCode】剑指 Offer(23)
【LeetCode】剑指 Offer(23)
88 0
【LeetCode】剑指 Offer(9)
【LeetCode】剑指 Offer(9)
54 0
|
C++ 容器
剑指 Offer 58 - II. 左旋转字符串(3种方法)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
65 0