问题陈述
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满足给定条件。
答案 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;
}
用于计算索引小于给定值的数组值。
一共作为工作范例:
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;