【算法笔记:判断路径是否相交】

已被阅读 907 次 | 文章分类:javascript | 2022-03-10 01:18

1 题目描述

给你一个字符串 path,其中 path[i] 的值可以是 'N'、'S'、'E' 或者 'W',分别表示向北、向南、向东、向西移动一个单位。 你从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。 如果路径在任何位置上与自身相交,也就是走到之前已经走过的位置,请返回 true ;否则,返回 false 。

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

/net/upload/image/20220310/f1050d45-b8c1-4607-9500-c4ab12230431.png

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

/net/upload/image/20220310/f3b92483-d789-49db-a9e9-91cfa288a05d.png

2 分析原理

其实这个点的关键有两步:

第一步:如何用语言表示N、S、W、E方向上移动的单位;其实很简单当然是用坐标;N:用数组[0,1]表示;S:用数组[0,-1]表示;E:用数组[1,0]表示;W:用数组[-1,0]表示;

第二步:定义初始位置数组[0,0];而且没走一个单元,然后与位置数组相加:然后将当前位置保存;这里当然也是用哈希表保存喽

第三步:每次计算一次位置,如果位置在哈希表中存在,则说明相交;

3 javascript 哈希表如何保存位置

我们都知道哈希表的键可以是数字、字符串、对象等等,当然也可以是数组;所以我们可以利用这个特性;

                                            
let map=new Map();
map.set(0); // 数字做键值
map.set("name")  // 字符串做键值
map.set(JSON.stringIfy([0,0]))  // 数组做键值
map.set(JSON.stringIfy({"name":'xiaobai'}))  // 对象做键值
                                            
                                        

不过需要注意一点;对象和数组做键值的时候需要序列化成字符串;因为这样的话,我们在用has方法判断键是否存在时,才会找得到;如下

                                            
map.get(JSON.stringIfy([0,0])) // true
                                            
                                        

4 代码

                                            
/**
 * @param {string} path
 * @return {boolean}
 */
var isPathCrossing = function(path) {
    let arr=path.split('');
    let pos=[0,0];
    let map=new Map();
    map.set(JSON.stringify(pos),"O")
    for(let i=0;i<arr.length;i++){
        if(arr[i]==='N'){
            pos[0]+=0;
            pos[1]+=1;
        }
         if(arr[i]==='S'){
            pos[0]+=0;
            pos[1]-=1;
        }
         if(arr[i]==='E'){
            pos[0]+=1;
            pos[1]+=0;
        }
         if(arr[i]==='W'){
            pos[0]-=1;
            pos[1]+=0;
        }
        if(map.has(JSON.stringify(pos))){
             return true
        }else{
             map.set(JSON.stringify(pos),"O")
        }
        if(i===arr.length-1) return false
    }
};
                                            
                                        

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号