leetcode-1496. 判断路径是否相交


本题是leetcode,地址:1496. 判断路径是否相交

题目

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

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

如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True ;否则,返回 False 。

示例 1:

img

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

img

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

提示:

1 <= path.length <= 10^4
path 仅由 {'N', 'S', 'E', 'W} 中的字符组成

分析

如果我们把初始位置设置为int x = 0, y = 0;那么每次往{'N', 'S', 'E', 'W} 走时,对值做加 减操作,同时记录走过的位置坐标,如果下一步已经是我们记录过的位置,那么返回ture、否则返回false;我们需要考虑的是怎么把x,y映射为一个值,我们可以考虑自己写一个hash算法,1 <= path.length <= 10^4的限制,代码如下;

code


    public int hash(int x ,int y){
        return x * 100001   + y;
    }

    public boolean isPathCrossing(String path) {
        Set<Integer> set = new HashSet<>();
        int x = 0 , y = 0;
        set.add(hash(x,y));
        for(int index = 0; index < path.length(); index ++) {
            char c = path.charAt(index);
            switch(c) {
                case 'N': y ++; break;
                case 'S': y --; break;
                case 'W': x ++; break;
                case 'E': x --; break;
            }

            if(!set.add(hash(x,y))) {
                return true;
            }
        }
        return false;
    }

你的鼓励也是我创作的动力

打赏地址

原文地址:https://www.cnblogs.com/yangsanchao/p/13331458.html