“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
选择Deployment
→Configuration
在弹出的页面点击+
号,添加服务器配置,测试链接
然后选择Mappings,增加一个文件映射
完成后,任何在本地修改的文件都会自动同步到远程服务器!
Share
本周学习了GoogleTest项目,写了一篇博客如下