TWO SUM 问题中 if 语句的带括号的不同输出

Different output with brackets for if statement in TWO SUM proble

我在这里附上 link 到 leet 代码中的 TWO SUM 问题:https://leetcode.com/problems/two-sum/

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    *returnSize=2;
    int *arr=malloc(sizeof(int)*2);
    int i,j;
    for(i=0;i<numsSize-1;i++){
        for(j=i+1;j<numsSize;j++){
            printf("i= %d j=%d,ans=%d\n",nums[i],nums[j],nums[i]+nums[j]);
            if(nums[i]+nums[j]==target){
               arr[0]=i; arr[1]=j;
            }
        }
    }
    return arr;
}

在上面代码的 if statement 中添加大括号后会产生以下输出output image

但是如果我删除了 if statement 的大括号,那么我会得到一个不同的输出,如图所示 bracket of if statement removed

没有大括号,只有 if (arr[0]=i) 之后的第一条语句被执行。而如果 if 的大括号存在,则执行大括号内的所有语句。

C 在缩进方面不像 Python(可能还有其他一些语言),并且编译器不会解释您的两个 separate 语句在 if (...) 作为条件块的主体之后。所以,没有花括号,只有第一个语句(arr[0]=i;)构成了条件块,第二个语句(arr[1]=j;)不管结果如何都会被执行测试。

if 块的主体是 单个 语句或 'scope block' (有时称为 复合 语句),由 { ... } 大括号分隔。

在此 if 语句中不使用大括号

if(nums[i]+nums[j]==target){
   arr[0]=i; arr[1]=j;
}

你实际上有

if(nums[i]+nums[j]==target) arr[0]=i; 
arr[1]=j;

所以这个声明

arr[1]=j;

无条件执行。

例如,您可以使用一个带有逗号运算符表达式的语句,例如

if(nums[i]+nums[j]==target)
   arr[0]=i, arr[1]=j;

得到预期的结果。

注意你的方法效率低下。一旦找到所需的数组元素对,嵌套循环应立即停止迭代。

这个参数

int* returnSize

没有意义,因为此指针指向的对象始终设置为 2。

动态分配内存不是一个好主意。

另外你没有初始化分配的内存。因此,如果未找到所需的数组元素对,您将返回一个具有不确定值的数组。

我将按照以下演示程序中所示的方式声明和定义函数。

#include <stdio.h>

struct Pair 
{ 
    size_t first;
    size_t second;
};


struct Pair twoSum( const int *nums, size_t numsSize, int target )
{
    struct Pair pair = { .first = numsSize, .second = numsSize };
    
    int found = 0;
    
    for ( size_t i = 0; !found && i < numsSize; i++ )
    {
        for ( size_t j = i + 1; !found && j < numsSize; j++ )
        {
            if ( nums[i] + nums[j] == target )
            {
                found = 1;
                pair.first = i;
                pair.second = j;
            }
        }
    }
    
    return pair;
}

int main( void ) 
{
    int a1[] = { 2, 7, 11,15 };
    size_t n = sizeof( a1 ) / sizeof( *a1 );
    
    int target = 9;
    
    struct Pair pair = twoSum( a1, n, target );
    
    if ( pair.first != n )
    {
        printf( "[%zu,%zu]\n", pair.first, pair.second );
    }
    
    int a2[] = { 3, 2, 4 };
    n = sizeof( a2 ) / sizeof( *a2 );
    
    target = 6;
    
    pair = twoSum( a2, n, target );
    
    if ( pair.first != n )
    {
        printf( "[%zu,%zu]\n", pair.first, pair.second );
    }
    
    int a3[] = { 3, 3 };
    n = sizeof( a3 ) / sizeof( *a3 );
    
    target = 6;
    
    pair = twoSum( a3, n, target );
    
    if ( pair.first != n )
    {
        printf( "[%zu,%zu]\n", pair.first, pair.second );
    }
    
    return 0;
}

程序输出为

[0,1]
[1,2]
[0,1]