给定一个包含5个元素[1,2,3,4,5]的整数数组,我试图颠倒数组中元素的顺序;例如数组将变为[5,4,3,2,1]。
int main(void) {
int n = 5; //Num of elements
int arr[5] = {1,2,3,4,5};
for (int i = 0; i < n; i++) {
printf("%d\n", arr[i]); //Print original vals
}
n--; //Decrement n by 1 for simplicity
for (int i = n; i >= 0; i--) {
int temp = arr[n - i]; //Set temp the max-index (4) - i
printf("\nSmall: %d\nBig: %d\n", arr[n - i], arr[i]); //Print current temp & arr[i]
arr[n - i] = arr[i]; //Set arr[max-index - i] to arr[i] (e.g arr[0] = arr[4])
arr[i] = temp; //Set arr[i] to arr[max-index - 1] (e.g. arr[4] = arr[0])
printf("\nBig: %d\nSmall: %d\n", arr[n - i], arr[i]); //Print new set
}
for (int i = 0; i < n + 1; i++) { //Print array in reverse order
printf("%d\n", arr[i]);
}
return 0;
}
第一个for循环应打印:1 2 3 4 5 最后:5 4 3 2 1
然而,它两次打印1 2 3 4 5,但是反转数组的循环中的print语句打印正确的数字。 我做错了什么吗?
我是否应该动态分配内存或其他不允许我更改数组的内容?
答案 0 :(得分:5)
问题是,你将每个元素交换两次(除非它是中心元素),最终不会交换任何东西。在第一个循环中,您在技术上交换第一个和最后一个项目。在最后一个循环中,你做了同样的事情。因此,您将物品退回原始位置。
另一个问题是你试图访问未定义的arr [5],因为你的数组大小为5,因此索引应该只有0到4。
以下是一个反转数组的函数
void ReverseArray(int arr[], int size)
{
for (int i = 0; i < size/2; ++i)
{
int temp = arr[i];
arr[i] = arr[size - 1 - i];
arr[size - 1 - i] = temp;
}
}
答案 1 :(得分:0)
要反转数组,您必须执行以下操作:
for(int i = i; i<n/2; ++i)
{
int temp = arr[i];
arr[i] = arr[n-i-1];
arr[n-i-1] = temp;
}
答案 2 :(得分:0)
您正在反转阵列两次。 在每次迭代中,您将两个数字交换到距离中心相同的距离。
因此,在迭代的前半部分,您已经颠倒了数组。当你继续迭代时,你再次交换并且数组保持不变。
要解决此问题,只需将反转循环更改为(对i> = n / 2更改i&gt; = n)
for (int i = n; i >= n/2; i--) {...swaping operations...}