lintcode 输出赛程表

描述

在NBA季后赛期间,我们总是安排一支实力相当强的球队去和实力较弱的球队比赛,比如让排名第1的球队和第n的球队一起比赛,这是一个让比赛更有趣的好策略。现在给定n个球队,你需要以字符串的形式返回他们的最终赛程。

n 组球队以正整数的形式给出,从1到n,表示它们的初始排名。排名第1的是实力最强的球队,排名n最弱的球队。我们将使用括号() 和逗号, 来表示比赛团队的配对——括号()表示比赛的组而逗号,表示间隔。在每一轮的配对过程中,你都需要遵循这个策略,那就是让一个相当强的和一个相当弱的配对。

n的范围 [2, 2^12]。
保证输入的n可以转化为2 ^ k这种形式, k是一个正整数。

样例

1

输入: 2
输出: “(1,2)”

2

输入: 4
输出: “((1,4),(2,3))”
解释:
在第一轮中, 我们将球队1和4, 2和3组合在一起, 因为我们需要把强队和弱队放在一起.
然后我们有 (1,4) 和 (2,3)。
在第二轮中, (1,4) 和 (2,3) 的获胜者需要再次比赛以产生最终的胜利者, 所以你需要在最外面加上括号.
我们得到了最终答案((1,4),(2,3))

3

输入: 8
输出: “(((1,8),(4,5)),((2,7),(3,6)))”
解释:
第一轮: (1,8),(2,7),(3,6),(4,5)
第二轮: ((1,8),(4,5)),((2,7),(3,6))
第三轮: (((1,8),(4,5)),((2,7),(3,6)))

思路

每次都是把最左边和最右边的结合在一起比赛,循环完成

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
/**
* @param n: a integer, denote the number of teams
* @return: a string
*/
string findContestMatch(int n) {
// write your code here
vector<string> res;
for (int i = 1; i <= n; ++i)
res.push_back(to_string(i));

while(res.size() != 1){
for (int i = 0; i < res.size(); i++) {
res[i] = "(" + res[i] + "," + res[n-i-1] + ")";
res.pop_back();
}
n /= 2;
}

return res[0];

}
};
-------------end of file thanks for reading-------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值