反转整数序列

时间:2017-08-05 18:28:56

标签: c++ algorithm c++11

我正在学习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测试用例,这对我来说非常震撼。

如果有人能给我一些关于我的代码或任何有关性能的通用建议的错误,我将非常感激。

2 个答案:

答案 0 :(得分:2)

您的算法是线性的,没有性能问题。看起来你在交换数组元素时遇到了计算索引的问题。

最好不要首先向矢量添加-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::cout

将整个矢量写入std::copy
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 ++,并避免潜在的逐个问题。

答案 1 :(得分:1)

你的问题是当矢量的长度是偶数时

例如,如果您有4个元素,则n = 4-1 = 3

你的循环只会进行一步,因为n / 2 = 3/2 = 1

所以要解决此问题,只需将您的循环更改为此for (int i = 0; i <= n / 2; ++i)

即可