2016-04-29 65 views
-1

我在面試中遇到了以下挑戰,有一些限制。JavaScript挑戰 - Sherlock和數組

Watson給Sherlock一個長度爲N的數組A。然後,他要求他確定數組中是否存在一個元素,使得其左側元素的總和等於其右側元素的總和。如果左/右沒有元素,則總和被認爲是零。在形式上,找到一個i,這樣, A1+A2...A(i−1)=A(i+1)+A(i+2)...AN

輸入格式

第一行包含T,測試用例的數目。對於每個測試用例,第一行包含N,這是數組A中元素的數量。每個測試用例的第二行包含空間分隔的整數N,表示數組A

輸出格式

對於每組測試打印YES如果存在陣列中的元件,以使得在它的左邊的元素的總和等於其右邊的元素的總和;否則打印NO

約束

1≤T≤10 

1≤N≤10^5 

1≤Ai≤2×10^4 

1≤i≤N 

我已經解決了,但它的失敗在一些測試案例,我想知道我的編碼的缺陷。我花了將近4-5小時,但無法解決它。

我的解決方案 -

function processData(input) { 
    input = input.split('\n'); 
    var counter=0; 
    var sum = function(n){ 
     var r=[]; 
     for(var k=0;k<n.length;k++){ 
      if(!isNaN(n[k])) { 
       if(n[k] >= 1 && n[k] <= (2 * Math.pow(10,4))){ 
        r.push(n[k].trim()); 
       } 
      } 
     } 
     return r.reduce(function(a, b) { return Number(a) + Number(b); }, 0); 
    } 
    for(var i=2;i<=input.length;i+=2){ 
     var ret='NO'; 
     if(counter<=10){ 
      input[i] = input[i].split(' '); 
      if(input[i].length <= Math.pow(10,5) && input[i-1] <= input[i].length && input[i-1] >= 1){ 
       for(var j=0;j<input[i].length;j++){ 
        if(sum(input[i].slice(0,j)) === sum(input[i].slice(j+1,input[i].length))){ 
         ret = 'YES'; 
         break; 
        } 
       } 
      } 
     } 
     counter++; 
     console.log(ret); 
    }; 

} 

process.stdin.resume(); 
process.stdin.setEncoding("ascii"); 
_input = ""; 
process.stdin.on("data", function (input) { 
    _input += input; 
}); 

process.stdin.on("end", function() { 
    processData(_input); 
}); 

挑戰鏈接 - https://www.hackerrank.com/challenges/sherlock-and-array

+0

哪裏是你的測試? –

+0

這樣一個可怕的面試問題。 – mkaatman

+0

@丹尼爾·懷特這是採訪,所以我沒有。 –

回答

1

我不能輕易地寫我的手機上的代碼,但這裏是我的解決方案的想法。我將在鍵盤上進行一次適當的編輯。

讓我們承認解析輸入文件是微不足道的。然後你只需要編寫一個函數,返回單個數組的yes或no。

步驟1:降低陣列得到它的元素的總和:TotalSim

步驟2:環陣列上和保持的元件的部分和:LeftSum

步驟3:如果LeftSum === TotalSum - LeftSum返回是

步驟4:數組的結束:返回false

請不是在JavaScript整數是準確的,直到2^53 -1,這意味着你的約束保證不會發生溢出

+0

感謝您的回答。我以同樣的方式完成了。 –

+0

我猜錯誤是在拼接/切片或中間陣列(你不需要) –

+0

切片我正在做正確的數組和左數組。 Callenge鏈接https://www.hackerrank.com/challenges/sherlock-and-array –

0

迭代遍歷個案,然後在每種情況下查找第一個元素是否符合它 - 在元素的每一側運行reduce並比較結果,直到找到匹配或元素用完。

這應該工作:

let test = input => input 
    .map(line => line 
     .some((el, index) => line.slice(0, index).reduce((p, c) => p + c, 0) 
      === line.slice(index - line.length + 1).reduce((p, c) => p + c, 0))) 
    .map(result => result ? 'YES' : 'NO'); 

test(cases); // outputs array of YESs and NOs