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

时间:2015-06-13 20:21:49

标签: javascript optimization logic

这是来自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

Fiddle Demo

还有某些测试用例失败,当每行的元素数量不同时

非常感谢提前

5 个答案:

答案 0 :(得分:1)

功能对角线差异(arr){

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;

}

答案 1 :(得分:0)

我认为您的意思是优化解决方案。

现在,您正在迭代数组3次,一次拉入数据(需要更多内存),然后两次计算每个对角线。进一步优化这种方法的一种方法是一次扫描一行文件,而不是将其全部加载到2D数组中,然后在一次通过时同时计算两个对角线。

所以在sudo代码中:


comment.decorate.comment_author

JS Fiddle

答案 2 :(得分:0)

除了优化代码之外,您还应该进行一些错误检查和验证:

  • 你有一个提供长度的输入行,但你只是 抛弃价值而不是检查它
  • 检查输入数组是否实际为正方形 - 即。每行输入的长度==高度
  • 当你有一个if测试时,考虑处理其他情况 - 一个 例如你的第5行。

如果验证输入,那么这可能有助于弄清楚为什么某些测试失败。

答案 3 :(得分: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));
}

答案 4 :(得分:0)

下面的代码计算O(N)时间内的矩阵对角线差异

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);
    }