|
| 1 | +package com.stevesun.solutions; |
| 2 | + |
| 3 | +import java.util.ArrayList; |
| 4 | +import java.util.List; |
| 5 | + |
| 6 | +/** |
| 7 | + * During the NBA playoffs, we always arrange the rather strong team to play with the rather weak team, |
| 8 | + * like make the rank 1 team play with the rank nth team, which is a good strategy to make the contest more interesting. |
| 9 | + * Now, you're given n teams, you need to output their final contest matches in the form of a string. |
| 10 | + * The n teams are given in the form of positive integers from 1 to n, which represents their initial rank. |
| 11 | + * (Rank 1 is the strongest team and Rank n is the weakest team.) |
| 12 | + * We'll use parentheses('(', ')') and commas(',') to represent the contest team pairing - parentheses('(' , ')') |
| 13 | + * for pairing and commas(',') for partition. During the pairing process in each round, |
| 14 | + * you always need to follow the strategy of making the rather strong one pair with the rather weak one. |
| 15 | +
|
| 16 | + Example 1: |
| 17 | + Input: 2 |
| 18 | + Output: (1,2) |
| 19 | +
|
| 20 | + Explanation: |
| 21 | + Initially, we have the team 1 and the team 2, placed like: 1,2. |
| 22 | + Then we pair the team (1,2) together with '(', ')' and ',', which is the final answer. |
| 23 | +
|
| 24 | +
|
| 25 | + Example 2: |
| 26 | + Input: 4 |
| 27 | + Output: ((1,4),(2,3)) |
| 28 | +
|
| 29 | + Explanation: |
| 30 | + In the first round, we pair the team 1 and 4, the team 2 and 3 together, as we need to make the strong team and weak team together. |
| 31 | + And we got (1,4),(2,3). |
| 32 | + In the second round, the winners of (1,4) and (2,3) need to play again to generate the final winner, so you need to add the paratheses outside them. |
| 33 | + And we got the final answer ((1,4),(2,3)). |
| 34 | +
|
| 35 | +
|
| 36 | + Example 3: |
| 37 | + Input: 8 |
| 38 | + Output: (((1,8),(4,5)),((2,7),(3,6))) |
| 39 | +
|
| 40 | + Explanation: |
| 41 | + First round: (1,8),(2,7),(3,6),(4,5) |
| 42 | + Second round: ((1,8),(4,5)),((2,7),(3,6)) |
| 43 | + Third round: (((1,8),(4,5)),((2,7),(3,6))) |
| 44 | + Since the third round will generate the final winner, you need to output the answer (((1,8),(4,5)),((2,7),(3,6))). |
| 45 | +
|
| 46 | + Note: |
| 47 | + The n is in range [2, 212]. |
| 48 | + We ensure that the input n can be converted into the form 2k, where k is a positive integer. |
| 49 | + */ |
| 50 | +public class OutputContestMatches { |
| 51 | + |
| 52 | + public String findContestMatch(int n) { |
| 53 | + List<String> pairs = new ArrayList<>(); |
| 54 | + int left = 1, right = n; |
| 55 | + while (left < right) { |
| 56 | + pairs.add("(" + left + "," + right + ")"); |
| 57 | + left++; |
| 58 | + right--; |
| 59 | + } |
| 60 | + if (n == 2) return pairs.get(0); |
| 61 | + return generateFinal(pairs, n/2); |
| 62 | + } |
| 63 | + |
| 64 | + private String generateFinal(List<String> pairs, int n) { |
| 65 | + if (n > 2) { |
| 66 | + int size = pairs.size(); |
| 67 | + int left = 0; |
| 68 | + int right = size-1; |
| 69 | + List<String> newPairs = new ArrayList<>(); |
| 70 | + while (left < right) { |
| 71 | + String newPair = "(" + pairs.get(left) + "," + pairs.get(right) + ")"; |
| 72 | + newPairs.add(newPair); |
| 73 | + left++; |
| 74 | + right--; |
| 75 | + } |
| 76 | + return generateFinal(newPairs, n/2); |
| 77 | + } |
| 78 | + return "(" + pairs.get(0) + "," + pairs.get(1) + ")"; |
| 79 | + } |
| 80 | + |
| 81 | +} |
0 commit comments