首页 > 解决方案 > C中数组反转中以下代码之间的区别

问题描述

我在hackerrank上解决了一些C语言的基本问题。我解决了这个问题,我的解决方案被接受了,但我总是在提交我的解决方案后检查讨论,看看我该如何改进自己。以下是我们必须编写数组反转逻辑的预给定代码。

 #include <stdio.h>
#include <stdlib.h>

int main()
{
    int num, *arr, i;
    scanf("%d", &num);
    arr = (int*) malloc(num * sizeof(int));
    for(i = 0; i < num; i++) {
        scanf("%d", arr + i);
    }

    
   
    
    /* Write the logic to reverse the array. */

    for(i = 0; i < num; i++)
        printf("%d ", *(arr + i));
    return 0;
}

我反转数组的逻辑

/* Write the logic to reverse the array. */
for(i = 0; i < num/2; i++) {
        int  temp;
        temp=arr[i];
        arr[i] = arr[num-(i+1)];
        arr[num-(i+1)]=temp;
        }

我在讨论部分看到的逻辑并不太明白

/* Write the logic to reverse the array. */
    int temp;
    for (i = 0; i < num / 2; i++) {
        temp = (int) *(arr + num - i - 1);
        *(arr + num - i - 1) = *(arr + i);
        *(arr + i) = temp;
    }    

您能否解释一下第二个逻辑以及它比我的逻辑更好的地方。谢谢你。

标签: arraysc

解决方案


怎么比我的逻辑好

从“逻辑”的角度来看,它是平等的。

你能解释一下第二个逻辑吗

一个语句a[b]完全等价于*(a + b)。第二个代码片段完全相同:

int temp;
for (i = 0; i < num / 2; i++) {
    temp = (int)arr[num - i - 1];
    arr[num - i - 1] = arr[i];
    arr[i] = temp;
}    

多余的演员 toint只是什么都不做,可以被删除。因为- i - 1eqaul to: - (i-1),我们可以:

int temp;
for (i = 0; i < num / 2; i++) {
    temp = arr[num - (i + 1)];
    arr[num - (i + 1)] = arr[i];
    arr[i] = temp;
}

这是等效的(除了一些极端情况,当溢出发生时)。

然后使用的元素顺序不同。您可以通过以下方式切换两个元素:

int temp = a;
a = b;
b = temp;

或通过

int temp = b;
b = a;
a = temp;

这是完全等价的,只是您的代码开始切换,arr[i]而呈现的代码开始切换arr[num - (i + 1)].


推荐阅读