题目要求如下:
将一个数组中的值按逆序重新存放。例如,原来的顺序为:8, 6, 5, 4, 1
,经过逆序操作后,数组变为:1, 4, 5, 6, 8
。
输入为两行:
(
)。
个整数,每两个整数之间用空格分隔。
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
输入样例:
5
8 6 5 4 1
输出样例:
1 4 5 6 8
以下是我的初步代码实现:
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int j = n - 1; j >= 0; j--)
{
cout << arr[j] << " ";
}
return 0;
}
n
,表示数组的大小。arr[n]
,用一个循环依次将用户输入的 n
个数存入数组。int arr[n]
),虽然大部分编译器支持,但这并不符合C++标准。std::vector
)。改进后的代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int j = n - 1; j >= 0; j--)
{
cout << arr[j];
if (j > 0) cout << " "; // 避免最后一个元素后面多输出空格
}
return 0;
}
在课堂上,老师提供了两种不同的实现方法,分别为:
以下是代码实现:
#include <iostream>
using namespace std;
int arr[110] = {0};
int main()
{
int n = 0;
cin >> n;
int i = 0;
for (i = 0; i < n; i++)
cin >> arr[i];
// 逆序
int left = 0;
int right = n - 1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
for (i = 0; i < n; i++)
cout << arr[i] << " ";
return 0;
}
arr
,通过输入循环将数据存入数组。left
和 right
,分别指向数组的开头和末尾。left
向右移动,right
向左移动,直到两者相遇或交错。。
以下是代码实现:
#include <iostream>
using namespace std;
int arr[110] = {0};
int main()
{
int n = 0;
cin >> n;
int i = 0;
for (i = 0; i < n; i++)
cin >> arr[i];
// 逆序输出
for (i = n - 1; i >= 0; i--)
cout << arr[i] << " ";
return 0;
}
通过上述代码实现和分析,可以得出以下结论:
特点 | 方法1:反转数组内容 | 方法2:直接逆序输出 |
---|---|---|
实现复杂度 | 略复杂,需要两个指针和交换操作 | 简单,只需逆序遍历索引即可 |
时间复杂度 | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) |
空间复杂度 | O ( 1 ) O(1) O(1) | O ( 1 ) O(1) O(1) |
修改原数组 | 修改了原数组内容 | 不修改原数组内容 |
适用场景 | 需要使用反转后的数组 | 仅需逆序输出结果即可 |
空间复杂度
修改原数组修改了原数组内容不修改原数组内容适用场景需要使用反转后的数组仅需逆序输出结果即可
在实际开发中,选择哪种实现方法取决于具体需求。如果需要对数组进行多次操作并且对逆序后的结果有后续需求,可以选择方法1;如果仅需输出结果且对原数组不做修改,则方法2是更好的选择。此外,以下是一些扩展建议:
使用标准库函数:
在C++中可以利用std::reverse
对数组或容器进行快速反转,例如:
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> arr = {8, 6, 5, 4, 1};
reverse(arr.begin(), arr.end());
for (int num : arr) {
cout << num << " ";
}
return 0;
}
优化输入输出:
cin.tie(0)
和ios::sync_with_stdio(false)
提高输入输出效率。考虑更多场景:
本文详细分析了数组逆序重排的两种常见实现方法,并对其优缺点和适用场景进行了全面的比较。在实际编程中,应根据具体需求选择合适的方法,同时注意代码的规范性和扩展性。通过学习这道题目,我们不仅掌握了逆序操作的实现,还了解了C++数组操作中的一些技巧和注意事项,这对后续学习和开发都有很大帮助。