注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
本帖最后由 烤馒头 于 2021-7-9 09:02 编辑
看隔壁问C++刷题有感,分享几个我从刷题中get的小技巧。有些非常好用甚至反哺到我工作当中。
1. 【初级】把count用做contain查看map/set/unordered_map/unordered_set里是否含有key
Before:- if (keyValueMap.find(key) != keyValueMap.end()) {
- ...
- }
复制代码
After:- if (keyValueMap.count(key)) { ...
- }
复制代码
2. 【中级】pair可以直接用auto取值或者取址
2.1 用于直观iterate map/unordered_map
Before:- for (auto it = keyValueMap.begin(); it != keyValueMap.end(); it++) {
- auto key = it->first;
- auto value = it->second;
- ...
- }
复制代码
After: - for (auto& [key, value] : keyValueMap) {
- ...
- }
复制代码
2.2 直角网格题遍历上下左右四个方向
After:- vector<pair<int, int>> dirs {{0,1}, {1,0}, {0,-1}, {-1,0}};
- for (auto& [dx, dy] : dirs) {
- int x = i + dx;
- int y = j + dy;
- ...
- }
复制代码
3. 【高级】可以用lambda function+capture &节省helper method要写的一堆input argument。例:LC 212
Before:- vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
- auto root = buildTrie(words);
- unordered_set<string> ans;
- int m = board.size();
- int n = board[0].size();
- for (int i = 0; i < m; ++i) {
- for (int j = 0; j < n; ++j) {
- dfs(board, m, n, ans, i, j, root);
- }
- }
- ...
- }
- void dfs(vector<vector<char>>& board, int m, int n, unordered_set<string>& ans, int x, int y, TrieNode* node) {
- ...
- dfs(board, m, n, ans, x+1, y, node);
- dfs(board, m, n, ans, x-1, y, node);
- dfs(board, m, n, ans, x, y+1, node);
- dfs(board, m, n, ans, x, y-1, node);
- ...
- }
复制代码
After:- vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
- auto root = buildTrie(words);
- unordered_set<string> ans;
- int m = board.size();
- int n = board[0].size();
- function<void(int, int, TrieNode*)> dfs = [&](int x, int y, TrieNode* node) {
- ...
- for (auto& [dx, dy] : dirs) {
- dfs(x + dx, y + dy, node);
- }
- ...
- };
-
- for (int i = 0; i < m; ++i) {
- for (int j = 0; j < n; ++j) {
- dfs(i, j, root);
- }
- }
- ...
- }
复制代码
这里分享给大家,抛砖引玉。
如果感觉有用,欢迎加米,谢谢!
补充内容 (2021-07-10 13:18 +8:00):
经楼下提醒,我觉得有必要补充一下:第三个技巧仅限在OJ上刷题时使用(尤其参数特别多顺序容易错那种),可以非常清楚地列出来参与递归的参数。
但是建议
面试的时候谨慎使用!!
面试的时候谨慎使用!!
面试的时候谨慎使用!!
假如你不打招呼直接这么写,很有可能面试官看不懂,回头feedback给你个差评说你一个dfs非要用lambda,或者看懂了觉得你在炫技。得不偿失。
面试时还是乖乖把helper拎出来写比较好。 |