簡體   English   中英

JavaScript 挑戰 - Sherlock 和數組

[英]JavaScript challenge - Sherlock and array

我在面試中遇到了以下挑戰,但有一些限制。

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

我無法輕松地在手機上編寫代碼,但這是我的解決方案的想法。 一旦回到鍵盤上,我會進行適當的編輯。

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

步驟 1:減少數組以獲得其元素的總和:TotalSim

第 2 步:在數組上循環並保持元素的部分和:LeftSum

第 3 步:如果 LeftSum === TotalSum - LeftSum 返回 yes

第 4 步:數組結束:返回 false

請注意,javascript 中的整數直到 2^53 -1 為止都是精確的,這意味着您的約束保證不會發生溢出

遍歷案例,然后在每種情況下查找第一個元素,無論它是否符合 - 在元素的每一側運行 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM