leetcode 算法题874 (简单228) 模拟行走机器人

leetcode 算法题874 (简单228) 模拟行走机器人

  • 题目介绍
机器人在一个无限大小的网格上行走,
从点 (0, 0) 处开始出发,面向北方。
该机器人可以接收以下三种类型的命令:
  -2:向左转 90 度
  -1:向右转 90 度
  1 <= x <= 9:向前移动 x 个单位长度
在网格上有一些格子被视为障碍物。
第 i 个障碍物位于网格点  (obstacles[i][0], obstacles[i][1])
如果机器人试图走到障碍物上方,
那么它将停留在障碍物的前一个网格方块上,
但仍然可以继续该路线的其余部分。
返回从原点到机器人的最大欧式距离的平方。
  • 示例

输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)

输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出: 65
解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处

  • 提示
  1. 0 <= commands.length <= 10000
  2. 0 <= obstacles.length <= 10000
  3. -30000 <= obstacle[i][0] <= 30000
  4. -30000 <= obstacle[i][1] <= 30000
  5. 答案保证小于 2 ^ 31
  • 解法一
/**
 * @param {number[]} commands
 * @param {number[][]} obstacles
 * @return {number}
 */
var robotSim = function(commands, obstacles) {
    let point = [0, 0], i = 0, flag = 0, oSet = new Set(obstacles.map(item => item.join('_'))), max = 0;
    while(i < commands.length) {
      switch(commands[i]) {
        case -2:
          flag++;
          break
        case -1:
          flag--;
          break
        default:
          point = command(point, flag, commands[i], oSet);
          max = Math.max(max, point[0] * point[0] + point[1] * point[1])
          break
      }
      i++;
    }
    return max;
};
let count = 0;
const command = (point, flag, distance, oSet) => {
  count++;
  flag %= 4;
  if(flag < 0) {
    flag += 4;
  }
  let nexts = [], i = 1;
  if(flag === 0) {
    while(distance >= 0) {
      nexts.unshift([point[0], point[1] + distance--])
    }
  } else if(flag === 2) {
    while(distance >= 0) {
      nexts.unshift([point[0], point[1] - distance--])
    }
  } else if(flag === 1) {
    while(distance >= 0) {
      nexts.unshift([point[0] - distance--, point[1]])
    }
  } else if(flag === 3){
    while(distance >= 0) {
      nexts.unshift([point[0] + distance--, point[1]])
    }
  }
  while(i < nexts.length) {
    if(oSet.has(nexts[i].join('_'))) {
      console.log(nexts[i].join('_'), i, count, point)
      return nexts[i - 1];
    }
    i++;
  }
  return nexts[i - 1];
}

执行用时 : 236 ms, 在所有 JavaScript 提交中击败了92.50%的用户

内存消耗 : 57 MB, 在所有 JavaScript 提交中击败了36.36%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值