1、生成顺时针螺旋数组。
输入数字n,生成n行n列的螺旋数组,例如
n=1,输出
1;
n=2,输出
1 2
4 3
n=3,输出
1 2 3
8 9 4
7 6 5
……
代码1:思路:首先声明一个二维数组,然后对数组从最外圈到最内圈依次赋值。
function spiralArray(n){
var m=0;
var a=1;
var arr=[];
for(var i=0;i<n;i++){
arr[i]=new Array();
for(var j=0;j<n;j++){
arr[i][j]=n*n;//当n为偶数时,下面的循环无法给中间的项赋值,所以初始为n*n
}
}
while(m<n/2){
//向右赋值
for(var i=m;i<n-m-1;i++){
arr[m][i]=a++;
}
//向下赋值
for(var i=m;i<n-m-1;i++){
arr[i][n-m-1]=a++;
}
//向左赋值
for(var i=m;i<n-m-1;i++){
arr[n-m-1][n-l-i]=a++;
}
//向上赋值
for(var i=m;i<n-m-1;i++){
arr[n-i-1][m]=a++;
}
m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
}
return arr;
}
console.log(spiralArray(8));
当n=8时,结果如下
上述代码当n为奇数时,sprialArray函数访问不到数组中间那项,代码中通过将数组的初始值设为n*n解决这个问题。代码2则对sprialArray函数进行了修改,解决了这一问题。
代码2:解决当n为奇数上述代码sprialArray函数无法为数组中间项赋值的问题
function sprialArray(n){
var m=0;
var a=1;
var arr=[];
for(var i=0;i<n;i++){
arr[i]=new Array();
for(var j=0;j<n;j++){
arr[i][j]=0;
}
}
while(m<n/2){
//向右赋值,当n为奇数时,最后一次循环为数组中间项赋值
for(var r=m;r<n-m;r++){
arr[m][r]=a++;
}
//向下
for(var d=m;d<n-m-1;d++){
arr[d+1][n-m-1]=a++;
}
//向左
for(var z=m;z<n-m-1;z++){
arr[n-m-1][n-1-(z+1)]=a++;
}
//向上
for(var u=m;u<n-m-2;u++){
arr[n-(u+1)-1][m]=a++;
}
m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
}
return arr;
}
console.log(sprialArray(8));
2、生成逆时针螺旋数组,并且数值递减。思路上述代码相同。只是改变赋值顺序。
例如,n=0,输出
1
n=1,输出
7 8 9
6 1 2
5 4 3
n=2,输出
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 15 15 14 13
function sprialArray(num){
var n=2*num+1;
var m=0;
var a=n*n;
var arr=[];
for(var i=0;i<n;i++){
arr[i]=new Array();
for(var j=0;j<n;j++){
arr[i][j]=1;//当n为偶数时,下面的循环无法给中间的项赋值所以初始为n*n
}
}
while(m<n/2+1){
//向左
for(var z=m;z<n-m-1;z++){
arr[m][n-1-z]=a--;
}
//向下
for(var d=m;d<n-m-1;d++){
arr[d][m]=a--;
}
//向右
for(var r=m;r<n-m-1;r++){
arr[n-m-1][r]=a--;
}
//向上
for(var u=m;u<n-m-1;u++){
arr[n-u-1][n-m-1]=a--;
}
m=m+1;//m=0时为最外圈赋值,每循环一次进行缩圈,则m+1
}
return arr;
}
console.log(sprialArray(3));
当n=3时,结果如下。