网易雷火9.13笔试题最后一题

不得不说这次的笔试题太恶心了,第四题题目读了十分钟,写代码两小时,还是太菜了
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <unordered_map>
using namespace std;

vector<string> parseCommand(char* str) {
    vector<string> ret;
    string str_buf = "";
    for (size_t i = 0; i < 200 && str[i] != '\0'; i++) {
        if (str[i] == ' ') {
            ret.push_back(str_buf);
            str_buf = "";
        }
        else {
            str_buf += str[i];
        }
    }
    if (str_buf.size() != 0) {
        ret.push_back(str_buf);
    }

    return ret;
}

class RedNode {
public:
    RedNode() {}
    RedNode(string name, int status) : node_name(name), node_status(status) {}
    
    void setVisible() {
        this->node_status = 1;
    }
    
    void setInvisible() {
        this->node_status = 0;
    }
    
    bool getStatus() {
        return this->node_status == 1 ? true : false;
    }
    
    string getName() {
        return this->node_name;
    }
private:
    string node_name;
    int node_status;
};

class RedNodeSet {
public:
    RedNodeSet() {}
    RedNodeSet(string name) : node_set_name(name), node_set_number(0) {}
    
    void insert(RedNode* node) {
        this->red_node_list.insert(node);
        this->node_set_number++;
    }
    
    bool getStatus() {
        bool ret = false;
        for (auto iter = this->red_node_list.begin(); iter != this->red_node_list.end(); iter++) {
            ret |= (*iter)->getStatus();
        }
        return ret;
    }
    
    string getName() {
        return this->node_set_name;
    }
private:
    string node_set_name;
    int node_set_number;
    set<RedNode*> red_node_list;
};

class Button {
public:
    Button() {}
    Button(string name) : button_name(name), bind_node_number(0), bind_set_number(0) {}
    
    void insert(RedNode* red_node) {
        this->red_node_list.insert(red_node);
        this->bind_node_number++;
    }
    
    void insert(RedNodeSet* red_set) {
        this->red_set_list.insert(red_set);
        this->bind_set_number++;
    }
    
    bool getStatus() {
        bool ret = false;
        for (auto iter = this->red_node_list.begin(); iter != this->red_node_list.end(); iter++) {
            ret |= (*iter)->getStatus();
        }
        
        for (auto iter = this->red_set_list.begin(); iter != this->red_set_list.end(); iter++) {
            ret |= (*iter)->getStatus();
        }
        return ret;
    }
    
    void removeNode(RedNode* node) {
        this->red_node_list.erase(node);
        this->bind_node_number--;
    }
    
    void removeSet(RedNodeSet* set) {
        this->red_set_list.erase(set);
        this->bind_set_number--;
    }

	void insertNode(RedNode* node) {
		this->red_node_list.insert(node);
		this->bind_node_number++;
	}

	void insertSet(RedNodeSet* set) {
		this->red_set_list.insert(set);
		this->bind_node_number++;
	}
    
    set<RedNode*>& getRedNodeList() {
        return this->red_node_list;
    }
    
    set<RedNodeSet*>& getRedSetList() {
        return this->red_set_list;
    }
private:
    string button_name;
    int bind_node_number;
    int bind_set_number;
    set<RedNode*> red_node_list;
    set<RedNodeSet*> red_set_list;
};


class Panel {
public:
    Panel() {}
    Panel(string name) : panel_name(name), bind_button_number(0) {}
    
    void insert(Button* button) {
        this->button_list.insert(button);
        this->bind_button_number++;
    }
    
    bool getStatus() {
        bool ret = false;
        for (auto iter = this->button_list.begin(); iter != this->button_list.end(); iter++) {
            ret |= (*iter)->getStatus();
        }
        return ret;
    }
    
    string getName() {
        return this->panel_name;
    }
private:
    string panel_name;
    int bind_button_number;
    set<Button*> button_list;
};

