You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何克隆数组并将索引右移1位?求解CodeSignal算法题

CodeSignal 相邻元素最大乘积问题解法

你的思路方向是对的,但当前代码存在几个问题,而且其实不用额外创建偏移数组也能高效解决:

你的代码里的问题

  • 不能直接用 inputArray[0] 访问元素,因为 inputArray 是结构体,得通过 inputArray.arr 指针来操作数组元素。
  • 0++ 这种写法完全无效,应该用索引 i 和 i+1 来取相邻的两个元素。
  • 未考虑数组长度的基本边界(题目应该保证数组长度≥2,但代码里最好做个兜底处理)。

按你的原思路实现(创建偏移数组)

如果一定要创建右移一位的数组,代码可以这么写:

int solution(arr_integer inputArray) {
    int n = inputArray.size;
    if (n < 2) return 0; // 题目输入应该满足n≥2,这里做兜底处理
    
    // 右移后的数组长度是原数组长度减1
    int* secondArray = malloc(sizeof(int) * (n-1));
    for (int i = 0; i < n-1; i++) {
        secondArray[i] = inputArray.arr[i+1];
    }
    
    // 计算所有对应位置的乘积,同时记录最大值
    int maxProduct = inputArray.arr[0] * secondArray[0];
    for (int i = 1; i < n-1; i++) {
        int currentProduct = inputArray.arr[i] * secondArray[i];
        if (currentProduct > maxProduct) {
            maxProduct = currentProduct;
        }
    }
    
    free(secondArray); // 别忘了释放动态分配的内存
    return maxProduct;
}

更高效的优化写法(无需额外数组)

其实根本没必要创建第二个数组,直接遍历原数组,每一步计算当前元素和下一个元素的乘积,同时记录最大值就行,这样既省内存又简洁:

int solution(arr_integer inputArray) {
    // 初始化最大值为第一对相邻元素的乘积
    int maxProduct = inputArray.arr[0] * inputArray.arr[1];
    
    // 从第二个元素开始遍历到倒数第二个元素
    for (int i = 1; i < inputArray.size - 1; i++) {
        int currentProduct = inputArray.arr[i] * inputArray.arr[i+1];
        if (currentProduct > maxProduct) {
            maxProduct = currentProduct;
        }
    }
    
    return maxProduct;
}

额外提醒

  • 数组里有负数的情况也要考虑:两个负数相乘可能得到比正数乘积更大的结果,上面的代码会自动比较所有乘积的大小,能正确处理这种情况。
  • 如果题目允许数组长度小于2,可以根据要求添加对应的错误处理逻辑。

内容的提问来源于stack exchange,提问作者generateGeorgina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:50:35