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
相关产品推荐
相关产品推荐

