数组产品除自我

时间:2015-11-27 14:50:21

标签: python c

我在网上评判网站做了激励---- leetcode.And在这个问题上,我找不到问题出在哪里。 在Python中,即使列表超出界限,oj也会被接受。 但是在C中,即使数组没有超出范围,oj也会显示运行时错误。 为什么呢?

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

在没有除法的情况下解决它并在O(n)中解决。

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

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

mycode的:

的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;
}

1 个答案:

答案 0 :(得分:1)

您在堆栈上分配一个数组,然后从该函数返回。这会立即释放在productExceptSelf的堆栈上分配的所有变量,从而使该空间可以被另一个函数声明。您在返回时不会复制数组,您只返回其地址。此地址的Usago尝试在释放时访问该数组是导致错误的原因。正如评论在您的代码中所建议的那样,使用malloc分配数组,而不是在堆栈中声明它。即做int* someArray = malloc( n * sizeof(int));

之类的事情

话虽如此,你的指针管理存在很多问题。我不确定你是否理解他们的工作方式。您的函数旨在返回两个值,即产品本身的数组及其最终大小。由于C只能直接返回一个值,因此实际上直接返回类型为int*的数组,并通过在给定的地址处写int来返回类型int的大小按resultSize。即你应该做*resultSize = myActualSize。对于数组,您可以执行return someArray,即使用malloc 在堆上分配该数组,如上所述。