2020年8月28日 机器人能否返回原点 judgeCircle
class Solution {
public boolean judgeCircle(String moves) {
}
}
解题思路:
这。这道题有些简单,我们只需要记录下机器人的坐标,假设机器人的初始左边是(0,0),当他R的时候,横坐标+1也就是x+1,当他L的时候,横坐标-1,也就是x-1。
最后,我们读取完他走过的所有路程后,判断他是否在原点就可以了。
public boolean judgeCircle(String moves) {
int len=moves.length();
int x=0;
int y=0;
char now;
for (int i=0;i<moves.length();i++){
now=moves.charAt(i);
if (now=='R'){
x++;
}else if(now=='L'){
x--;
}else if(now=='U'){
y++;
}else{
y--;
}
}
if (x==0&&y==0)
return true;
else
return false;
}
思路2:
对于这个结果我是不满意的,因为居然有更简单的方法我居然没想到?越是简单的题越是能体现出代码的优秀程度,比如,我如果不将每一个字符取出,使用==if(moves.charAt(i)==‘R’)==这样子的方法,那么时间会大大增加。
再比如,我如果不使用else,那么判断的次数会增加,复杂度也会上升,使用else就是当匹配到字符后会跳过之后的判断,判断的次数在1-3之间,而不使用else会固定判断四次。
最终优化版:
1,删除了变量len,减少了获取对象值的过程。
2,使用获取数组来遍历,代替调用charAt()方法,更高效。
public boolean judgeCircle(String moves) {
int x=0;
int y=0;
char[] chars = moves.toCharArray();
for (char achar : chars) {
if (achar=='R'){
x++;
}else if(achar=='L'){
x--;
}else if(achar=='U'){
y++;
}else{
y--;
}
}
if (x==0&&y==0)
return true;
else
return false;
}
别人家的算法:
这个方法我也想过了,但是想到为了一个长度为4的数组要申请一个长度为26的数组,浪费了大量(85%)的空间,强迫症受不了。但是他确实是最快的,他的优秀之处就在于他不需要进行判断,直接对数组进行了处理,也就是把我们的平均2次降低到了稳定一次。
public boolean judgeCircle(String moves) {
int[] letters = new int[26 + 'A'];
for (char c : moves.toCharArray()) {
letters[c]++;
}
return letters['U'] == letters['D'] && letters['L'] == letters['R'];
}