アプローチ
この問題は、文字列操作に関する基本的な問題です。Javaでは新しいメモリ空間を確保せざるを得ないため、元の文字列上での操作よりも簡単になる可能性があります。
コード例
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
scanner.nextLine(); // 改行を読み飛ばす
String str = scanner.nextLine();
System.out.println(rotateRight(str, k));
}
public static String rotateRight(String str, int k) {
StringBuilder sb = new StringBuilder(str);
int len = str.length();
k = k % len; // 回転数が文字列長を超える場合に備えて調整
sb.insert(0, sb.substring(len - k, len));
sb.delete(len, len + k);
return sb.toString();
}
}
さらなる最適化
以下に示すのは、より効率的なアプローチです。これは文字列を3回反転することで目的の結果を達成します。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
String s = scanner.nextLine();
char[] chars = s.toCharArray();
int len = chars.length;
reverse(chars, 0, len - 1); // 全体を反転
reverse(chars, 0, n - 1); // 前半部分を反転
reverse(chars, n, len - 1); // 後半部分を反転
System.out.println(new String(chars));
}
private static void reverse(char[] ch, int start, int end) {
while (start < end) {
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
}
また、以下の方法も同様に有効です。こちらでも全体と部分の反転を組み合わせて目的の結果を達成します。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
String s = scanner.nextLine();
char[] chars = s.toCharArray();
int len = chars.length;
reverse(chars, 0, len - n - 1); // 前半部分を反転
reverse(chars, len - n, len - 1); // 後半部分を反転
reverse(chars, 0, len - 1); // 全体を反転
System.out.println(new String(chars));
}
private static void reverse(char[] ch, int start, int end) {
while (start < end) {
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
}