机器人能否回到原点

LeetCode每日一题,657. RobotReturnToOrgin

先看题目描述

大意就是 moves 代表机器人如何移动,L 代表左移,R 代表右移,U 代表上移,D 代表下移,每次移动的步伐一致,问最后能否回到原点

算法和思路

这题很简单,直接模拟机器人移动就行,x 和 y 代表机器人的坐标,L 就 x - 1,R 就 x + 1,U 就 y + 1,D 就 y - 1,最后看 x 和 y 是否都等于 0 就可以

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public boolean judgeCircle(String moves) {
if (moves.length() % 2 != 0 ) return false;
int x = 0, y = 0;
for (char c: moves.toCharArray()) {
switch (c) {
case 'U': y++; break;
case 'D': y--; break;
case 'L': x--; break;
case 'R': x++; break;
}
}
return x == 0 && y == 0;
}
}

后来去看时间击败 100% 的代码,发现思路基本一致,就是别人是计算 L 的出现次数是否等于 R 的出现次数,U 的出现次数是否等于 D 的出现次数,然后实现的代码更加巧妙一点,节省了运算时间。代码中使用了 letters[‘A’ + 26],其实这里面就是 java 会自动把 A 换成其 ASII 码,letters[‘A’ + 26] 其实就是创建了一个长度为 91 的数组,letters[‘Z’] 其实就是 letters[90]

1
2
3
4
5
6
7
8
9
class Solution {
public boolean judgeCircle(String moves) {
int[] letters = new int[26 + 'A']; // 创建一个长度为 91 的数组,A 会自动换为其 ASCII 码
for (char c : moves.toCharArray()) {
letters[c]++;
}
return letters['U'] == letters['D'] && letters['L'] == letters['R']; // letters['Z'] 就是 letters[90]
}
}