/** * 在某相亲节目现场,有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)); } }