已被阅读 907 次 | 文章分类:javascript | 2022-03-10 01:18
1 题目描述
给你一个字符串 path,其中 path[i] 的值可以是 'N'、'S'、'E' 或者 'W',分别表示向北、向南、向东、向西移动一个单位。 你从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。 如果路径在任何位置上与自身相交,也就是走到之前已经走过的位置,请返回 true ;否则,返回 false 。
示例 1:
输入:path = "NES"
输出:false
解释:该路径没有在任何位置相交。
示例 1:
输入:path = "NESWW"
输出:true
解释:该路径经过原点两次。
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号