You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west,
x[2] metres to the south,
x[3] metres to the east and so on. In other words, after each move your direction changes
counter-clockwise.
Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.
Example 1:
Given x = [2, 1, 1, 2], ????? ? ? ???????> ?
Return true (self crossing)
Example 2:
Given x = [1, 2, 3, 4], ???????? ? ? ? ? ?????????????>
Return false (not self crossing)
Example 3:
Given x = [1, 1, 1, 1], ????? ? ? ?????>
Return true (self crossing)
Credits:Special thanks to @dietpepsi for adding this problem and creating all test cases.
Solution
publicclassSolution {publicbooleanisSelfCrossing(int[] x) {if (x ==null||x.length==0) returnfalse;Set<String> set =newHashSet<>();set.add(newPoint(0,0).toString());int direction =0;int m =0;int n =0;for(int i =0; i <x.length; i ++) {int currentValue = x[i];while (currentValue >0) {switch (direction) {case0: n++;break;case1: m--;break;case2: n--;break;case3: m++;break; }Point current =newPoint(m,n);if (set.contains(current.toString())) {returntrue; } else {set.add(current.toString()); } currentValue --; } direction++; direction = direction%4; }returnfalse; }publicclassPoint {int x;int y;publicPoint(int x,int y) {this.x= x;this.y= y; } @OverridepublicStringtoString() {return x+","+y; } }}