0%

机器人能否返回原点

题目地址

难度:

题目描述:

在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。

移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。

注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。

示例1:

1
2
3
输入: "UD"
输出: true
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。

示例2:

1
2
3
输入: "LL"
输出: false
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。
🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️解题过程🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️
解题过程:

思路:

直接模拟就好了,用(x,y)坐标表示,遍历字符串,如果是R字符则x加1,U表示y加1,最后判断x和y是否是0就可以了。

c++代码:(执行用时16ms,击败82.98%,内存消耗8.1M,击败16.74%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
bool judgeCircle(string moves) {
int x=0,y=0;
for(int i=0;i<moves.length();++i){
if(moves[i]=='R'){
++x;
}else if(moves[i]=='L'){
--x;
}else if(moves[i]=='U'){
++y;
}else if(moves[i]=='D'){
--y;
}
}
if(x==0 && y==0){
return true;
}else{
return false;
}
}
};
💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎官 方 题 解💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎
官方题解:

方法一: 模拟

思路与算法

我们只需按指令模拟机器人移动的坐标即可。起始时机器人的坐标为 $(0,0)$,在遍历完所有指令并对机器人进行移动之后,判断机器人的坐标是否为 $(0,0)$ 即可。

具体来说,我们用两个变量 xx 和 yy 来表示机器人当前所在的坐标为 $(x,y)$,起始时 $x=0$,$y=0$。接下来我们遍历指令并更新机器人的坐标:

如果指令是 $U$,则令 $y=y-1$
如果指令是 $D$,则令 $y=y+1$
如果指令是 $L$,则令 $x=x-1$
如果指令是 $R$,则令 $x=x+1$
最后判断 $(x,y)$ 是否为 $(0,0)$即可。

c++代码:(执行用时12ms,击败97.42%,内存消耗8.3M,击败5.04%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool judgeCircle(string moves) {
int x = 0, y = 0;
for (const auto& move: moves) {
if (move == 'U') {
y--;
}
else if (move == 'D') {
y++;
}
else if (move == 'L') {
x--;
}
else if (move == 'R') {
x++;
}
}
return x == 0 && y == 0;
}
};

复杂度分析

  • 时间复杂度: $O(N)$,其中 $N$ 表示 $\textit{moves}$ 指令串的长度。我们只需要遍历一遍字符串即可。

  • 空间复杂度: $O(1)$。我们只需要常数的空间来存放若干变量。

⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳总 结⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳
总结:

官方题解和我的思路一样,不过有值得学习的地方。第一点可以改用增强for循环,第二点return返回时使用逻辑表达式,不像我用了if判断😆,题目还比较简单。

------------- THE END! THANKS! -------------