给定一个大小为 N 乘 N 的方阵。计算两个主对角线之和的绝对差

问题描述 投票:0回答:6

这是来自 hackerrack.com 的问题,

问题的解释

enter image description here

我解决了问题,但我无法找到乐观的解决方案,我们可以使用对象文字并找到最佳解决方案吗?

function getTwoDimention(input){
    var input = input.split('\n');
    var twoDimArr=[];
    for(var n=0; n<input.length; n++){ 
        var subarr = input[n].split(' ');
       if(subarr.length > 1){
           twoDimArr.push(subarr)
       }
    }
    return twoDimArr;
}

function getFristDiagonal(twoDimArr){
    var sum = 0;
    for(var i=0; i<twoDimArr.length; i++){
        for(var j=i; j<=i; j++){
           sum += parseFloat(twoDimArr[i][j]);
        }
    }
    return sum;
}
function getSecondDiagonal(twoDimArr){
    var sum = 0;j=twoDimArr.length-1;
    for(var i=0; i<twoDimArr.length; i++){

           sum += parseFloat(twoDimArr[i][j--]);
    }
    return sum;
}
function processData(input) {
    //Enter your code here
    twoDimArr = getTwoDimention(input);
    var firtDia = getFristDiagonal(twoDimArr);
    var secDia = getSecondDiagonal(twoDimArr);

    console.log(secDia - firtDia);

} 

实际工作代码在jsfiddle

小提琴演示

对于某些测试用例,当每行的元素数量不同时,它也会失败 提前非常感谢

javascript optimization logic
6个回答
1
投票

let d1 = 0; let d2 = 0; let j = 0; let k = arr.length-1; for(let i = 0; i < arr.length; i++){ // from left to right d1 += arr[i][j] j++; // from right to left d2 += arr[i][k] k--; } const diff = Math.abs(d1-d2) return diff;

}


0
投票
优化

解决方案。 现在,您正在对数组进行 3 次迭代,一次是为了提取数据(这会占用更多内存),然后两次是为了计算每个对角线。进一步优化的一种方法是一次扫描文件一行,而不是将其全部加载到二维数组中,然后在一次传递中同时计算两个对角线。

所以在 sudo 代码中:

for each row i=0 sumLeftToRight += line[i]; sumRightToLeft += line[size-i-1]; print sumRightToLeft - sumLeftToRight

JS 小提琴


0
投票

你有一个提供长度的输入线,但你只是 丢弃该值并且不检查它
  • 检查输入数组实际上是正方形的——即每行输入的长度==高度
  • 当您进行 if 测试时,请考虑处理 else 情况 - 一个 示例是第 5 行的 if 。
  • 如果您验证输入,那么这可能有助于找出某些测试失败的原因。


0
投票

public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int a[][] = new int[n][n]; for(int a_i=0; a_i < n; a_i++){ for(int a_j=0; a_j < n; a_j++){ a[a_i][a_j] = in.nextInt(); } } int count=0; int sum1=0; int sum2=0; for(int i=0,j=n;i<n && j>0;j--,i++){ if(count==i){ sum1=sum1+a[i][count]; sum2=sum2+a[j-1][count]; count++; } } System.out.println(Math.abs(sum1-sum2)); }



0
投票

public class DiagonalDiffererence { public static void main(String args[]) { int a[][] = new int[][] { { 11, 2, 4 }, { 4, 5, 6 }, { 10, 8, -12 }}; int left = 0; int right = a.length - 1; int leftDig = 0; int rightDig = 0; for (int i = 0; i < a.length; i++) { leftDig += a[i][left++]; rightDig += a[i][right--]; } int sum = Math.abs(leftDig - rightDig); System.out.println(sum); }



0
投票

(0,0) (0,1) (0,2)

(1,0) (1,1) (1,2)

(2,0) (2,1) (2,2)

所以 d1 之和 = (0,0) + (1,1) + (2,2) => d1 += arr[i][i] 和 d2 = (0,2) + (1,1) + (2,0) => d2 += arr[i][(arr.length-1) - i]

function diagonalDifference(arr) { let d1 = 0; let d2 = 0; for(let i = 0; i<arr.length ; i++) { d1 += arr[i][i]; d2 += arr[i][arr.length - 1 - i]; } return Math.abs(d1-d2) }

© www.soinside.com 2019 - 2024. All rights reserved.