题目地址(58 - II. 左旋转字符串)

https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

题目描述

  1. 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
  2. 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"
  3. 示例 1
  4. 输入: s = "abcdefg", k = 2
  5. 输出: "cdefgab"
  6. 示例 2
  7. 输入: s = "lrloseumgh", k = 6
  8. 输出: "umghlrlose"

前置知识


公司

  • 暂无

思路

  • 方法1

最简单的方法是拼接字符串 见方法1 这也是时间复杂度最低的方法

  • 方法2

如果题目不让使用拼接字符串的方法就先创建一个sb
然后将字符串 n->s.length的位置的字符添加到sb中
然后再将0->n的字符添加到sb中

  • 方法3

如果题目限定不让创建多余空间 就使用方法3
将0->n的字符翻转
再将n->s.length的位置翻转
然后将整个字符串翻转 就得到了结果

关键点


代码

  • 语言支持:Java

Java Code:

  1. //方法1
  2. class Solution {
  3. public String reverseLeftWords(String s, int n) {
  4. return s.substring(n, s.length()) + s.substring(0, n);
  5. }
  6. }
  7. //方法2
  8. class Solution {
  9. public String reverseLeftWords(String s, int n) {
  10. StringBuilder result = new StringBuilder();
  11. for (int i = n; i < s.length(); i++) {
  12. result.append(s.charAt(i));
  13. }
  14. for (int i = 0; i < n; i++) {
  15. result.append(s.charAt(i));
  16. }
  17. return result.toString();
  18. }
  19. }
  20. //方法3
  21. class Solution {
  22. public String reverseLeftWords(String s, int n) {
  23. int len=s.length();
  24. StringBuilder sb=new StringBuilder(s);
  25. reverseString(sb,0,n-1);
  26. reverseString(sb,n,len-1);
  27. return sb.reverse().toString();
  28. }
  29. public void reverseString(StringBuilder sb, int start, int end) {
  30. while (start < end) {
  31. char temp = sb.charAt(start);
  32. sb.setCharAt(start, sb.charAt(end));
  33. sb.setCharAt(end, temp);
  34. start++;
  35. end--;
  36. }
  37. }
  38. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:剑指58. 左旋转字符串 - 图1#card=math&code=O%28n%29&id=VM3Cp)
  • 空间复杂度:剑指58. 左旋转字符串 - 图2#card=math&code=O%28n%29&id=Xvx3A)