java编程--心有灵犀一点通

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

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值