刷刷刷Day8| 剑指 Offer 58 - II. 左旋转字符串

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

LeetCode题目要求

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

示例

输入: s = "abcdefg", k = 2
输出: "cdefgab"
解题思路

// 原串 abcdefg 根据给定的数字 2,转为 cdefgab,即将前两个字符 ab 追加到 cdefg 后面
// 1、可以通过 将 abcdefg 先反转成 gfedcba;
// 2、然后再根据数字 2, 其实是从后面开始把串拆分成两个子串,gfedc ba
// 3、接着再把两个分别反转尾 cdefg 和 ab,拼接两个子串就是所要的结果了

如下图:

图

上代码

class Solution {

    public String reverseLeftWords(String s, int n) {
        // 解题思路
        // 原串 abcdefg 根据给定的数字 2,转为 cdefgab,即将前两个字符 ab 追加到 cdefg 后面
        // 1、可以通过 将 abcdefg 先反转成 gfedcba;
        // 2、然后再根据数字 2, 其实是从后面开始把串拆分成两个子串,gfedc ba
        // 3、接着再把两个分别反转尾 cdefg 和 ab,拼接两个子串就是所要的结果了

        // 1. 反转整串
        String rs = reverse(s);
        // 2. 根据 n 的值拆分串
        int len = s.length();
        String s1 = rs.substring(0, len - n);
        s1 = reverse(s1);
        
        String s2 = rs.substring(len-n, len);
        s2 = reverse(s2);

        return s1+s2;
    }

    public String reverse(String s) {
        char[] cs = s.toCharArray();
        int left = 0;
        int right = cs.length - 1;
        while (left < right) {
            char t = cs[left];
            cs[left] = cs[right];
            cs[right] = t;
            left++;
            right--;
        }
        return new String(cs);
    }
}
重难点

本题写起来并不难,只是比较难想到怎么旋转,通过什么方法做反转。重点是在于字符的反转

附:学习资料链接

posted @ 2023-01-09 19:24  blacksonny  阅读(15)  评论(0编辑  收藏  举报