题目描述。
在二维平面上,有一个机器人从原点(0,0)开始。给出它的移动顺序,判断这个机器人在完成移动后能否在(0,0)出结束。
移动顺序由字符串moves表示。字符move[i]表示其第 i
次移动。机器人的有效动作有 R
(右),L
(左),U
(上)和 D
(下)。
如果机器人在完成所有动作后返回原点,则返回 true
。否则,返回 false
。
示例 1:
输入: moves = "UDLR"
输出: true
解释:机器人向上移动一次,然后向下移动一次,向左移动一次,最后向右移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。
解题思路
思路1:
直接模拟,即每次都按照给出的字符做移动,对应:上(-1,0)、下(1,0)、左(0,-1)、右(0,1);每次都做加法操作:p[0] + d[0]、p[1] + d[1];最后比较p[0]==0&&p[1]==0
代码实现1:
import java.util.HashMap;
import java.util.Map;
class Solution {
public boolean judgeCircle(String moves) {
int[] p = new int[]{0, 0};
Map<Character, int[]> map = new HashMap<Character, int[]>();
map.put('R', new int[]{0, 1});
map.put('L', new int[]{0, -1});
map.put('U', new int[]{-1, 0});
map.put('D', new int[]{1, 0});
for (int i = 0; i < moves.length(); i++) {
int[] d = map.get(moves.charAt(i));
p[0] += d[0];
p[1] += d[1];
}
return p[0] == 0 && p[1] == 0;
}
}
思路2:
直接计算移动次数,即左移次数(l)、右移次数(r)、上移次数(u)、下移次数(d);然后比较确保:l==r && u==d
代码实现2:
public boolean judgeCircle(String moves) {
int r = 0;
int l = 0;
int u = 0;
int d = 0;
for (int i = 0; i < moves.length(); i++) {
switch (moves.charAt(i)) {
case 'R':
r++;
break;
case 'L':
l++;
break;
case 'U':
u++;
break;
case 'D':
d++;
break;
default:
throw new RuntimeException("不合法的字符");
}
}
return r == l && u == d;
}
总结
这道题是一个简单题,第一种解法使用了map,并且对位置做加法,耗时比较高;通过第二种解法降低了计算复杂度,耗时也下降了不少。