arrays - 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;
}
您能否解释一下第二个逻辑以及它比我的逻辑更好的地方。谢谢你。
解决方案
怎么比我的逻辑好
从“逻辑”的角度来看,它是平等的。
你能解释一下第二个逻辑吗
一个语句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 - 1
eqaul 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)]
.
推荐阅读
- php - 使用 php 函数 move_uploaded_file 上传文件图像后我找不到文件图像
- android - onClick 更新到 Firebase 数据库不起作用
- java - Asynctask 不会下载所有内容
- java - 自定义 SonarQube 规则以识别实例变量
- c# - 时间:2018-10-10 标签:c#closeietab基于已知的进程ID
- ios - 在 iOS 中通过 ipv4 而不是 ipv6 路由网络
- r - 按行数对一组列求和
- c - 用于从输入文件中删除注释的 Lex 程序
- html - 使用复选框隐藏/显示
- entity-framework - Java 8 实体列表迭代器消耗太多时间来处理查询