Self Crossing

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

public class Solution {

    public boolean isSelfCrossing(int[] x) {
        if (x == null || x.length == 0) return false;
        Set<String> set = new HashSet<>();
        set.add(new Point(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) {
                    case 0:
                        n++;
                        break;
                    case 1:
                        m--;
                        break;
                    case 2:
                        n--;
                        break;
                    case 3:
                        m++;
                        break;
                }

                Point current = new Point(m,n);
                if (set.contains(current.toString())) {
                    return true;
                } else {
                    set.add(current.toString());
                }
                currentValue --;
            }

            direction++;
            direction = direction% 4;
        }

        return false;
    }

    public class Point {
        int x;
        int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return x+","+y;
        }
    }
}

results matching ""

    No results matching ""