暑期代码每日一练Day3:874. 模拟行走机器人

这篇具有很好参考价值的文章主要介绍了暑期代码每日一练Day3:874. 模拟行走机器人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

874. 模拟行走机器人
暑期代码每日一练Day3:874. 模拟行走机器人,# LeetCode刷题 总结,java,方向数组,哈希表
暑期代码每日一练Day3:874. 模拟行走机器人,# LeetCode刷题 总结,java,方向数组,哈希表
暑期代码每日一练Day3:874. 模拟行走机器人,# LeetCode刷题 总结,java,方向数组,哈希表
暑期代码每日一练Day3:874. 模拟行走机器人,# LeetCode刷题 总结,java,方向数组,哈希表


分析

这道题就是个简单的模拟
主要有两点考察点:

  • 方向数组的运用
    方向数组存储的是各个方向的单位向量,也即:
方向 X Y
向北 0 1
向东 1 0
向南 0 -1
向西 -1 0

存储在数组中,则是方向数组:

int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};

我们很容易发现:

dx[0]  //北方
dx[1]  //东方
dx[2]  //南方
dx[3]  //西方

我们可以使用一个变量j来指示当前处于什么方向,j始终只有0、1、2、3这四个取值,指示北、东、南、西四个方向,那么怎么实现j在这三个取值之间来回有序切换呢?
我们可以利用去模运算,假设我们初始面向北方,即j为0,那么当我们想向左转的时候,是面向西方,则j要相应的变为3,这时,我们进行的操作是(j-1+4)%4,为什么还要+4呢?因为负数对正数去模,还是负数,就出了范围,这里我们通过加上一个模数4的倍数,来使结果始终为正数。
因此,我们总结转向操作的实现:文章来源地址https://www.toymoban.com/news/detail-599355.html

j = (j-1+4)%4;   // 左转
j = (j+1+4)%4;   // 右转
  • 怎么实现快速判断当前点是否在障碍物点集中
    这里我们可以利用HashSet
    把障碍物点以String字符串的形式存放在HashSet中。
    在Java中,如果您在HashSet中存放字符串,那么每次调用contains方法,底层判断两个字符串相等与否时,调用的是equals方法而不是==运算符。
    这是因为==运算符比较的是两个对象的引用地址,即它们是否指向同一个内存地址。而String类重写了equals方法,比较的是两个字符串的内容是否相等,而不是它们的引用地址

代码

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {
        // 设置方向数组 初始为y轴方向 往大是向右转,往小是向左转
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        int cur_x = 0,cur_y = 0; // 当前位置 初始为0
        int max_dis = 0;         // 最大欧氏距离

        // 创建一个障碍物点集
        PointSet pointSet = new PointSet(obstacles);
        int j = 0;  //控制方向   始终在0 1 2 3的范围内
        for(int i=0;i<commands.length;i++){
            int op = commands[i];
            if(op>=1&&op<=9){
                int[] point = new int[2];  //下一步试探点
                while(op>0){
                    point[0] = cur_x+dx[j];
                    point[1] = cur_y+dy[j];
                    //试探下一步能不能走
                    if(pointSet.contains(point))   //被建筑物挡住不能走
                        break;
                    else{   //能走,则走,且在走的过程中把最大欧氏距离的平方更新
                        cur_x = cur_x+dx[j];
                        cur_y = cur_y+dy[j];
                        max_dis = Math.max(max_dis,cur_x*cur_x+cur_y*cur_y);
                    }
                    op--;
                }
            }
            else if(op==-2){
                j = (j-1+4)%4;   // 左转
                continue;
            }
            else if(op==-1){
                j = (j+1+4)%4;   // 右转
                continue;
            }
        }
        return max_dis;
    }
}
//哈希set 高效判断该点是否存在
public class PointSet {
    private HashSet<String> pointSet;
    // 构造函数 参数是一个二维点集
    public PointSet(int[][] points) {
        pointSet = new HashSet<>();
        // 把点集中的点都加进去
        for (int[] point : points) {
            pointSet.add(point[0] + "," + point[1]);  //以字符串形式存储
        }
    }

    public boolean contains(int[] point) {
        return pointSet.contains(point[0] + "," + point[1]);
    }
}

到了这里,关于暑期代码每日一练Day3:874. 模拟行走机器人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​LeetCode解法汇总874. 模拟行走机器人

    https://github.com/September26/java-algorithms 机器人在一个无限大小的 XY 网格平面上行走,从点  (0, 0)  处开始出发,面向北方。该机器人可以接收以下三种类型的命令  commands  : -2  :向左转  90  度 -1  :向右转  90  度 1 = x = 9  :向前移动  x  个单位长度 在网格上有一些格子

    2024年02月11日
    浏览(29)
  • 1041.困于环中的机器人 && 874.模拟行走的机器人 && 模拟行走的机器人 2 (三道机器人的模拟题)

    对于直接行走类的题,我们都可以用 int[][] dirs = new int[][]{{0,1}, {-1,0}, {0,-1}, {1,0}}; 来表示向 北 西 南 东 走一步 可以 int x = 0, y = 0, d = 0 xy 表示坐标,d表示方向,要和上面表示的方向对应 由于是对应的 d = 0 表示北 d = 1 表示西 d = 2 表示南 d = 3 表示东 即逆时针一圈 左转: d =

    2024年02月16日
    浏览(46)
  • 【暑期每日一练】 day10

    目录 选择题 (1) 解析: (2) 解析:  (3) 解析:  (4) 解析:  (5) 解析:  编程题 题一 描述 示例 解析: 代码实现 题二 描述 示例 提示 解析 :  代码实现 总结   1、求函数返回值,传入 -1 ,则在64位机器上函数返回( ) A: 死循环  B: 64  C: 32  D: 16  答案:C

    2024年02月14日
    浏览(40)
  • 【暑期每日一练】 day11

    目录 选择题 (1) 解析:  (2) 解析:  (3) 解析:  (4) 解析: (5)  解析: 编程题 题一 描述 示例 提示  解析 : 代码实现 题二 描述 输入描述: 输出描述: 示例 解析: 代码实现 总结     1、声明以下变量,则表达式: ch/i + (f*d – i) 的结果类型为( )   A: ch

    2024年02月14日
    浏览(39)
  • 【暑期每日一练】 day7

    目录 选择题 (1) 解析:  (2) 解析:  (3) 解析:  (4) 解析:  (5) 解析:  编程题 题一 描述 输入描述: 输出描述: 示例 解析  代码实现  题二 描述 示例  提示 解析  代码实现  总结   1、以下对C语言函数的有关描述中,正确的有【多选】( ) A: 在C语言中

    2024年02月15日
    浏览(39)
  • C语言每日一练------(Day3)

    本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今天练习题的: 尼科彻斯定理 等差数列 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C语言天天练 🚚代码仓库:小小

    2024年02月10日
    浏览(39)
  • C语言:选择+编程(每日一练Day3)

    目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:记负均正 思路一: 题二:旋转数组的最小数字 思路一: 1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; , 正确的调用语句是 ( ) A: fun(c,d);     B: fun(c,d);    C: fun(c,d);    D: f

    2024年02月09日
    浏览(42)
  • 【ACM】—蓝桥杯大一暑期集训Day3

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C++、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL,感兴趣的小伙伴可以看看。 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️学习应使你快乐!望与诸君

    2024年02月16日
    浏览(36)
  • 【算法-数组-pyhton】模拟行走机器人

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月12日
    浏览(37)
  • 【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 哈希

    机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度 -1 :向右转 90 度 1 = x = 9 1 = x = 9 1 = x = 9 :向前移动 x 个单位长度 在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包