目錄
- Posted by 微博@Yangsc_o
- 原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本題是leetcode,地址:1496. 判斷路徑是否相交
題目
給你一個字符串 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 僅由 {'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;
}