三行代码搞定!还能有人比我短?
2020年8月27日 23:20
模拟
最直白的思路非模拟莫属。
设机器人的坐标为 (x, y)。
显然初始时,机器人在原点,即 x = 0, y = 0。
然后遍历整个字符串 moves,根据具体的方向更新 x 或 y。
最后判断 x, y 是否均为 0,即是否又回到了原点。
###cpp
class Solution {
public:
bool judgeCircle(string moves) {
int x = 0, y = 0;
for (auto move: moves) {
switch (move) {
case 'U': y--; break;
case 'D': y++; break;
case 'L': x--; break;
case 'R': x++; break;
}
}
return x == 0 && y == 0;
}
};
统计字符数量
让我们先把问题简化为一维问题,即机器人只在 X 轴上移动。
假设机器人朝着正方向移动了 R 次,朝着负方向移动了 L 次。
无论这 L+R 次如何排列,最后的机器人在 X 轴上的坐标必为 R - L。即当 R == L 时,机器人才能回到 0 处。
同理,在二维平面上,分别向上下左右四个方向移动了,U,D,L,R 次,当且仅当 L == R 且 U == D 时,机器人才能回到原点。
那么问题,就变成了统计 moves 里各个字符出现的次数。三行搞定 ~
###cpp
class Solution {
public:
bool judgeCircle(const string &moves) {
std::unordered_map<char, int> cnt;
std::for_each(moves.begin(), moves.end(), [&cnt](char c) { cnt[c]++; });
return cnt['U'] == cnt['D'] && cnt['L'] == cnt['R'];
}
};
如果感觉有点意思,那就关注一下【我的公众号】吧~
![]()
看了评论区老铁们的花式短代码,感觉熟练掌握 STL 属实能提高生产力。
推荐一本 《C++ 标准库》,关注公众号,回复 "CPP标准库(第二版)" 即可获取下载方式。