Skip to content

657. 机器人能否返回原点

解题过程

INFO

题目链接 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。 如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。 注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同

javascript
/**
 * @link https://leetcode.cn/problems/robot-return-to-origin/
 * @title 657. 机器人能否返回原点
 * @description 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
 * 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
 * 如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
 * 注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同
 * @param {string} moves
 * @return {boolean}
 */
// 解法一
// 思路:通过二维数组统计四个方向的递增或递减规则,最后判断两个元素数据是否为0即可
var judgeCircle = function (moves) {
  const res = new Array(2).fill(0)
  for (let i = 0; i < moves.length; i++) {
    if (moves[i] === 'R') {
      res[0]--
    }

    if (moves[i] === 'L') {
      res[0]++
    }

    if (moves[i] === 'U') {
      res[1]--
    }

    if (moves[i] === 'D') {
      res[1]++
    }
  }

  return res[0] === 0 && res[1] === 0
}

// 解法二
// 思路:优化解法一代码,执行效果确实好了一点
var judgeCircle = function (moves) {
  const res = new Array(2).fill(0)

  for (let i = 0; i < moves.length; i++) {
    switch (moves[i]) {
      case 'R':
        res[0]--
        break
      case 'L':
        res[0]++
        break
      case 'U':
        res[1]--
        break
      case 'D':
        res[1]++
    }
  }

  return res[0] === 0 && res[1] === 0
}

// 解法三
// 思路:哈希表统计RLUD字符次数,然后对比次数结果即可
// 缺点:执行结果没有上面两种好
var judgeCircle = function (moves) {
  const map = new Map()

  for (let i = 0; i < moves.length; i++) {
    map.set(moves[i], (map.get(moves[i]) || 0) + 1)
  }

  return map.get('R') === map.get('L') && map.get('U') === map.get('D')
}

// 解法四
// 思路:正则表达式匹配对应字符判断是否相等即可,一行代码搞定
// 缺点:执行效果没有前三种好
var judgeCircle = function (moves) {
  return moves.match(/R/g)?.length === moves.match(/L/g)?.length && moves.match(/U/g)?.length === moves.match(/D/g)?.length
}

// 解法五
// 思路:根据字符串 API split 将对应的字符分割成数组判断是否相等即可,一行代码搞定
// 缺点:执行效果跟解法四差不多
var judgeCircle = function (moves) {
  return moves.split('R').length === moves.split('L').length && moves.split('U').length === moves.split('D').length
}

// const result = judgeCircle('UD') //true
// const result = judgeCircle('LL') // false
const result = judgeCircle('RRDD') // false
console.log(result)

解题感受

相对这几天,这题简单很多了,一下子写了 5 种题解方法,自信心爆棚,哈哈哈

优质题解