算法:一种消息接收并打印的结构设计

题目描述

已知一个消息流会不断地吐出整数 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值