初学python记录:力扣1652. 拆炸弹

文章讲述了在给定一个循环数组和整数密钥k的情况下,如何通过滑动窗口算法进行加密解密操作,以便正确地替换数组中的数字以拆除炸弹。当k为0时,数组全变0;非零k时,每个元素由相邻k个元素之和替换并保持窗口滑动更新。
摘要由CSDN通过智能技术生成

题目:

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。

为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。

  • 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。
  • 如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和替换。
  • 如果 k == 0 ,将第 i 个数字用 0 替换。

由于 code 是循环的, code[n-1] 下一个元素是 code[0] ,且 code[0] 前一个元素是 code[n-1] 。

给你 循环 数组 code 和整数密钥 k ,请你返回解密后的结果来拆除炸弹!

提示:

  • n == code.length
  • 1 <= n <= 100
  • 1 <= code[i] <= 100
  • -(n - 1) <= k <= n - 1

思考:

当k=0时,直接返回全为0的数组;当k>0或者k<0时,每个元素都由其他的k个元素之和代替,很容易想到用滑动窗口解决,每次减去滑动窗口里的第一个元素(索引设为left),加上窗口后的第一个元素(索引设为right),即为当前元素更新的值。

另外要注意当left或right更新到越过数组边界时,需要重新设为0(因为数组code是循环数组),避免数组越界。代码如下:

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = []
        if k == 0:
            return [0 for _ in range(n)]
        elif k > 0:
            left = 1
            right = k
        elif k < 0:
            left = n + k
            right = n - 1

        window = sum(code[left:right+1])   # 初始化滑动窗口
        for i in range(n):
            ans.append(window)
            right += 1
            if right == n:
                right = 0
            window = window - code[left] + code[right]
            left += 1
            if left == n:
                left = 0

        return ans

提交通过:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值