int main() {
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    
    unordered_map<string, RedNode*> red_node_map;
    unordered_map<string, RedNodeSet*> red_set_map;
    unordered_map<string, Button*> button_map;
    unordered_map<string, Panel*> panel_map;
    
    // add redNode
    for (int i = 0; i < n; i++) {
        string name;
        int status;
        cin >> name >> status;
        RedNode* new_node = new RedNode(name, status);
        red_node_map[name] = new_node;
    }
    
    // add redNodeSet
    for (int i = 0; i < m; i++) {
        string name;
        int cnt;
        cin >> name >> cnt;
        RedNodeSet* new_node_set = new RedNodeSet(name);
        red_set_map[name] = new_node_set;
        for (int j = 0; j < cnt; j++) {
            string red_node_name;
            cin >> red_node_name;
            if (red_node_map.find(red_node_name) != red_node_map.end()) {
                new_node_set->insert(red_node_map[red_node_name]);
            }
        }
    }
    
    // add Button
    for (int i = 0; i < x; i++) {
        string name;
        int cnt;
        cin >> name >> cnt;
        Button* new_button = new Button(name);
        button_map[name] = new_button;
        for (int j = 0; j < cnt; j++) {
            string red_node_name;
            cin >> red_node_name;
            // search in the red_node_map
            if (red_node_map.find(red_node_name) != red_node_map.end()) {
                new_button->insert(red_node_map[red_node_name]);
            }
            // search in the red_set_map
            else if (red_set_map.find(red_node_name) != red_set_map.end()) {
                new_button->insert(red_set_map[red_node_name]);
            }
        }
    }
    
    // add Panel
    for (int i = 0; i < y; i++) {
        string name;
        int cnt;
        cin >> name >> cnt;
        Panel* new_panel = new Panel(name);
        panel_map[name] = new_panel;
        for (int j = 0; j < cnt; j++) {
            string button_name;
            cin >> button_name;
            if (button_map.find(button_name) != button_map.end()) {
                new_panel->insert(button_map[button_name]);
            }
        }
    }
    
    int s;
    cin >> s;
    
    char buf[200];
    cin.getline(buf, 200);
    
    while (s--) {
        cin.getline(buf, 200);
        vector<string> command = parseCommand(buf);
        
        if (command[0] == "Show" && command.size() == 2) {
            string red_node_name = command[1];
            if (red_node_map.find(red_node_name) != red_node_map.end()) {
                red_node_map[red_node_name]->setVisible();
            }
        }
        else if (command[0] == "Hide" && command.size() == 2) {
            string red_node_name = command[1];
            if (red_node_map.find(red_node_name) != red_node_map.end()) {
                red_node_map[red_node_name]->setInvisible();
            }
        }
        else if (command[0] == "Ask" && command.size() == 2) {
            string tmp_name = command[1];
            // search in the button map
            if (button_map.find(tmp_name) != button_map.end()) {
                if (button_map[tmp_name]->getStatus()) {
                    cout << "YES" << endl;
                }
                else {
                    cout << "NO" << endl;
                }
            }
            // searhc in the panel map
            else if (panel_map.find(tmp_name) != panel_map.end()) {
                if (panel_map[tmp_name]->getStatus()) {
                    cout << "YES" << endl;
                }
                else {
                    cout << "NO" << endl;
                }
            }
        }
        else if (command[0] == "Remove" && command.size() == 3) {
            string button_name = command[1];
            string node_name = command[2];
            if (button_map.find(button_name) != button_map.end()) {
                Button* button = button_map[button_name];

                for (auto iter = button->getRedNodeList().begin(); iter != button->getRedNodeList().end(); iter++) {
                    if ((*iter)->getName() == node_name) {
                        button->removeNode(*iter);
						break;
                    }
                }

                for (auto iter = button->getRedSetList().begin(); iter != button->getRedSetList().end(); iter++) {
                    if ((*iter)->getName() == node_name) {
                        button->removeSet(*iter);
						break;
                    }
                }
            }

			for (auto iter = panel_map.begin(); iter != panel_map.end(); iter++) {
				Panel* cur_panel = iter->second;
				if (cur_panel->getStatus()) {
					cout << cur_panel->getName() << endl;
				}
			}
        }
        else if (command[0] == "Bind" && command.size() == 3) {
            string button_name = command[1];
            string node_name = command[2];
            if (button_map.find(button_name) != button_map.end()) {
                Button* button = button_map[button_name];
                if (red_node_map.find(node_name) != red_node_map.end()) {
					button->insert(red_node_map[node_name]);
				}
				else if (red_set_map.find(node_name) != red_set_map.end()) {
					button->insert(red_set_map[node_name]);
				}
            }

			for (auto iter = panel_map.begin(); iter != panel_map.end(); iter++) {
				Panel* cur_panel = iter->second;
				if (cur_panel->getStatus()) {
					cout << cur_panel->getName() << endl;
				}
			}
        }
    }
    
    
    return 0;
}


#笔试题目##网易雷火#
全部评论
这可能就是巨佬吧
点赞 回复 分享
发布于 2020-09-14 09:16

相关推荐

11-02 08:15
已编辑
门头沟学院 Java
美团 Java后端开发 10w刀 美硕
YamadaAnna:包留美的,你拿的美团 招银,没一个不加班的。考虑一下未来吧,应届生的工资真不重要,10w刀税后6w,省省还是能活下去的。回国了35岁怎么办,难道35岁还能返美么,就算35岁还能在国内找到工作,难道打算一辈子9点10点下班么。你有能力在美利坚找到工作,回国如果不是哪个965大厂给你发个ssp,真不值得。 等抽不中h1b,没办法了再回国吧。
点赞 评论 收藏
分享
10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务