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 种题解方法,自信心爆棚,哈哈哈