Javascript 中螺旋矩阵中对角线元素的总和
Sum of the diagonal elements in a Spiral Matrix in Javascript
所以我得到了一个数组 = [ 1 2 3 8 9 4 7 6 5 ] 它是一个大小为 n x n 的方阵的螺旋遍历。我需要做的是计算主要和次要对角线的总和并打印出来。我能够将此一维数组转换为大小为 n*n 的二维数组,并像这样计算两条对角线的总和:
p.s.: 数组是这样的 [[1, 2, 3], [6, 5, 8], [7, 4, 9] ]
function spDiag(n,arr){
let mat = [];
let primary = 0, secondary = 0;
while(arr.length) mat.push(arr.splice(0, n));
for(let i = 0; i < n; i++){
for(let j = 0; j < n; j++){
if(i === j) primary += mat[i][j];
if((i + j) === (n-1)) secondary += mat[i][j];
}
}
console.log(primary + secondary)
console.log(JSON.stringify(mat));
}
spDiag(3, [1,2,3,8,9,4,7,6,5])
但任务是形成一个螺旋矩阵,然后计算对角线之和,而不仅仅是一个二维矩阵,因此我的输出出错了。如何将此一维数组转换为螺旋矩阵?
你真的不需要把一维数组变成二维数组,也不需要访问数组中的每个值。对角线遵循一个简单的模式,因为对角线上 2 个连续元素之间的 index-distance 遵循一个模式。
例如,对于 7x7 的矩阵,螺旋序列的索引在对角线上:
0 . . . . . 6
. 24 . . . 28 .
. . 40 . 42 . .
. . . 48 . . .
. . 46 . 44 . .
. 36 . . . 32 .
18 . . . . . 12
对角线上的两个连续指数之间的差距(按指数顺序)为:6,6,6,6,4,4,4,4,2,2,2,2。一般这些间隙的模式是:−1,−1,−1,−1,−3,−3,−3,−3,...等
实施
由于给定数组的大小是 的平方,我不明白您为什么需要作为参数传递。是多余的信息。
所以:
function sumDiagonals(arr) {
let n = Math.sqrt(arr.length);
if (n % 1) throw "Array size should be perfect square";
let sum = 0;
let len = n*2 - n%2; // The number of values on diagonals
for (let i = 0, j = 0; j < len; i += n - 1 - (j++ >> 2)*2) {
sum += arr[i];
}
return sum;
}
let arr = [1, 2, 3, 8, 9, 4, 7, 6, 5];
console.log(sumDiagonals(arr));
所以我得到了一个数组 = [ 1 2 3 8 9 4 7 6 5 ] 它是一个大小为 n x n 的方阵的螺旋遍历。我需要做的是计算主要和次要对角线的总和并打印出来。我能够将此一维数组转换为大小为 n*n 的二维数组,并像这样计算两条对角线的总和:
p.s.: 数组是这样的 [[1, 2, 3], [6, 5, 8], [7, 4, 9] ]
function spDiag(n,arr){
let mat = [];
let primary = 0, secondary = 0;
while(arr.length) mat.push(arr.splice(0, n));
for(let i = 0; i < n; i++){
for(let j = 0; j < n; j++){
if(i === j) primary += mat[i][j];
if((i + j) === (n-1)) secondary += mat[i][j];
}
}
console.log(primary + secondary)
console.log(JSON.stringify(mat));
}
spDiag(3, [1,2,3,8,9,4,7,6,5])
你真的不需要把一维数组变成二维数组,也不需要访问数组中的每个值。对角线遵循一个简单的模式,因为对角线上 2 个连续元素之间的 index-distance 遵循一个模式。
例如,对于 7x7 的矩阵,螺旋序列的索引在对角线上:
0 . . . . . 6
. 24 . . . 28 .
. . 40 . 42 . .
. . . 48 . . .
. . 46 . 44 . .
. 36 . . . 32 .
18 . . . . . 12
对角线上的两个连续指数之间的差距(按指数顺序)为:6,6,6,6,4,4,4,4,2,2,2,2。一般这些间隙的模式是:−1,−1,−1,−1,−3,−3,−3,−3,...等
实施
由于给定数组的大小是 的平方,我不明白您为什么需要作为参数传递。是多余的信息。
所以:
function sumDiagonals(arr) {
let n = Math.sqrt(arr.length);
if (n % 1) throw "Array size should be perfect square";
let sum = 0;
let len = n*2 - n%2; // The number of values on diagonals
for (let i = 0, j = 0; j < len; i += n - 1 - (j++ >> 2)*2) {
sum += arr[i];
}
return sum;
}
let arr = [1, 2, 3, 8, 9, 4, 7, 6, 5];
console.log(sumDiagonals(arr));