字母移位
题目来源:LeetCode No.848
题目描述:
有一个由小写字母组成的字符串 S
,和一个整数数组shifts
。
我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的,'z'
将会变成'a'
)。
例如·,shift('a') = 'b'
, shift('t') = 'u'
, 以及 shift('z') = 'a'
。
对于每个shifts[i] = x
, 我们会将 S
中的前i+1
个字母移位x
次。
返回将所有这些移位都应用到 S
后最终得到的字符串。
示例:
输入:S = "abc"
, shifts = [3,5,9]
输出:"rpl"
解释:
我们以"abc"
开始。
将S
中的第 1
个字母移位 3
次后,我们得到"dbc"
。
再将 S
中的前2
个字母移位5
次后,我们得到 "igc"
。
最后将 S
中的这3
个字母移位 9
次后,我们得到答案 "rpl"
。
提示:
1. 1 <= S.length = shifts.length <= 20000
2. 0 <= shifts[i] <= 10 ^ 9
思路分析:
因为1 <= S.length = shifts.length <= 20000
,说明S
字符串中的每个字符都会参与移位,每个字符的移位情况有shifts[i]
与i
共同决定。
由于涉及ASCII
码与字符的转换,我们可以使用 String.prototype.charCodeAt() 函数获取字符对应的ASCII
码,用 String.fromCharCode() 函数来获取ASCII码对应的字符(因为仅涉及26个小写字母的ASCII码对照,也可以直接在局部环境内保存这26个对照关系,通过查表的形式转换),实现字符的移位转换。
假设需要移位的字符为s
,移位shiftBit 后的字符为s'
,则s' = String.fromCharCode((s.charCodeAt() + shiftBit - 97)%26 + 97)
。
代码示例:
/**
* @param {string} S
* @param {number[]} shifts
* @return {string}
*/
var shiftingLetters = function(S, shifts) {
let shiftBit = 0;
let len = shifts.length;
let res = "";
while (len--) {
shiftBit += shifts[len];
if (S[len]) {
let code = (S[len].charCodeAt() + shiftBit - 97)%26 + 97;
res = String.fromCharCode(code) + res;
}
}
return res;
};