每日一题算法:2020年8月28日 [机器人能否返回原点] judgeCircle

本文探讨了一道算法题目——机器人能否返回原点(judgeCircle),解题思路包括通过跟踪机器人坐标变化判断及优化代码效率,讨论了不同方法的优缺点,如减少判断次数和空间利用率。
摘要由CSDN通过智能技术生成

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'];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值