是记录学习过程,会有错误
题目链接
思路
实现算法选择
我看了题目后,发现是对区间[l,r]中的字符执行操作,由于我目前学到和区间相关的算法有如下所示
- 前缀和,解决区间求和的
- 差分,解决区间操作,对区间中的内容会有修改,例如加减 那么选择差分,我这里有点疑惑,疑惑点(差分可以对区间加减,求和是加,那么是否可以用差分来完成前缀和呢?我学的比较菜哈)
题意关键
这里需要实现一个类似于循环的样子,即a->b, b->c,...,y->z,z->a,思路如下:
循环的话可以想到%运算符,我直接将a映射到0,z映射到25,每次对字符c进行m次加,就等同于 (c+m)%26 这样就可以实现了
代码
import java.util.*;
public class Main {
static char addNumber(char c,long m){
long rank = c-'a';//若c是'a'那么rank直接就是0,我第一次写的时候rank用来表示字符c是26个字母的第几个字母,范围是[0,25]
rank = (rank+m)%26; // 这个就是上面提到的题意关键了
return (char)('a'+rank);// 所有字符都看做基准值('a')加上偏移量
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int len = s.nextInt();
int cnt = s.nextInt();
char[] cs = s.next().toCharArray();
long[] differ = new long[len+10];
while (cnt-->0){
int l =s.nextInt();
int r = s.nextInt();
int k = s.nextInt();
differ[l]+=k;修
differ[r+1]-=k;
}
for(int i=1;i<=len;i++){
differ[i]+=differ[i-1];
}
for(int i=1;i<=len;i++){
cs[i-1] = addNumber(cs[i-1],differ[i]);
}
System.out.println(new String(cs));
s.close();
}
}
参考博客链接
前缀和和差分是用来干嘛的,从这个链接知道了前缀和和差分用来干嘛的
前缀和与差分,书上差分,从这个链接中知道了差分适合对区间频繁修改