2015-06-13 22 views
3

這是從hackerrack.com問題的絕對差異,您將得到大小N次N.計算方陣的款項在兩個主要對角線

問題

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

,也爲一些測試情況下,它是失敗,當元件的數量在各行而異

非常感謝提前

+2

上的行元素的數量如何可以改變,如果它是一個N×N的矩陣? –

回答

0

我th墨水你的意思是優化解決方案。

現在,您正在迭代數組3次,一次拉入數據(需要更多內存),然後兩次計算每個對角線。進一步優化的一種方法是一次掃描一行文件,而不是將其全部加載到二維數組中,然後一次同時計算兩個對角線。

所以在須藤代碼:

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

print sumRightToLeft - sumLeftToRight 

JS Fiddle

0

除了優化的代碼,你或許應該也做一些錯誤檢查和驗證:

  • 你有一個輸入行提供長度,但你只是丟棄該值並且不檢查它
  • 檢查輸入數組是否實際是方形 - 即。輸入==高度的每一行的長度
  • ,當你有一個if測試,可以考慮辦理其他案件 - 一個 的例子是,如果你在第5行

如果驗證輸入,然後這可能有助於弄清爲什麼一些測試失敗。

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