17164字符迁移
17164字符迁移
⭐️难度:中等
📖
📚
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int q = scanner.nextInt();
scanner.nextLine(); // 清除行末的换行符
String str = scanner.nextLine();
char[] a = str.toCharArray();
// 将字符串转换成数字 a -> 0,b -> 1
int[] b = new int[n];
for (int i = 0; i < n; i++) {
b[i] = a[i] - 'a';
}
// 差分数组
int[] diff = new int[n + 1];
// 处理每次操作
for (int i = 0; i < q; i++) {
int l = scanner.nextInt();
int r = scanner.nextInt();
int k = scanner.nextInt();
l--;r--; // 转换成 0 基索引
k %= 26;
diff[l] += k;
diff[r + 1] -= k;
}
// 应用差分数组
int sum = 0; // 求前缀和
for (int i = 0; i < n; i++) {
sum += diff[i];
// 计算最终的移位数,确保结果在 [0, 25] 范围内
int sum2 = (sum + b[i]) % 26;
// 重新转换回字符串
b[i] = sum2;
}
for (int i = 0; i < n; i++) {
System.out.print((char)(b[i] + 'a'));
}
scanner.close();
}
}
⭕️
- k有可能很大,要对26取余。
k %= 26;
- 计算最终的移位数,确保结果在 [0, 25] 范围内
int sum2 = (sum + b[i]) % 26;