阿里15實習生招聘筆試 字符保序輸出問題

題目:

分佈式系統中的RPC請求經常出現亂序的情況。
寫一個算法來將一個亂序的序列保序輸出。例如,假設起始序號是1,對於(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)這個序列,輸出是:
1
2
3, 4, 5
6
7, 8, 9, 10
 
上述例子中,3到來的時候會發現4,5已經在了。因此將已經滿足順序的整個序列(3, 4, 5)輸出爲一行。
 
要求:
1. 寫一個高效的算法完成上述功能,實現要儘可能的健壯、易於維護
2. 爲該算法設計並實現單元測試


#include<iostream>
#include<vector>
using namespace std;
class Queue
{
public:
int val;
int num;
Queue()
{
num = 0;
val = 0;
}
};
int main()
{
vector<Queue> queue;
int temp,num=0;
do                                                                 //接收輸入,作爲無序序列
{
cin >> temp;
Queue * p = new Queue;
p->val = temp;
p->num = ++num;
queue.push_back(*p);
if (cin.get() == '\n')
break;
} while (1);
vector<Queue> cpy;                                 //拷貝一份
for (auto i : queue)
cpy.push_back(i);
for (auto begin = cpy.begin(), end = cpy.end(); begin != end;--end)                   //冒泡排序
{
for (auto it = begin; it != (end-1); ++it)
{
if (it->val > (it + 1)->val)
{
Queue * p = new Queue;
p->num = it->num;
p->val = it->val;
it->num = (it + 1)->num;
it->val = (it + 1)->val;
(it + 1)->num = p->num;
(it + 1)->val = p->val;
}
}
}
temp = 1;
for (auto i : cpy)                                   //保序輸出
{
if (i.num <= temp)                              //若當前數字編號小於輸出的最大編號,則直接輸出不需換行
cout << i.val << " ";
else                                                      //否則當前編號成爲最大編號,並且換行
{
temp = i.num;
cout << endl;
cout << i.val << " ";
}
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章