给定一个长度为 n 的字符串,将其向右循环移动 k 位,求循环移动之后的字符串。

示例 1

输入:s="abcdefg", k=3
输出:"efgabcd"

示例 2

输入:s="abcdefg", k=13
输出:"bcdefga"

数据范围
n 、k 均为32位整型数,且都大于 0

我个人想到了2种实现方式,不是最优解,其中的k%n是抛开重复移动的次数实际需要移动的次数

public class HelloWorld {
    public static void main(String []args) {
       System.out.println(rotate("abcdefg",3));
       System.out.println(rotate("abcdefg",13));
	   System.out.println(rotate2("abcdefg",3));
       System.out.println(rotate2("abcdefg",13));
    }
	
    //嵌套for循环的实现,外层是需要整体移动的次数,内层是字符整体移动1次
    public static String rotate(String s, int k) {
        int n = s.length();
        char[] sChar = s.toCharArray();
        for(int i=0;i<k%n;i++){
            char newData = sChar[n-1];
            char tmp = ' ';
            for(int j=0;j<n;j++){
                tmp = sChar[j];
                sChar[j] = newData;
                newData = tmp;
            }
        }
        s = new String(sChar);
        return s;
    }
    //1次for循环,新创建了1个数组
    public static String rotate2(String s, int k) {
        int n = s.length();
        char[] sChar = s.toCharArray();
        int move = k%n;
        char[] sChar2 = new char[n];
        for(int i=0;i<n;i++){
            sChar2[(i+move)%n] = sChar[i];
        }
        s = new String(sChar2);
        return s;
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注