std::set<std::pair<int,int>>中find()的工作机制及代码问题排查
问题解答
关于std::set<std::pair<int,int>>::find()的匹配规则
std::set<std::pair<int,int>>的find()方法会同时匹配pair的两个元素。std::pair的默认比较逻辑是:先比较第一个元素,若第一个元素相等,再比较第二个元素,只有当两个元素完全相等时,才会判定为同一个元素,find()才会找到对应的迭代器。
你的代码问题所在
你的代码存在两处关键逻辑错误:
- 方向坐标修改搞反:
- 方向'W'(西)对应x坐标减小,应改为
x--,而非x++ - 方向'E'(东)对应x坐标增大,应改为
x++,而非x--
- 方向'W'(西)对应x坐标减小,应改为
- 返回值逻辑错误:LeetCode「Path Crossing」问题要求路径交叉时返回
true,你原代码在找到重复坐标时返回false,逻辑完全相反。
修正后的代码如下:
bool isPathCrossing(string s) { set <pair <int, int>> st; int x = 0, y = 0; st.insert(make_pair(x,y)); for(int i = 0; i < s.size(); i++) { if(s[i] == 'N') y++; else if(s[i] == 'W') x--; else if(s[i] == 'S') y--; else x++; pair <int, int> pr = make_pair(x, y); if(st.find(pr) != st.end()) return true; st.insert(pr); } return false; }
内容的提问来源于stack exchange,提问作者Atmaram
相关产品推荐
相关产品推荐

