Java——左旋转字符串

题目链接

牛客在线oj题——左旋转字符串

题目描述

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

数据范围:输入的字符串长度满足 0≤len≤100 , 0≤n≤100
进阶:空间复杂度 O(n) ,时间复杂度 O(n)

题目示例

示例1

输入:
“abcXYZdef”,3

返回值:
“XYZdefabc”

示例2

输入:
“aab”,10
复制
返回值:
“aba”

思路一

按照题目将字符串转为字符数组,然后将最左侧字符保存起来,将其他字符左移,然后再将刚才的字符放到最右侧,即可完成一次左旋转字符串,循环进行n次即可左移n位

需要注意的是,如果n为0则直接返回该字符串,如果n大于str的长度,那么需要将 n %= str.length()

方法一代码

public class Solution {
    
    
    public String LeftRotateString(String str,int n) {
    
    
        if(str.length() == 0 || n == 0){
    
    
            return str;
        }
        n %= str.length();
        char[] chars = str.toCharArray();
        while(n != 0){
    
    
            LeftRotate(chars);
            n--;
        }
        return new String(chars);
    }

    private void LeftRotate(char[] chars) {
    
    
        char ch = chars[0];
        for(int i = 0; i < chars.length - 1; i++){
    
    
            chars[i] = chars[i + 1];
        }
        chars[chars.length - 1] = ch;
    }
}

思路二

如果需要循环左移n位,那么可以先将str的左侧n位进行逆置,再将右侧的str.length() - n位进行逆置,最后将整个str逆置即可得到正确答案

例如:
在这里插入图片描述

方法二完整代码

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

        n %= str.length();
        char[] list = str.toCharArray();
        reverse(list, 0, n - 1);
        reverse(list, n, str.length() - 1);
        reverse(list, 0, str.length() - 1);
        return new String(list);
    }

    private void reverse(char[] list, int start, int end) {
    
    
        while(start < end){
    
    
            char tmp = list[start];
            list[start] = list[end];
            list[end] = tmp;
            start++;
            end--;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_60867520/article/details/130494870