【日更刷题】1496. 判断路径是否相交

108 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

一、题目描述:

1496. 判断路径是否相交 - 力扣(LeetCode)

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

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

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

 

示例 1:

image.png

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

示例 2:

image.png

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

提示:

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

二、思路分析:

思路还是比较简单的,使用 HashSet 去重,但我走了弯路。

我用 Point 对象存放 x 和 y,然后判断是否对象是不是在 HashSet 中。

需要重写 equals() 和 HashCode() 方法。

中间踩过的坑

引用传递和值传递

重写 hashCode() 和 equals()

三、AC 代码:

class Solution {
        static class Point{
        public int x;
        public int y;
        public Point(){}
        public Point(int x, int y){
            this.x = x;
            this.y = y;
        }
        public int getX(){
            return this.x;
        }

        @Override
        public int hashCode() {
//            return super.hashCode();
            return 1;
        }


        @Override
        public boolean equals(Object obj) {
            if (this == obj){
                return true;
            }
            if (!(obj instanceof Point)){
                return false;
            }
            Point obj1 = (Point) obj;
            return obj1.x == x && obj1.y == y;
        }
        //        public boolean equals(Point point) {
//            if (point.x == this.x && point.y == this.y){
//                return true;
//            } else {
//                return false;
//            }
//        }
    }

    public  boolean isPathCrossing(String path) {
        Set<Point> set = new HashSet<>();
        Point point = new Point(0,0);
        set.add(new Point(0,0));
        char[] arrs = path.toCharArray();
        for (char arr : arrs){
            switch(arr){
                case 'N':
                    point.y += 1;
                    break;
                case 'S':
                    point.y -= 1;
                    break;
                case 'E':
                    point.x += 1;
                    break;
                case 'W':
                    point.x -= 1;
                    break;
            }
            int x = point.x;
            int y = point.y;
            Point temp = new Point(x,y);

            if (set.contains(temp)){
                return true;
            }
            set.add(temp);
        }

        return false;
    }
}

四、参考:

思路简单,性能高效接近100 - 判断路径是否相交 - 力扣(LeetCode)

判断路径是否相交 C++ 哈希表 - 判断路径是否相交 - 力扣(LeetCode)