普通视图

发现新文章,点击刷新页面。
今天 — 2026年4月5日首页

三行代码搞定!还能有人比我短?

作者 Time-Limit
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'];
  }
};

如果感觉有点意思,那就关注一下【我的公众号】吧~

image.png


看了评论区老铁们的花式短代码,感觉熟练掌握 STL 属实能提高生产力。
推荐一本 《C++ 标准库》,关注公众号,回复 "CPP标准库(第二版)" 即可获取下载方式。

❌
❌