这是54345而不是54321? 我想如果N是5 - 我是3它的2减1应该是一个我根本不知道它会如何增加呢?
const int N = 5;
typedef int AList[N];
int main()
{
AList A = {1, 2, 3, 4, 5};
for (int I = 0; I < 5; I++) {
A[I] = A[N-I-1];
}
for (int I = 0; I < 5; I++) {
cout << A[I];
}
}
答案 0 :(得分:10)
这是54345而不是54321?我想如果N是5 - 我是3它的2减1应该是一个我根本不知道它会如何增加呢?
随着第一个循环的进行,您不会对其原始值进行操作,而是对您在循环的早期迭代中已经处理过的值进行操作:
for (int I = 0; I < 5; I++) {
A[I] = A[N-I-1];
}
A[0]
设为A[4]
= 5
A[1]
设为A[3]
= 4
A[2]
设为A[2]
= 3
A[3]
设为A[1]
= 4
(曾经是2
,但你在迭代2中改变了它!)A[4]
设为A[0]
= 5
(曾经是1
,但你在迭代1中改变了它!)您需要两个阵列 - 源和目标 - 才能正确执行此操作,或者为了提高效率,swap
这些元素(而不是覆盖它们)循环迭代到输入数组的中点:
for (int i = 0; i < N/2; i++) {
std::swap(A[i], A[N-i-1]);
}
当然,您可以通过简单地要求C ++标准库为您完成工作来避免所有:
std::reverse(std::begin(A), std::end(A));
(感谢this last suggestion的@dasblinkenlight)
答案 1 :(得分:3)
这是代码逻辑的问题:一旦你这样做了
A[I] = A[N-I-1];
在第一次迭代中,1
已经一去不复返了。您的阵列现在看起来像这样:
5 2 3 4 5
并且无法将1
放回原处。该数组应该看起来像这样
5 2 3 4 1
这意味着您需要交换这两个元素。
执行您要做的事情的正确方法是循环到数组的中间,并使用交换而不是赋值(通过函数std::swap
或自己编写交换)
保留大部分代码的修复程序如下
for (int I = 0; I < 2 /*stop at the middle*/; I++) {
std::swap(A[I], A[N-I-1]);
}
使用标准C ++库充分发挥潜力的修复
std::reverse(std::begin(A), std::end(A));