LintCode算法刷题之旋转字符串

链接:旋转字符串

描述

给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)

样例

样例 1:
输入: str="abcdefg", offset = 3
输出: "efgabcd"
样例解释:
返回旋转后的字符串。

样例 2:
输入: str="abcdefg", offset = 0
输出: "abcdefg"
样例解释:
返回旋转后的字符串

样例 3:
输入: str="abcdefg", offset = 1
输出: "gabcdef"
样例解释:
返回旋转后的字符串

样例 4:
输入: str="abcdefg", offset =2
输出:"fgabcde"
样例解释:
返回旋转后的字符串

挑战

在数组上原地旋转,使用O(1)的额外空间

算法思路

这个过程实际上是将最后一个元素放到第一个位置上的过程,偏移量是几,就移动几次
1.将最后一个元素临时保存
2.从倒数第二个元素开始,往后串一个位置
3.将临时保存的元素放置在第一个位置
当偏移量大于数组长度时,是周期的操作,我们做取模运算,减少无谓的操作次数

所以我们需要重复以上步骤,共N次,N = offset % str.length

代码

 public static void rotationStr(char[] str, int offset) {

        if (str == null || str.length == 0 || offset == 0) {
            return;
        }

        char tempChar;
        int len = str.length;

        for (int i = 0; i < offset % len; i++) {

            //将最后一个元素临时保存下来,之后放在开头
            tempChar = str[len - 1];

            //集体往后串一位
            //由于要将最后一个元素临时保存下来,我们需要从后面开始
            int j = len - 2;
            while (j >= 0) {
                str[j + 1] = str[j];
                j--;
            }

            //将临时保存的元素放在开头
            str[0] = tempChar;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章