代码改变世界

Self Crossing

2016-06-03 05:11  摘花  阅读(688)  评论(0编辑  收藏  举报

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)

思路:如果相交,必定是经过同一点,记录所有点,比较即可。

int a = 0,b = 0,len = x.length;
        
        HashSet<String> recodePoint = new HashSet<String>();
        
        recodePoint.add(a + "-" + b);//start point
        
        if(len == 0)
            return false;
        
        for (int i = 0; i < len; i++) {
            if(i % 4 == 0){
                for(int j = 0;j < x[i]; j++){
                    String point = a+"-"+ ++b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            }
            if(i % 4 == 1)
                for(int j = 0;j < x[i]; j++){
                    String point = --a+"-"+b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            if(i % 4 == 2)
                for(int j = 0;j < x[i]; j++){
                    String point = a+"-"+ --b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
            if(i % 4 == 3)
                for(int j = 0;j < x[i]; j++){
                    String point = ++a+"-"+ b;
                    if(recodePoint.contains(point))
                        return true;
                    else 
                        recodePoint.add(point);
                }
        }
        return false;