问题:
Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this robot makes a circle, which means it moves back to the original place.
The move sequence is represented by a string. And each move is represent by a character. The valid robot moves are R
(Right), L
(Left), U
(Up) and D
(down). The output should be true or false representing whether the robot makes a circle.
Example 1:
Input: "UD" Output: true
Example 2:
Input: "LL" Output: false
解决:
【注】 题意是机器人初始在(0,0)位置,判断该机器人上下左右移动之后,是否又回到了原位置。
① 可以返回原点的情况该字符串的长度一定可以被2整除,使用hash table进行上下左右的匹配。
public class Solution { // 31ms
public boolean judgeCircle(String moves) {
if(moves == null || moves.length() == 0) return true;
int hash[] = new int[26];
int len = moves.length();
for (int i = 0;i < len ;i ++ ) {
if(moves.charAt(i) == 'U') hash['U' - 'A'] ++;
if(moves.charAt(i) == 'D') hash['U' - 'A'] --;
if(moves.charAt(i) == 'L') hash['L' - 'A'] ++;
if(moves.charAt(i) == 'R') hash['L' - 'A'] --;
}
for(int n : hash){
if(n != 0) return false;
}
return true;
}
}
② 简化版
class Solution {//16ms
public boolean judgeCircle(String moves) {
int pu = 0;
int pl = 0;
for(char c : moves.toCharArray()){
if(c == 'U') pu ++;
if(c == 'D') pu --;
if(c == 'L') pl ++;
if(c == 'R') pl --;
}
return pu == 0 && pl == 0;
}
}
③ 进化版
public class Solution { // 9ms
public boolean judgeCircle(String moves) {
int[] hash = new int[26];
for (char c : moves.toCharArray()){
hash[c - 'A'] ++;
}
if (hash['L' - 'A'] == hash['R' - 'A'] && hash['U' - 'A'] == hash['D' - 'A']) return true;
return false;
}
}