链接:https://leetcode.cn/problems/defuse-the-bomb/solution/-by-xun-ge-v-42ud/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目![](https://img-blog.csdnimg.cn/e24cff4f71cf4bbdbb3fb751d1b0b445.png)
示例![](https://img-blog.csdnimg.cn/157988232f1740b0b6b74d2610d4cc78.png)
思路
为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。
- 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。
- 如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和替换。
- 如果 k == 0 ,将第 i 个数字用 0 替换。
直接根据题目进行模拟即可
枚举数组中的每一天位置,对其进行加k个之前或者之后的元素即可
可能在下标处理上面的注意一下细节
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* decrypt(int* code, int codeSize, int k, int* returnSize){
*returnSize = codeSize;
int * ans = (int *)malloc(sizeof(int) * codeSize);//申请额外空间
for(int i = 0; i < codeSize; i++)//枚举每一个位置
{
int tmp = 0;
int n = k;
if(k > 0)//k大于0的情况
{
int index = (i+1) % codeSize;
while(n--)
{
tmp += code[(index++) % codeSize];//环形队列下标处理,正数相对来说好处理
}
}
else if(k < 0)//k小于0的情况
{
int index = (i-1) % codeSize < 0 ? codeSize-1 : (i-1) % codeSize;
while(n++)
{
tmp += code[index = (((index) % codeSize) < 0 ? (codeSize-1) : ((index) % codeSize))];//环形队列下标处理
index--;
}
}
ans[i] = tmp;//保存变化位置,如果k为0的话,tmp也为0
}
return ans;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/defuse-the-bomb/solution/-by-xun-ge-v-42ud/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。