2017-08-05 88 views
-3

我學習C++,最近遇上這個問題的順序。這個'-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個測試用例,這對我來說非常震撼。

如果有人能給我一些關於我的代碼或任何關於性能的一般性建議的錯誤提示,我將不勝感激。

+0

順便說一句:O(N^2/2)= O(N^2) –

+1

嘗試'爲(I = 0 ; i

+0

你試過什麼樣的測試案例? –

回答

1

您的問題是當矢量的長度是偶數

例如,如果你有4種元素的N = 4-1 = 3

你的循環將走一步只爲N/2 = 3/2 = 1

所以解決這個問題只是改變你的循環本for (int i = 0; i <= n/2; ++i)

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::copy寫入整個向量std::cout

std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " ")); 

編輯:這爲研究目的,所以我不能使用std ::反向

那麼你應該重寫迭代器的循環,並std::iter_swap

auto first = vector.begin(); 
auto last = vector.end(); 
while ((first != last) && (first != --last)) { 
    std::iter_swap(first++, last); 
} 

一般情況下,要避免使用索引來支持迭代器,以使代碼成爲慣用的C++,並避免潛在的偏離問題。

+0

非常感謝您的評論,非常有幫助。實際上,我的輸入循環就像你一樣,但我不確定檢查n是否是-1 n次是好的。所以我想出了一個想法,在沒有檢查的情況下擦掉它。這是爲了學習的目的,所以我不能使用std :: reverse。 – Monstryyy

+0

@Monstryyy你的代碼也會檢查n次。檢查是否處於循環狀態並不重要。 – HolyBlackCat

+0

@HOLBlackCat事實上,你是絕對正確的!我想我太愚蠢了,不知何故,我在這麼簡單的任務中做了所有可能的錯誤。並感謝迭代器,我一定會看看他們。 – Monstryyy