英文題目:
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葵腹,和一個整數(shù)數(shù)組 shifts磷醋。
我們將字母表中的下一個字母稱為原字母的 移位(由于字母表是環(huán)繞的, 'z' 將會變成 'a')工猜。
例如·摊趾,shift('a') = 'b'币狠, shift('t') = 'u',, 以及 shift('z') = 'a'砾层。
對于每個 shifts[i] = x 漩绵, 我們會將 S 中的前 i+1 個字母移位 x 次。
返回將所有這些移位都應(yīng)用到 S 后最終得到的字符串肛炮。
分析:
- 題目定義了一個shift函數(shù)渐行,將字母按照字母表的順序轉(zhuǎn)換成下一個字母;題目給了一個shift數(shù)組铸董,shift[i]代表要對前i+1個字母作shift[i]次shift函數(shù)操作祟印。
- 根據(jù)題目要求,我們應(yīng)該從后往前計算粟害,即最后一位應(yīng)該移動shift[len-1]次蕴忆,倒數(shù)第二位移動shift[len-1]+shift[len-2]次。
- 所以這道題是典型的使用后綴和解決的題目悲幅,但是根據(jù)題意0 <= shifts[i] <= 10 ^ 9套鹅,我們應(yīng)該進(jìn)行%26次操作。
- 最后還要完成字符類型和整形之間的轉(zhuǎn)換汰具,時間復(fù)雜度為O(n)卓鹿。
總結(jié)本題的考點在于:
- 后綴和
- 根據(jù)題意進(jìn)行取模運算(考慮到溢出情況)
- 字符類型與整數(shù)類型的轉(zhuǎ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 進(jìn)行 shift 計算留荔,完成后轉(zhuǎn)回 char 類型
chars[i] = (char)((chars[i] - 'a' + shift) % 26 + 'a');
}
return String.valueOf(chars);
}
}