Skip to main content
Code Review

Return to Revisions

6 of 7
added 19 characters in body
Jordan
  • 930
  • 5
  • 8

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.

Jordan
  • 930
  • 5
  • 8
default

AltStyle によって変換されたページ (->オリジナル) /