题目描述
已知一个消息流会不断地吐出整数 1~N
,但不一定按照顺序吐出。如果上次打印的数为 i, 那么当 i+1 出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到 1~N
全部接收 并打印完,请设计这种接收并打印的结构。
题目解析
思路(待补充)
实现
class MessageBox{
struct Node{
std::string info;
Node * next;
explicit Node(std::string &str) : info(str) , next(nullptr) {
}
};
std::map<int, Node *> headMap;
std::map<int, Node *> tailMap;
int waitPoint;
void print_message(){
auto node = headMap[waitPoint];
headMap.erase(waitPoint);
while (node != nullptr){
printf("%s\t", node->info.c_str());
node = node->next;
waitPoint++;
}
tailMap.erase(waitPoint - 1);
printf("\n");
}
public:
MessageBox(){
waitPoint = 1;
}
void receive(int num, std::string &info){
if(num < 1){
return;
}
Node * curr = new Node(info);
headMap[num] = curr;
tailMap[num] = curr;
if(tailMap.count(num - 1)){
tailMap[num - 1]->next = curr;
tailMap.erase(num - 1);
headMap.erase(num);
}
if(headMap.count(num + 1)){
curr->next = headMap[num + 1];
headMap.erase(num + 1);
tailMap.erase(num);
}
if(num == waitPoint){
print_message();
}
}
};
对数器
struct Message{
int num;
std::string info;
};
std::vector<Message> getRandomBox(int N){
if(N <= 1){
N = 10;
}
std::vector<Message> result;
for (int i = 1; i < N; ++i) {
result.emplace_back(Message{i, std::to_string(i)});
}
std::shuffle(result.begin(),result.end(), std::mt19937(std::random_device()()));
return result;
}
int main() {
auto m = getRandomBox(1000);
MessageBox a;
for (int i = 0; i < m.size(); ++i) {
a.receive(m[i].num, m[i].info);
}
return 0;
}