反转整数序列
Posted
技术标签:
【中文标题】反转整数序列【英文标题】:Reversing sequence of integers 【发布时间】:2017-08-05 18:28:56 【问题描述】:我正在学习 C++,最近遇到了这个问题:
来自 std::cin 的正整数的反向序列,当接近 -1 时序列结束。这个“-1”不应该是序列的一部分。打印出逆序,也必须以-1结尾。
所以,我已经编写了非常简单的代码来做到这一点,就性能而言,它可能不是最好的,好像我算对了,总体 O(N^2 / 2)。
int n = 0;
vector<int> numbers; //placeholder vector for input
while (n != -1)
cin >> n;
numbers.push_back(n);
numbers.erase(numbers.end() - 1); // -1 should not be the part of the vector, so I erase it
n = numbers.size() - 1;
for (int i = 0; i < n / 2; ++i) //swapping
int tmp = numbers[i];
numbers[i] = numbers[n - i];
numbers[n - i] = tmp;
for (auto a : numbers) //printing out
cout << a << " "; //each integer in input and output is separated by spacebar
cout << -1; //last element should be '-1'
不幸的是,这段代码通过了 4/10 的测试用例,这让我很震惊。
如果有人能给我一些关于我的代码有什么问题的提示或关于性能的任何一般性建议,我将不胜感激。
【问题讨论】:
顺便说一句:O(N^2/2) = O(N^2) 试试for (i = 0; i < n; ++i, --n)
并将 n - i
替换为 n
?
您尝试在自己身上运行哪些测试用例?
@PaulHankin 他们不是我的,只是没有任何描述的自动化测试用例。无论如何,我犯了一个现在发现的愚蠢错误。谢谢。
【参考方案1】:
您的算法是线性的,没有性能问题。您在交换数组元素时似乎遇到了计算索引的问题。
您最好不要一开始就将-1
添加到向量中。此外,应使用std::reverse
进行反转。您还应该注意输入的过早结束,以确保如果从未输入过-1
,您的程序不会挂起:
std::vector<int> numbers;
int n;
while (std::cin >> n)
if (n == -1) break;
numbers.push_back(n);
std::reverse(numbers.begin(), numbers.end());
您的输出部分看起来不错,尽管您应该在输出末尾添加 std::endl
或 '\n'
:
std::cout << -1 << std::endl;
您还可以使用std::copy
将整个向量写入std::cout
:
std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
编辑:这是为了学习目的,所以我不能使用std::reverse
然后你应该用迭代器和std::iter_swap
重写你的循环:
auto first = vector.begin();
auto last = vector.end();
while ((first != last) && (first != --last))
std::iter_swap(first++, last);
一般来说,您希望避免使用有利于迭代器的索引,以使您的代码成为惯用的 C++ 代码,并避免潜在的一对一问题。
【讨论】:
非常感谢您的评论,非常有帮助。实际上,我首先像您一样进行了输入循环,但我不确定检查 n 是否为 -1 n 次是否好。所以我想出了在不检查的情况下将其删除的想法。这是为了学习目的,所以我不能使用 std::reverse。 @Monstryyy 您的代码也检查了 n 次。检查是否在循环条件中并不重要。 @HolyBlackCat 确实,你说得对!我想我太愚蠢了,不知怎的,我在如此简单的任务中犯了所有可能的错误。感谢迭代器,我一定会看看它们。【参考方案2】:你的问题是当向量的长度是偶数时
例如,如果您有 4 个元素,则您的 n = 4-1 = 3
你的循环只会走一步 n/2 = 3/2 = 1
所以要解决这个问题,只需将循环更改为 for (int i = 0; i <= n / 2; ++i)
【讨论】:
以上是关于反转整数序列的主要内容,如果未能解决你的问题,请参考以下文章