js做算法题-字母移位

字母移位

题目来源: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;
};

点击查看更多算法题js实现

猜你喜欢

转载自blog.csdn.net/weixin_40870788/article/details/80758830