【剑指Offer1】左旋转字符串

题目:

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

比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

 

思路:

之前有做过类似的题目,当时是int数组的右移,和字符串的左旋是一样的

先全部翻转,之后分别对左右部分翻转,即可做到旋转数组的效果

代码如下:

class Solution {
    public String reverseLeftWords(String s, int n) {
        n = n % s.length();
        char[] cArray = s.toCharArray();
        // reverse all
        reverse(cArray, 0, s.length() - 1);
        // reverse left
        reverse(cArray, 0, s.length() - n -1);
        // reverse right
        reverse(cArray, s.length() - n, s.length() - 1);
        return String.valueOf(cArray);
    }

    public void reverse(char[] cArray, int start, int end) {
        while (start < end) {
            char c = cArray[start];
            cArray[start++] = cArray[end];
            cArray[end--] = c;
        }
    }
}

 

总结:

提交一看效率不咋地,看了效率比较高的代码,属实是把自己学进去了

不多说,代码如下:

class Solution {
    public String reverseLeftWords(String s, int n) {
        if (s.length() == 0) {
            return s;
        } else {
            String str1 = s.substring(0,n);
            String str2 = s.substring(n);
            String newstr = str2 + str1;
            return newstr;
        }   
    }
}

首先,题目说了限制:1 <= k < s.length <= 10000,所以跟本不需要处理取余;

其次,之前是int数组,所以截取数组比较麻烦,而这里是字符串,本身有截取函数,代码更加简洁(*但是空间还是浪费了);

之前硬生生凹出三种解法,还要学会选出最优解才行

posted @ 2022-01-09 01:51  ProbablyTrue  阅读(30)  评论(0编辑  收藏  举报