gpt4 book ai didi

python - 除自身之外的数组的乘积

转载 作者:行者123 更新时间:2023-11-30 15:14:42 25 4
gpt4 key购买 nike

我正在在线裁判网站----leetcode上做练习,在这道题中,我找不到问题出在哪里。在 Python 中,即使列表超出范围,oj 也会显示已接受。但在 C 中,即使数组没有越界,oj 也会显示运行时错误。为什么?

问题描述:
给定一个由 n 个整数组成的数组,其中 n > 1,nums,返回一个数组输出,使得 output[i] 等于nums 中除 nums[i] 之外的所有元素。

无需除法即可在 O(n) 内解决该问题。

例如,给定[1,2,3,4],返回[24,12,8,6]

跟进:
你能用恒定的空间复杂度来解决它吗? (注意:出于空间复杂度分析的目的,输出数组不计为额外空间。)

我的代码:

Python:

class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
size = len(nums)
output = [1] * size
left = 1
for x in range(size - 1):
left *= nums[x]
output[x + 1] *= left
right = 1
for x in range(size - 1, 0, -1):
right *= nums[x]
output[x - 1] *= right
return output

C:

//Return an array of size *returnSize.
//Note: The returned array must be malloced, assume caller calls free().
int *productExceptSelf(int* nums, int numsSize, int* returnSize) {
int left = 1, right = 1;
int i;
int resize[numsSize + 1];
for (i = 0 ; i < (numsSize + 1) ; i++)
resize[i] = 1;
for (i = 0 ; i < numsSize ; i++)
{
left *= nums[i];
resize[i + 1] *= left;
}
for (i = numsSize ; i > 0 ; i--)
{
right *= nums[i];
resize[i - 1] *= right;
}
returnSize = resize;
return returnSize;
}

最佳答案

您在堆栈上分配一个数组,然后从函数返回。这会立即释放在堆栈上为 productExceptSelf 分配的所有变量,留下空闲空间以供另一个函数声明。返回数组时不复制数组,而仅返回其地址。导致错误的原因是在数组已被释放时使用该地址来尝试访问该数组。正如代码中的注释所建议的那样,使用 malloc 分配数组,而不是通过在堆栈上声明它来分配数组。即执行类似 int* someArray = malloc( n * sizeof(int));

的操作

话虽如此,您在指针管理方面存在许多问题。我不确定您是否非常了解它们是如何工作的。您的函数旨在返回两个值,即产品本身的数组及其最终大小。由于C只能直接返回一个值,因此您实际上直接返回int*类型的数组,并通过编写返回int类型的大小int 位于 resultSize 给出的地址处。也就是说,您应该执行*resultSize = myActualSize。对于数组,您可以return someArray,该数组使用malloc在堆上分配,正如我上面所说的。

关于python - 除自身之外的数组的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com