判断路径是否相交

简介: 判断路径是否相交

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

问题描述

给你一个字符串 path,其中 path[i] 的值可以是 'N''S''E' 或者 'W',分别表示向北、向南、向东、向西移动一个单位。

你从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。

如果路径在任何位置上与自身相交,也就是走到之前已经走过的位置,请返回 true ;否则,返回 false

示例 1:

输入: path = "NES"
输出: false
解释: 该路径没有在任何位置相交。

示例 2:

输入: path = "NESWW"
输出: true
解释: 该路径经过原点两次。

提示:

  • 1 <= path.length <= 10^4
  • path[i]'N''S''E''W'

思路分析

首先我们应该要先理解一下题目意思,题目会给我们一个字符串pathpath[i]'N''S''E''W',分别表示向、向、向、向西移动一个单位。我们从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。我们需要判断在移动的过程中路线会不会相交,也就是走到之前已经走过的位置,如果存在相交的情况,返回 true ;否则,返回 false

知道了题目的意思之后,我们便可以开始编写代码解题了:

  • 1、遍历 path,计算移动的坐标

根据 path[i]来对应修改坐标值即可:

N 表示向移动一个单位,x 坐标不变,y 坐标加一;

S 表示向移动一个单位,x 坐标不变,y 坐标减一;

E 表示向移动一个单位,y 坐标不变,x 坐标加一;

W 表示向西移动一个单位,y 坐标不变,x 坐标减一;

for (let i = 0; i < path.length; i++) {
  if (path[i] === "N") y++;
  else if (path[i] === "S") y--;
  else if (path[i] === "W") x--;
  else if (path[i] === "E") x++;
}
  • 2、使用Set记录走过的坐标点

我们需要将走过的坐标点记录起来,用于判断当前经过的坐标点是否已经走过,我们可以使用MapSet来记录,这里我是用 Set 来记录,添加坐标前判断 set 中是否已经存在当前坐标即可。

const set = new Set(["0-0"]);
let x = 0,
  y = 0;
for (let i = 0; i < path.length; i++) {
  if (path[i] === "N") y++;
  else if (path[i] === "S") y--;
  else if (path[i] === "W") x--;
  else if (path[i] === "E") x++;
  if (set.has(x + "-" + y)) return true;
  set.add(x + "-" + y);
}

AC 代码

完整 AC 代码如下:

/**
 * @param {string} path
 * @return {boolean}
 */
var isPathCrossing = function (path) {
  const set = new Set(["0-0"]);
  let x = 0,
    y = 0;
  for (let i = 0; i < path.length; i++) {
    if (path[i] === "N") y++;
    else if (path[i] === "S") y--;
    else if (path[i] === "W") x--;
    else if (path[i] === "E") x++;
    if (set.has(x + "-" + y)) return true;
    set.add(x + "-" + y);
  }
  return false;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
力扣1496 判断路径是否相交
力扣1496 判断路径是否相交
|
6月前
|
测试技术
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
|
6月前
leetcode-6110:网格图中递增路径的数目
leetcode-6110:网格图中递增路径的数目
50 1
|
6月前
|
Python
获取二叉搜索树中节点值的和等于指定输入整数的所有路径
获取二叉搜索树中节点值的和等于指定输入整数的所有路径
27 0
|
6月前
leetcode-6134:找到离给定两个节点最近的节点
leetcode-6134:找到离给定两个节点最近的节点
49 0
判断两个链表是否相交,相交的话返回相交的节点
1.判断是否相交 找到两个链表的最后一个节点,看是否相同,相同的话就相交,反之. 2.找两个链表长度的差值 为什么要找两个链表的差值呢? 为了判断哪个长,以便让长的链表先走差值,方便找相交处 3.找相交处 长的走后,再便利长的和短的一起走,以找到相交节点
40 0
|
存储 算法
算法训练Day18|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
算法训练Day18|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
|
存储 前端开发 程序员
二叉树中和为某一值的路径
二叉树中和为某一值的路径
二叉树中和为某一值的路径
|
机器人
跟我打卡LeetCode 61旋转链表&62不同路径&63不同路径 II
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
203 0
跟我打卡LeetCode 61旋转链表&62不同路径&63不同路径 II
二叉树——112. 路径总和
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
二叉树——112. 路径总和