英文题目:
We have a string S of lowercase letters, and an integer array shifts.
Call the shift of a letter, the next letter in the alphabet, (wrapping around so that 'z' becomes 'a').
For example, shift('a') = 'b', shift('t') = 'u', and shift('z') = 'a'.
Now for each shifts[i] = x, we want to shift the first i+1 letters of S, x times.
Return the final string after all such shifts to S are applied.
中文题目:
有一个由小写字母组成的字符串 S,和一个整数数组 shifts。
我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的, 'z' 将会变成 'a')。
例如·,shift('a') = 'b', shift('t') = 'u',, 以及 shift('z') = 'a'。
对于每个 shifts[i] = x , 我们会将 S 中的前 i+1 个字母移位 x 次。
返回将所有这些移位都应用到 S 后最终得到的字符串。
分析:
- 题目定义了一个shift函数,将字母按照字母表的顺序转换成下一个字母;题目给了一个shift数组,shift[i]代表要对前i+1个字母作shift[i]次shift函数操作。
- 根据题目要求,我们应该从后往前计算,即最后一位应该移动shift[len-1]次,倒数第二位移动shift[len-1]+shift[len-2]次。
- 所以这道题是典型的使用后缀和解决的题目,但是根据题意0 <= shifts[i] <= 10 ^ 9,我们应该进行%26次操作。
- 最后还要完成字符类型和整形之间的转换,时间复杂度为O(n)。
总结本题的考点在于:
- 后缀和
- 根据题意进行取模运算(考虑到溢出情况)
- 字符类型与整数类型的转换
class Solution {
public String shiftingLetters(String S, int[] shifts) {
char[] chars = S.toCharArray();
int shift = 0;
for (int i = shifts.length - 1; i >= 0; i--) {
// 取模运算,防止溢出
shift = (shift + shifts[i]) % 26;
// 利用 int 进行 shift 计算,完成后转回 char 类型
chars[i] = (char)((chars[i] - 'a' + shift) % 26 + 'a');
}
return String.valueOf(chars);
}
}