美文网首页
848. 字母移位(Python)

848. 字母移位(Python)

作者: 玖月晴 | 来源:发表于2021-02-21 14:29 被阅读0次

    难度:★★☆☆☆
    类型:数组
    方法:抓重点

    力扣链接请移步本题传送门
    更多力扣中等题的解决方案请移步力扣中等题目录

    题目

    有一个由小写字母组成的字符串 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 <= S.length = shifts.length <= 20000
    0 <= shifts[i] <= 10 ^ 9

    解答

    这道题很简单,重点在于提炼核心算法避免重复超时。

    我们定义一个函数get_shift_result,用于计算一个字母c位移s次后可以得到的字母,这个函数中要注意的是“a”的ASCII码是从9开始,另外要灵活运用取余来解决旋转问题。

    再定义一个函数get_shifts,用于获取最后的偏移量列表shifts,例如题目中的shifts为[1,2,3]实际上意味着对应位置处的字母总位移次数为[6,5,3]次,这里要巧妙使用逆序进行处理。

    最后,我们把每个字母按顺序拆分,处理,合并即可。

    class Solution:
        def shiftingLetters(self, S, shifts):
    
            def get_shift_result(c, s):
                return chr(97 + ((ord(c) + s % 26) - 97) % 26)
    
            def get_shifts(shifts):
                cur_s = 0
                new_shifts = []
                for s in reversed(shifts):
                    cur_s += s
                    new_shifts.append(cur_s)
                return reversed(new_shifts)
    
            return "".join(get_shift_result(c, s) for c, s in zip(S, get_shifts(shifts)))
    

    如有疑问或建议,欢迎评论区留言~

    有关更多力扣中等题的python解决方案,请移步力扣中等题解析

    相关文章

      网友评论

          本文标题:848. 字母移位(Python)

          本文链接:https://www.haomeiwen.com/subject/almstltx.html