2016-04-29 59 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