Google – Team Match
有n个player, n是2的倍数,排名1 to n. 每次比赛会让最好的对阵最差的,然后淘汰掉一半人,继续比赛直到只剩一个人位置。
要求返回一个字符串表示整个对阵过程。
比如n = 8, 那么应该return (((1, 8), (4, 5)), ((2, 7), (3, 4)))。
因为第一轮比赛之后胜者为8,7,6,5。 第二轮就应该是(8, 5)和(7, 6)。
[Solution]
这题第一反应应该是recursion。其实这里面有个tail-recursion的概念。
当然Iterative也可以做,但不是很熟练这样的解法,以后需要多练一下。
Read full article from Google – Team Match
有n个player, n是2的倍数,排名1 to n. 每次比赛会让最好的对阵最差的,然后淘汰掉一半人,继续比赛直到只剩一个人位置。
要求返回一个字符串表示整个对阵过程。
比如n = 8, 那么应该return (((1, 8), (4, 5)), ((2, 7), (3, 4)))。
因为第一轮比赛之后胜者为8,7,6,5。 第二轮就应该是(8, 5)和(7, 6)。
[Solution]
这题第一反应应该是recursion。其实这里面有个tail-recursion的概念。
当然Iterative也可以做,但不是很熟练这样的解法,以后需要多练一下。
// Iterativeclass Solution { public String teamMatch(int n) { String[] team = new String[n + 1]; for (int i = 1; i <= n; i++) { team[i] = String.valueOf(i); } while (n > 1) { for (int i = 1; i <= n / 2; i++) { team[i] = print(team[i], team[n - i + 1]); } n /= 2; } return team[1]; } private String print(String i, String j) { return String.format("(%s, %s)", i, j); }}// tail recursionclass Solution2 { public String teamMatch(int n) { String[] team = new String[n]; for (int i = 0; i < n; i++) { team[i] = String.valueOf(i + 1); } return recur(team); } private String recur(String[] team) { if (team.length == 1) { return team[0]; } int n = team.length; String[] newTeam = new String[n / 2]; for (int i = 0; i < n / 2; i++) { newTeam[i] = String.format("(%s, %s)", team[i], team[n - i - 1]); } return recur(newTeam); }}