# 字母移位 有一个由小写字母组成的字符串`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"。 ``` ## 题解 ```javascript /** * @param {string} S * @param {number[]} shifts * @return {string} */ var shiftingLetters = function(S, shifts) { var sub = 0; var base = "a".charCodeAt(0); var target = ""; for(let i=S.length-1; i>=0; --i){ sub = (sub + shifts[i]); let charPath = (S[i].charCodeAt(0) - base + sub) % 26; target = String.fromCharCode(base + charPath) + target; } return target; }; ``` ## 思路 这是字符的循环移位问题,根据`shifts`数组就可以计算出每个字符的移位数量,第`i`个字母共移位`shifts[i] + shifts[i+1] + ... + shifts[shifts.length - 1]`次,虽然可以直接是用数组计算出每个字符应该位移的长度,但是如果直接从数组尾部向前遍历,那么直接记录之前的累加值然后作循环移位即可,首先定义一个累加值计数和`sub`,`Js`中没有`char`基本数据类型,所以对于字符操作需要通过`Ascii`码计算,定义`base`作为字符`a`的`Ascii`码值,`target`为将要返回的目标字符串,然后从后向前遍历数组,累加`sub`计数器,计算当前字符加入计数器的长度减掉`a`字符来计算`Ascii`码值,然后取余获得对于`a`字符的偏移长度,然后将`Ascii`码值转换为字符拼接到目标字符串即可。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 题源 ``` https://leetcode-cn.com/problems/shifting-letters ```