/**
* 在某相亲节目现场,有n(1≤n≤500)对善男俊女,为测试男女双方心有灵犀程度,主持人想出了一个很有意思的游戏:
* 主持人在地上画出一排(共2n个)格子,每个格子里都写着一个随机的整数Ai(1≤Ai≤500)。游戏开始后,让他们任
* 意地站成一排(可能会有两个人站在了同一个格子里)。等他们都站好以后,司仪开始计算他们每个人自己的得分,
* 记分规则是:男方的分数等于把从自己所站的位置开始一直累加到开头,女方的分数等于从自己所站位置开始一直
* 累加到末尾。如果某一对男女的得分数是相同的,那他们得默契度较高,比较有缘,交友成功率也高。比如,有3对
* 男女,地上的那一排数字为:3,6,2,4,5,2。如果男方站在第三个位置(2),他的得分为:3+6+2=11;女方站
* 在第4个位置(4),她的得分为4+5+2=11。两人得分相同,很有默契。或者男方站第6个位置(2),女方站第1个位置(3),
* 他们的得分都等于22,也很有默契。如果你朋友在节目现场,那么请你帮他/她算一算有多少种站法可以迅速有机会找 到那个默契的她/他(参数不合法返回-1)。
*
* 输入 第一个参数n,代表善男信女的对数。第二个参数有2n个数据,代表地上的数字。
*
* 输出 输出共有几种站法 样例输入 3 {3, 6 ,2, 4, 5, 2}
*
* 样例输出:2
*
* 即共有2种站法
*
* 第1种站法:女方站位置1,男方站位置6
*
* 第2种站法:女方站位置4,男方站位置3
*
* @author syy
*
*/
public final class Demo {
/**
* 计算有多少种站法可以迅速有机会找到那个默契的她/他。
*
* @param n
* @param numbers
* @return int [总共有几种站法]
*/
public static int count(int n, int[] numbers) {
int len = numbers.length;
int[] man = new int[len];
int[] woman = new int[len];
int mResult = 0;
int wResult = 0;
int count = 0;
if (n < 1 || n > 500 || 2*n != len) {
return -1;
}
for (int i = 0; i < len; i++) {
if(numbers[i] < 1 || numbers[i] > 500){
return -1;
}
mResult += numbers[i];
man[i] = mResult;
wResult += numbers[len - i - 1];
woman[len - i - 1] = wResult;
}
int mj = 0, wj = 0;
for (int i = 0; i < len; i++) {
if (man[len - mj - 1] == woman[wj]) {
count++;
wj++;
mj++;
} else if (man[len - mj - 1] < woman[wj]) {
wj++;
} else {
mj++;
}
}
return count;
}
}
测试用例:
import junit.framework.TestCase;
public class DemoTest extends TestCase
{
public void testCase01()
{
int mumbers[] = { 3, 6, 2, 4, 5, 2 };
assertEquals(2, Demo.count(3, mumbers));
}
}