持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
一、题目描述:
有一个由小写字母组成的字符串 s,和一个长度相同的整数数组 shifts。
我们将字母表中的下一个字母称为原字母的 移位 shift() (由于字母表是环绕的, 'z' 将会变成 'a')。
例如,shift('a') = 'b', shift('t') = 'u', 以及 shift('z') = 'a'。 对于每个 shifts[i] = x , 我们会将 s 中的前 i + 1 个字母移位 x 次。
返回 将所有这些移位都应用到 s 后最终得到的字符串 。
示例 1:
输入:s = "abc", shifts = [3,5,9] 输出:"rpl" 解释: 我们以 "abc" 开始。 将 S 中的第 1 个字母移位 3 次后,我们得到 "dbc"。 再将 S 中的前 2 个字母移位 5 次后,我们得到 "igc"。 最后将 S 中的这 3 个字母移位 9 次后,我们得到答案 "rpl"。 示例 2:
输入: s = "aaa", shifts = [1,2,3] 输出: "gfd"
提示:
1 <= s.length <= 105 s 由小写英文字母组成 shifts.length == s.length 0 <= shifts[i] <= 109
二、思路分析:
首先对于题目而言,所有的转换都是对原有字母的偏置处理。所有的偏置处理的范围局限在26个字母之中。 所以可以把这类问题等价地看作一个时钟循环的问题。 分析题目我们可以得出:
第一个的偏移的次数是最多的,最后一个的偏移次数是最少的 偏移量在不断叠加 第一个问题好解决:直接逆序处理(或者反向处理)记录每次的偏移量 第二个问题:应对这种数量叠加,可能溢出的现象。回归到题目中,循环一圈的量为26个。也就是说每次跑26相当于回到原点。所以对于每次的偏移叠加量需要取余处理,降低偏移的爆炸叠加。
三、AC 代码:
class Solution {
class Solution {
public String shiftingLetters(String S, int[] shifts) {
char []box = S.toCharArray();
int upNum=0;
//逆序处理,层层叠加
for(int i=box.length-1;i>=0;i--){
//总共就26个字母,所以循环的范围都在26内。超过26的需取余,减少加数的爆炸叠加
upNum+=(shifts[i]%26);
upNum%=26;
//asci码直接运算
box[i]= (char) ((box[i]+upNum-97)%26+97);
}
return String.valueOf(box);
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做