跳至主要內容

58(2)-左旋字符串

daipeng大约 1 分钟

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

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

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

限制:

  • 1 <= k < s.length <= 10000

第一种

最简单的使用substring方法。首先截取字符串的前n个字符,然后拼接到剩余字符后面即可。

public  String reverseLeftWords2(String s, int n) {
        String right = s.substring(0, n - 1);
        String left = s.substring(n);
        return left + right;
}

第二种

对于输入: s = "abcdefg", k = 2,我们可以通过三次翻转来解决。

将字符串看成是两部分,第一部分是[0,n)的部分,剩余是[n,字符串末尾]的部分。

  • 将第一部分ab翻转,得到bacdefg

  • 将第二部分cdefg翻转,得到bagfedc

  • 将整体进行翻转,得到cdefgab

class Solution {
  public String reverseLeftWords(String s, int n) {
    // 提前进行判空操作
        if(s == null || s.length() == 0){
            return s;
        }
        char[] chs = s.toCharArray();
        reverseLeftWordsCore(chs,0,n-1);
        reverseLeftWordsCore(chs, n, chs.length - 1);
        reverseLeftWordsCore(chs, 0, chs.length - 1);
        return String.valueOf(chs);
    }
    public void reverseLeftWordsCore(char[] chs,int start,int end){
        for (int i = start,j = end; i <= j; i++,j--) {
            char tmp = chs[i];
            chs[i] = chs[j];
            chs[j] = tmp;
        }
    }

}

这里要注意到字符串的不可变性,需要将字符串先变成char数组,然后最后再转成字符串。