拆除炸弹详解
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;
以上是关于拆除炸弹详解的主要内容,如果未能解决你的问题,请参考以下文章