拆除炸弹详解

Posted Roam-G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拆除炸弹详解相关的知识,希望对你有一定的参考价值。

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 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 ,请你返回解密后的结果来拆除炸弹!

示例 1:

输入:code = [5,7,1,4], k = 3
输出:[12,10,16,13]
解释:每个数字都被接下来 3 个数字之和替换。解密后的密码为 [7+1+4, 1+4+5, 4+5+7, 5+7+1]。注意到数组是循环连接的。

----------------

数组拷贝函数
arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length)
src – the source array.原始数组
srcPos – starting position in the source array.开始位置
dest – the destination array. 目的数组
destPos – starting position in the destination data.开始位置
length – the number of array elements to be copied.需要复制的长度


public class Code 
    public static void main(String[] args) 

        int[] code = 5, 7, 1, 4;
        int k = 3;
        int[] code1 = 2, 4, 9, 3;
        int k1 = -2;
        int k0 = 0;

        for (int i = 0; i < decryptByOfficial(code, 3).length; i++) 
            System.out.println(decryptByOfficial(code1, k1)[i]);
        

    

    

   
    public static int[] decryptByOfficial(int[] code, int k) 
        int n = code.length;
        if (k == 0) 
            return new int[n];
//            new 的数组,默认数据为0
        
        int[] res = new int[n];
//        新建 返回的数组
        int[] newCode = new int[n * 2];
//        扩充原数组为n*2
        /**
         * 数组拷贝函数
         arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length)
         src – the source array.原始数组
         srcPos – starting position in the source array.开始位置
         dest – the destination array. 目的数组
         destPos – starting position in the destination data.开始位置
         length – the number of array elements to be copied.需要复制的长度
         */
        System.arraycopy(code, 0, newCode, 0, n);
        System.arraycopy(code, 0, newCode, n, n);
        code = newCode;
        int l = k > 0 ? 1 : n + k;
        int r = k > 0 ? k : n - 1;
        /**
         * 如果 k > 0,左起点,位置 1,右边终点位置为 k-----在原始数组操作
         * 如果 k < 0,左起点,位置 n + k,右边终点位置为 n-1------在扩充数组操作
         * 无论 k < >0,都是计算后k个数字和。只是起点和终点不同
         * */
        int w = 0;
        for (int i = l; i <= r; i++) 
//            统计i后k个数字的和
            w += code[i];
        
        for (int i = 0; i < n; i++) 
            res[i] = w;
//            替换第i个数字
            w -= code[l];
            w += code[r + 1];
//          把w 去掉前一个数字,加上后一个数字。就是 第i+1需要替换的。
            l++;
            r++;
//            左右端点,向后移动一位
        

        return res;
    

 

以上是关于拆除炸弹详解的主要内容,如果未能解决你的问题,请参考以下文章

二元炸弹 - 第 4 阶段

ACM_Jack拆炸弹(深搜)

我在处理这个二元炸弹任务时遇到了麻烦

Bomblab

bzoj1536: [POI2005]Akc- Special Forces Manoeuvres

试图理解这个汇编 x86 代码