为什么Leetcode将C中的静态变量初始化为0?

时间:2020-03-10 07:19:10

标签: c

Error抱歉,在这种情况下为什么我的输出错误?正确答案是2的可能性如何? https://leetcode.com/problems/jump-game-ii/ 我正在尝试解决第二跳问题。在代码块上,结果正确,在Leetcode号上。我发现该站点将静态变量min初始化为0,而不是我写的值100。奇怪的是,在其他情况下,网站会正确地对其进行初始化。这是代码。

int jump(int* nums, int numsSize){
    static int i=0;
    static int shots=0;
    static int min=100;

    if (i == numsSize - 1){
        if (shots < min){
            min = shots;
        }
        return min; 

    }      

    else if(nums[0] >= (numsSize-i)){
        i++;      
        shots++;  
        min=jump(&(nums[1]), numsSize);    //single jump in one shot
        i--;      
        shots--;  
        return min;
    }       

    else{  
        if(nums[0] != 0){
            i += nums[0];
            shots++;   
            min = jump(&(nums[nums[0]]), numsSize);//multiple jump in one shot 
            shots--;    
            i -= nums[0];
        }               
        i++;    
        shots++;
        min=jump(&(nums[1]), numsSize);  //single jump in one shot
        i--;    
        shots--;
        return min;
    }       
}

1 个答案:

答案 0 :(得分:2)

min变量被标记为static。这意味着它将在jump的调用之间保留其值。我认为您正在使用它,是因为您想在对jump的递归调用中对其进行修改,但是副作用是它还在测试用例中保留。

正在发生的事情是代码块,每个测试用例正在单独运行(在程序的单独运行中)。因此,每次min被静态初始化为100。在Leetcode上,测试用例在一个循环中一个接一个地运行。这意味着,如果一个测试运行返回0,则min不会重新初始化回100,以进行后续测试运行。当然,我不确定这一点,但是似乎很有可能,static的这种误用绝对是代码中的错误,如果两次使用该函数,则会导致错误。

您可能对ishots遇到同样的问题。

如果您确实需要递归树下的状态,最好将其显式传递下来。如果您也需要更新它(在此处进行操作),请使用指针参数。

也许是这样的:

typedef struct jump_state_s {
    int min;
    int i;
    int shots;
} jump_state_s;

int jump1(int* nums, int numsSize, jump_state_s *js) {
    if (js->i == numsSize - 1){
        if (js->shots < js->min){
            js->min = js->shots;
        }
        return js->min; 
    }      
    ... rest of code
}

int jump(int *nums, int numsSize) {
    jump_state_s js = {100, 0, 0};
    return jump1(nums, numsSize, &js);
}

请注意,这不是为此问题编程解决方案的最佳方法,并且在最坏的情况下将导致指数时间。最佳解决方案看起来像一个迭代的动态编程解决方案,对每个平方使用一组“最佳”值。

相关问题