在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。
示例 1:
输入: "UD"
输出: true
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。
示例 2:
输入: "LL"
输出: false
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。
思路:
一开始是用2个栈分别保存 上下 和 左右的信息,像消消乐一样消去栈中元素,如果最终栈为空,就能回到原点
运行后发现很慢,估计是维护了两个栈,还调用了很多次的函数
参考答案后发现自己做的很多余也很麻烦,直接用2个变量就能保存上下和左右的信息了.
1 class Solution657 {
2
3 public boolean judgeCircle(String moves) {
4 Stack<Character> stackUD = new Stack<>();
5 Stack<Character> stackLR = new Stack<>();
6 for (int i = 0; i < moves.length(); i++) {
7 char currChar = moves.charAt(i);
8 switch (currChar) {
9 case 'U':
10 case 'D':
11 if (!stackUD.empty() && !stackUD.peek().equals(currChar)) {
12 stackUD.pop();
13 } else {
14 stackUD.push(currChar);
15 }
16 break;
17 case 'L':
18 case 'R':
19 if (!stackLR.empty() && !stackLR.peek().equals(currChar)) {
20 stackLR.pop();
21 } else {
22 stackLR.push(currChar);
23 }
24 break;
25 default:
26 }
27 }
28 return stackLR.empty() && stackUD.empty();
29 }
30
31 public boolean judgeCircle_2(String moves) {
32 char[] chars = moves.toCharArray();
33 int level = 0;
34 int vertical = 0;
35 for (char c : chars) {
36 switch (c) {
37 case 'L':
38 --level;
39 break;
40 case 'R':
41 ++level;
42 break;
43 case 'U':
44 ++vertical;
45 break;
46 case 'D':
47 --vertical;
48 break;
49 default:
50 }
51 }
52 return level == 0 && vertical == 0;
53 }
54 }