每日一练 · 字母移位

155 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
    }
}




四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做