首页 > 技术文章 > 剑指43.左旋转字符串

HuangYJ 2020-08-26 11:22 原文

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
 

思路

思路1:字符串翻转的应用。左旋转可以看成是字符串翻转两次,例子——输入字符串abcdefg,左移2位

           第一次翻转整个字符串,让每个子序列处于合适的位置;例如,abcdefg → gfedcba

           第二次翻转两个子序列,消除第一次翻转对每个子序列内部位置的影响。例如上一步得到gfedcba,对两个子序列分别翻转,gfedc→cdefg、ba→ab,再合并起来 cdefgab。

Note:这两次翻转也可以调换顺序,第一次分别翻转两个子序列,得到bagfedc;第二次翻转整个字符串得到cdefgab。

 

思路2:截取字符串。

注意:本题的边界条件!!n 可能 大于字符串的长度,因此稳妥起见传入的 n 先做 n = n % str.length();
 

解法1.1(手写reverse())

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str == null || str.length() ==0 || n <= 0) // 最全的边界条件
            return str;
        n = n % str.length();
        char[] chars = str.toCharArray();
        // 第一种翻转顺序
        reverse(chars,0,n-1);
        reverse(chars,n,str.length()-1);
        reverse(chars,0,str.length()-1);
        // 第二种翻转顺序
        /*reverse(chars,0,str.length()-1);
        reverse(chars,0,str.length()-n-1);
        reverse(chars,str.length()-n,str.length()-1);*/
        return String.valueOf(chars);
    }
    private void reverse(char[] chars, int start, int end){
        while (start < end){
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            start++;
            end--;
        }
    }
}

解法1.2(调用reverse())

public class Solution {
// 版本1:先对整个字符串翻转,再分别翻转两个子字符串
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0)
            return "";
        n = n % str.length();
        StringBuilder flipStr = new StringBuilder(str).reverse();// 第一次对整个字符串进行翻转
        String str1 = flipStr.substring(0,str.length() - n); //左闭右开
        String str2 = flipStr.substring(str.length() - n);   //默认到字符串最后
        return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).toString(); // 第二次分别翻转
    }
    // 版本2:先分别翻转两个子字符串,再对整个字符串翻转
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0)
            return "";
        n = n % str.length();
        String str1 = str.substring(0,n);
        String str2 = str.substring(n);
        return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).reverse().toString();
    }
}

 

解法2

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0)
            return "";
        n = n % str.length();
        return str.substring(n) + str.substring(0,n);
    }
}

 

自己写的弱鸡添加法

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str.length() == 0)
            return str;
        StringBuilder sb = new StringBuilder();
        for (int i = n; i < str.length(); i++)
            sb.append(str.charAt(i));
        for (int i = 0; i < n; i++)
            sb.append(str.charAt(i));
        return sb.toString();
    }
}

 

 

推荐阅读