Given a square matrix, calculate the absolute difference between the sums of its diagonals.
For example, the square matrix arr is shown below:
The left-to-right diagonal = 1 + 5 + 9 = 15. The right to left diagonal = 3 + 5 + 9 = 17. Their absolute difference is |15 – 17| = 2.
給予一個矩陣,計算對角線之總和的絕對差。 例如,一個方正的矩陣 arr 如下: 123 456 789 從左到右的對角線為 1 + 5 + 9 = 15。從右到左的對角線為 3 + 5 + 9 = 17。 他們的絕對差是 | 15 - 17| = 2。
Example 1:
123 456 989 return 2
solution:
先簡單列出「左到右的對角線」,接著列出「右到左的對角線」,
在用絕對值處理兩者相減,最後回傳該值。
ex. 運用遍歷回圈的過程中,同步將左上與左下值加入對應的對角線中。
Code 1: BigO(n)
'use strict'; const fs = require('fs'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString = ''; let currentLine = 0; process.stdin.on('data', function(inputStdin) { inputString += inputStdin; }); process.stdin.on('end', function() { inputString = inputString.split('\n'); main(); }); function readLine() { return inputString[currentLine++]; } /* * Complete the 'diagonalDifference' function below. * * The function is expected to return an INTEGER. * The function accepts 2D_INTEGER_ARRAY arr as parameter. */ function diagonalDifference(arr) { // Write your code here let leftToRight = 0, rightToLeft = 0 for (let i = 0; i < arr.length; i++) { leftToRight += arr[i][i] rightToLeft += arr[arr.length - 1 - i][i] } return Math.abs(leftToRight - rightToLeft); } function main() { const ws = fs.createWriteStream(process.env.OUTPUT_PATH); const n = parseInt(readLine().trim(), 10); let arr = Array(n); for (let i = 0; i < n; i++) { arr[i] = readLine().replace(/\s+$/g, '').split(' ').map(arrTemp => parseInt(arrTemp, 10)); } const result = diagonalDifference(arr); ws.write(result + '\n'); ws.end(); }
FlowChart:
Example 1
arr = [ [ 11, 2, 4 ], [ 4, 5, 6 ], [ 10, 8, -12 ] ] leftToRight = arr[0][0] + arr[1][1] + arr[2][2] rightToLeft = arr[2][0] + arr[1][1] + arr[0][2] leftToRight += arr[i][i] rightToLeft += arr[arr.length - 1 - i][i] leftTORight = 0 rightToLeft = 0 step.1 i = 0 leftToRight += arr[0][0] //0 + 11 = 11 rightToLeft += arr[3 - 1 - 0][0] = arr[2][0] //0 + 4 = 4 step.2 i = 1 leftToRight += arr[1][1] //11 + 5 = 16 rightToLeft += arr[3 - 1 - 1][1] //4 + 5 = 9 step.3 i = 2 leftToRight += arr[2][2] //16 + (-12) = 4 rightToLeft ++ arr[3 - 1 - 2][2] //9 + 10 = 19 return Math.abs(leftToRight - rightToLeft) //|4 - 19| = 15