持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
一、题目描述:
给你一个字符串 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'
二、思路分析:
思路还是比较简单的,使用 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;
}
}