I'm not sure what exactly about your code made it a "show-stopper." Your use of tmpArray
has a bit of a smell to it. There are issues of readability (why does the line for(var i=c1;i<=c2;i++)
only have one space in it??). Your core algorithm (getUpperCorner
and getLowerCorner
) isn't documented and is fairly hard to read.
Personally, though, I would have approached this as a straight recursion problem. So you have the following matrix:
1 2 3 4
5 6 7 8
9 10 11 12
Your "spiral" begins with the the top row, 1 2 3 4
. So chop that off and save it. Now you're left with:
5 6 7 8
9 10 11 12
The next part of the spiral is the rightmost column of this, 8 12
. But what if we turn it 90o counter-clockwise?
5 6 7 8 => 8 12
9 10 11 12 7 11
6 10
5 9
Now 8 12
the top row! Chop it off and repeat:
8 12
✂ ┄┄┄┄┄┄
7 11 => 11 10 9
6 10 7 6 5
5 9
By now you've seen the pattern. To get a matrix's "spiral" you just take off the top row, rotate what's left, then get its spiral, and so on.
Def Spiralify( Matrix )
If( Matrix has only one row )
Return( the row )
Else
FirstRow := first row of Matrix
RestOfMatrix := all of Matrix except the first row
NextMatrix := RotateLeft( RestOfMatrix )
NextSpiral := Spiralify( NextMatrix )
Result := JoinArrays( FirstRow, NextSpiral )
Return( Result )
RotateLeft
will actually make up the most lines of code, but it's just a straightforward nested loop, and the rest basically writes itself.
Update
I had some time to write up an actual implementation. Rather than paste it here you can check it out on jsFiddle.
- 930
- 5
- 8