蜗牛排序

蜗牛排序

编写一段代码为所有数组实现 snail(rowsCount,colsCount) 方法,该方法将 1D 数组转换为以蜗牛排序的模式的 2D 数组。无效的输入值应该输出一个空数组。当 rowsCount * colsCount !==``nums.length 时。这个输入被认为是无效的。

蜗牛排序从左上角的单元格开始,从当前数组的第一个值开始。然后,它从上到下遍历第一列,接着移动到右边的下一列,并从下到上遍历它。将这种模式持续下去,每列交替变换遍历方向,直到覆盖整个数组。例如,当给定输入数组 [19, 10, 3, 7, 9, 8, 5, 2, 1, 17, 16, 14, 12, 18, 6, 13, 11, 20, 4, 15] ,当 rowsCount = 5colsCount = 4 时,需要输出矩阵如下图所示。注意,矩阵沿箭头方向对应于原数组中数字的顺序

1
2
3
4
5
6
7
8
// 输出:
[
[19,17,16,15],
[10,1,14,4],
[3,2,12,20],
[7,5,18,11],
[9,8,6,13]
]

思路:首先判断数组的长度,是否与rowsCount * colsCount一致,不一致的话return []

一致的话,就进行数组赋值,先根据行数循环遍历,创建几个小的数组,再根据数组循环,插入对应的二维数组。主要根据插入的方向和行数来判断赋值。

具体操作:

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
26
27
28
29
30
31
Array.prototype.snail = function(rowsCount, colsCount) {
let arr = []
if(this.length!=rowsCount*colsCount) return arr
// 根据rowCount创建二维数组,
for(let i = 0;i < rowsCount;i++){
arr.push([])
}
// 定义start变量来判断是给第几个小数组赋值
let start = 0;
//判断正向还是逆向
let forward = true
for(let i=0;i<this.length;i++){
arr[start].push(this[i])
// 如果是正向,且没到顶头的小数组,start++
// 如果到了顶头的数组,则改变方向,start--
if(forward){
if(start==rowsCount-1){
forward = false
}else{
start++
}
}else{
if(start===0){
forward=true
}else{
start--
}
}
}
return arr
}

蜗牛排序
http://example.com/2023/09/27/蜗牛排序/
作者
AlongSunsea
发布于
2023年9月27日
许可协议