我能够用一个循环完成这个任务。时间复杂度看起来像是O(K),其中K是数组中的所有项目。
以下是我在JavaScript中实现它的方法:
首先,我们用单个数组表示n^2矩阵。然后,像这样遍历它:
function rotate (arr, n) {
var rotated = [], indexes = []
for (var i = 0; i < arr.length; i++) {
if (i < n)
indexes[i] = i * n + (n - 1)
else
indexes[i] = indexes[i - n] - 1
rotated[indexes[i]] = arr[i]
}
return rotated
}
基本上,我们会转换源数组的索引:
[0,1,2,3,4,5,6,7,8]
=> [2,5,8,1,4,7,0,3,6]
然后,使用这个经过转换的 indexes
数组,在最终的 rotated
数组中放置实际值。
以下是一些测试用例:
rotate([
1, 2, 3,
4, 5, 6,
7, 8, 9], 3))
[7, 4, 1,
8, 5, 2,
9, 6, 3]
rotate([
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16], 4))
[13, 9, 5, 1,
14, 10, 6, 2,
15, 11, 7, 3,
16, 12, 8, 4]
rotate([
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15,
16, 17, 18, 19, 20,
21, 22, 23, 24, 25], 5))
[21, 16, 11, 6, 1,
22, 17, 12, 7, 2,
23, 18, 13, 8, 3,
24, 19, 14, 9, 4,
25, 20, 15, 10, 5]