ARTS-WEEK2

"ARTS打卡记录"

Posted by Simon on June 7, 2020

“Better code, better life. ”

ARTS打卡第二周

Algorithm

[题目]leetcode第126题

[题解]

#include <string>

#include <unordered_map>

#include <vector>

#include <queue>

using namespace std;

const int INF = 1 << 20;

class Solution {
private:
    unordered_map<string, int> wordId;
    vector<string> idWord;
    vector<vector<int>> edges;
public:
    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
        int id = 0;
        for (const string& word : wordList) {
            if (!wordId.count(word)) {
                wordId[word] = id++;
                idWord.push_back(word);
            }
        }
        if (!wordId.count(endWord)) {
            return {};
        }
        if (!wordId.count(beginWord)) {
            wordId[beginWord] = id++;
            idWord.push_back(beginWord);
        }
        edges.resize(idWord.size());
        for (int i = 0; i < idWord.size(); i++) {
            for (int j = i + 1; j < idWord.size(); j++) {
                if (transformCheck(idWord[i], idWord[j])) {
                    edges[i].push_back(j);
                    edges[j].push_back(i);
                }
            }
        }
        const int dest = wordId[endWord];
        vector<vector<string>> res;
        queue<vector<int>> q;
        vector<int> cost(id, INF);
        q.push(vector<int>{wordId[beginWord]});
        cost[wordId[beginWord]] = 0;
        while (!q.empty()) {
            vector<int> now = q.front();
            q.pop();
            int last = now.back();
            if (last == dest) {
                vector<string> tmp;
                for (int index : now) {
                    tmp.push_back(idWord[index]);
                }
                res.push_back(tmp);
            } else {
                for (int i = 0; i < edges[last].size(); i++) {
                    int to = edges[last][i];
                    if (cost[last] + 1 <= cost[to]) {
                        cost[to] = cost[last] + 1;
                        vector<int> tmp(now);
                        tmp.push_back(to);
                        q.push(tmp);
                    }
                }
            }
        }
        return res;
    }

    bool transformCheck(const string& str1, const string& str2) {
        int differences = 0;
        for (int i = 0; i < str1.size() && differences < 2; i++) {
            if (str1[i] != str2[i]) {
                ++differences;
            }
        }
        return differences == 1;
    }
};

Review

[文章链接] :http://www.wangafu.net/~nickm/libevent-book/Ref2_eventbase.html

[笔记] :

​ 这是Libevent官方教程中的第二篇,主要介绍了在创建event_base时的一些可选参数。

  • libevent基本支持各平台所有的IO模型

包括:

select

poll

epoll

kqueue

devpoll

evport

win32

  • 默认的event_base

struct event_base *event_base_new(void);

默认的event_base会选择操作系统所支持的最快的IO模型,比如在Linux上默认选择epoll

  • 使用自定义的配置

//创建一个event_config对象
struct event_config *event_config_new(void);
//根据event_config创建event_base
struct event_base *event_base_new_with_config(const struct event_config *cfg);
//回收由event_config_new申请的资源
void event_config_free(struct event_config *cfg);


//该方法能让Libevent不使用method指定的IO模型
int event_config_avoid_method(struct event_config *cfg, const char *method);

enum event_method_feature {
    EV_FEATURE_ET = 0x01,
    EV_FEATURE_O1 = 0x02,
    EV_FEATURE_FDS = 0x04,
};
//该方法能让libevent不使用某些不支持的模型
int event_config_require_features(struct event_config *cfg,
                                  enum event_method_feature feature);

enum event_base_config_flag {
    //无锁的event_base,性能更好但是线程不安全
    EVENT_BASE_FLAG_NOLOCK = 0x01,
    //设置为当选择IO方法时不检查EVENT_*环境变量,使用请慎重!这会让程序更难dubug!
    EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
    //在windows平台使用IOCP模型做IO
    EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
    //设置在每次回调超时后检查当前时间,而不是eventloop就绪时检查,慎用!
    EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
    //改变libevent在使用epoll模型时的一些行为
    EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
    //Libevent默认使用更快速的timer,该设置可以修改为更精确的timer
    EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
};
int event_config_set_flag(struct event_config *cfg,
    enum event_base_config_flag flag);

Tips

使用Clion做远程编译

工作中经常是在Windows开发,而运行环境是在Linux的虚拟机上,十分不方便,而Clion默认支持远程文件同步功能,帮了我很大的忙。

首先在Clion顶部导航栏找到Tools

选择DeploymentConfiguration

在弹出的页面点击+号,添加服务器配置,测试链接

然后选择Mappings,增加一个文件映射

完成后,任何在本地修改的文件都会自动同步到远程服务器!

Share

本周学习了GoogleTest项目,写了一篇博客如下

使用GoogleTest做单元测试