Javascript Sherlock数组

时间:2015-11-11 10:02:43

标签: javascript arrays

问题陈述

Watson给Sherlock一个长度为N的数组A.然后他要求他确定数组中是否存在一个元素,使得左边元素的总和等于右边元素的总和。如果左/右没有元素,则总和被认为是零。正式地,找到一个i,这样, A1 + A2 ... AI-1 = AI + 1 +艾+ 2,...,AN。 输入格式

第一行包含T,即测试用例的数量。对于每个测试用例,第一行包含N,即数组A中元素的数量。每个测试用例的第二行包含N个以空格分隔的整数,表示数组A.

输出格式

对于每个测试用例,如果数组中存在元素,则打印YES,以使其左侧元素的总和等于其右侧元素的总和;否则打印NO。

约束

1≤T≤10

1≤N≤105

1≤Ai≤2×104

1≤i≤N

示例输入

2

3

1 2 3

4

1 2 3 3

示例输出

NO

YES

解释

对于第一个测试用例,不存在这样的索引。对于第二个测试用例,

A [1] + A [2] = A [4]

因此指数3满足给定条件。

1 个答案:

答案 0 :(得分:2)

此解决方案以Array.prototype.some

为特色
  

some()方法测试数组中的某个元素是否通过了由提供的函数实现的测试。

使用像

这样的回调
function isSherlock(_, i, a) {
    function sum(i, n) {
        return i < n ? a[i] + sum(i + 1, n) : 0;
    }
    return sum(0, i) === sum(i + 1, a.length);
}

只是在索引的左侧和右侧之间返回比较,以及它的递归函数

function sum(i, n) {
    return i < n ? a[i] + sum(i + 1, n) : 0;
}

用于计算索引小于给定值的数组值。

一共作为工作范例:

&#13;
&#13;
function isSherlock(_, i, a) {
    function sum(i, n) {
        return i < n ? a[i] + sum(i + 1, n) : 0;
    }
    return sum(0, i) === sum(i + 1, a.length);
}

document.write([1, 2, 3].some(isSherlock) + '<br>');
document.write([1, 2, 3, 3].some(isSherlock) + '<br>');
&#13;
&#13;
&#13;