列表

详情


544. 输出比赛匹配对

 

在 NBA 季后赛期间,我们总是安排相对强大的球队与相对弱小的球队比赛,就像让排名第 1 的球队与排名第 n 的球队比赛一样,这是一种使比赛更加有趣的好策略。

现给定 n 支球队,请以字符串的形式返回它们的最终的比赛匹配方案。

n 支球队从 1n 进行标记,代表它们的初始排名(即,排名 1 的是最强的球队,排名 n 的是最弱的球队)。

我们将使用括号 '('')' 以及逗号 ',' 来表示比赛的匹配情况。我们使用括号来表示匹配,逗号来表示分组。在每一轮的匹配过程中,你总是需要遵循使相对强大的球队与相对弱小的球队配对的策略。

 

示例 1:

输入: n = 4
输出: "((1,4),(2,3))"
解释: 
在第一轮,我们将队伍 1 和 4 配对,2 和 3 配对,以满足将强队和弱队搭配的效果。得到(1,4),(2,3).
在第二轮,(1,4) 和 (2,3) 的赢家需要进行比赛以确定最终赢家,因此需要再在外面加一层括号。
于是最终答案是((1,4),(2,3))。

示例 2:

输入: n = 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,8),(4,5)),((2,7),(3,6)))。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string findContestMatch(int n) { } };

rust 解法, 执行用时: 4 ms, 内存消耗: 2.4 MB, 提交时间: 2023-10-17 14:38:00

impl Solution {
    pub fn find_contest_match(n: i32) -> String {
        let mut ans = (1..=n).map(|x| x.to_string()).collect::<Vec<_>>();
        let mut i = n;

        while i > 1 {
            let mut tmp = vec![];
            let n = ans.len();

            for j in 0..n/2 {
                tmp.push(format!("({},{})", ans[j], ans[n-j-1]));
            }

            ans = tmp;
            i /= 2;
        }

        ans[0].clone()
    }
}

golang 解法, 执行用时: 0 ms, 内存消耗: 3.4 MB, 提交时间: 2023-10-17 14:37:16

func findContestMatch1(n int) string {
    dq := []string{}
    for i := 1; i <= n; i++ {
        dq = append(dq, strconv.Itoa(i))
    }

    for len(dq) > 1 {
        nxtdq := []string{}
        for len(dq) > 0 {
            firt := dq[0]
            second := dq[len(dq)-1]
            nxtdq = append(nxtdq, "("+firt+","+second+")")
            dq = dq[1:len(dq)-1]
        }
        dq = nxtdq
    }
    return dq[0]
}

func findContestMatch2(n int) string {
    res := []string{}
    for i := 1; i <= n; i++ {
        res = append(res, strconv.Itoa(i))
    }

    for n > 1 {
        for i := 0; i < n; i++ {
            res[i] = "("+res[i]+","+res[n-i-1]+")"
        }
        n /= 2
    }
    return res[0]
}

// 模拟即可
func findContestMatch(n int) string {
	ss := make([]string, n)
	for i := 1; i <= n; i++ {
		ss[i-1] = strconv.Itoa(i)
	}
	for n > 1 {
		for i := 0; i < n>>1; i++ {
			ss[i] = fmt.Sprintf("(%s,%s)", ss[i], ss[n-i-1])
		}
		n >>= 1
	}
	return ss[0]
}

java 解法, 执行用时: 1 ms, 内存消耗: 39.5 MB, 提交时间: 2023-10-17 14:34:19

class Solution {
    int[] team;
    int t;
    StringBuilder ans;
    public String findContestMatch(int n) {
        team = new int[n];
        t = 0;
        ans = new StringBuilder();
        write(n, Integer.numberOfTrailingZeros(n));
        return ans.toString();
    }

    public void write(int n, int round) {
        if (round == 0) {
            int w = Integer.lowestOneBit(t);
            team[t] = w > 0 ? n / w + 1 - team[t - w] : 1;
            ans.append("" + team[t++]);
        } else {
            ans.append("(");
            write(n, round - 1);
            ans.append(",");
            write(n, round - 1);
            ans.append(")");
        }
    }
}

java 解法, 执行用时: 9 ms, 内存消耗: 41 MB, 提交时间: 2023-10-17 14:32:37

class Solution {
    public String findContestMatch(int n) {
        String[] team = new String[n];
        for (int i = 1; i <= n; ++i)
            team[i-1] = "" + i;

        for (; n > 1; n /= 2)
            for (int i = 0; i < n / 2; ++i)
                team[i] = "(" + team[i] + "," + team[n-1-i] + ")";

        return team[0];
    }
}

python3 解法, 执行用时: 40 ms, 内存消耗: 17 MB, 提交时间: 2023-10-17 14:31:12

class Solution:
    # 模拟
    def findContestMatch1(self, n: int) -> str:
        # team[i] 当前轮第i强
        team = [f'{i}' for i in range(1, n+1)]
        while n > 1:
            for i in range(n//2):
                team[i] = f'({team[i]},{team.pop()})'
            n /= 2

        return team[0]
        
    # 线性输出
    def findContestMatch(self, n: int) -> str:
        team = []
        ans = []
        
        def write(r: int):
            if r == 0:
                i = len(team)
                w = i & -i
                team.append(n//w+1 - team[i-w] if w else 1)
                ans.append(str(team[-1]))
            else:
                ans.append("(")
                write(r-1)
                ans.append(",")
                write(r-1)
                ans.append(")")

        write(int(math.log(n, 2)))
        return ''.join(ans)

上一题