给定一个长度为 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;
}
}