給你一個(gè)整數(shù) n ,表示比賽中的隊(duì)伍數(shù)。比賽遵循一種獨(dú)特的賽制:
如果當(dāng)前隊(duì)伍數(shù)是 偶數(shù) ,那么每支隊(duì)伍都會(huì)與另一支隊(duì)伍配對(duì)??偣策M(jìn)行 n / 2 場(chǎng)比賽,且產(chǎn)生 n / 2 支隊(duì)伍進(jìn)入下一輪。
如果當(dāng)前隊(duì)伍數(shù)為 奇數(shù) ,那么將會(huì)隨機(jī)輪空并晉級(jí)一支隊(duì)伍,其余的隊(duì)伍配對(duì)??偣策M(jìn)行 (n - 1) / 2 場(chǎng)比賽,且產(chǎn)生 (n - 1) / 2 + 1 支隊(duì)伍進(jìn)入下一輪。
返回在比賽中進(jìn)行的配對(duì)次數(shù),直到?jīng)Q出獲勝隊(duì)伍為止。
類似這種

輸入:n = 7
輸出:6
第 1 輪:隊(duì)伍數(shù) = 7 ,配對(duì)次數(shù) = 3 ,4 支隊(duì)伍晉級(jí)。
第 2 輪:隊(duì)伍數(shù) = 4 ,配對(duì)次數(shù) = 2 ,2 支隊(duì)伍晉級(jí)。
第 3 輪:隊(duì)伍數(shù) = 2 ,配對(duì)次數(shù) = 1 ,決出 1 支獲勝隊(duì)伍。
總配對(duì)次數(shù) = 3 + 2 + 1 = 6
輸入:n = 14
輸出:13
第 1 輪:隊(duì)伍數(shù) = 14 ,配對(duì)次數(shù) = 7 ,7 支隊(duì)伍晉級(jí)。
第 2 輪:隊(duì)伍數(shù) = 7 ,配對(duì)次數(shù) = 3 ,4 支隊(duì)伍晉級(jí)。
第 3 輪:隊(duì)伍數(shù) = 4 ,配對(duì)次數(shù) = 2 ,2 支隊(duì)伍晉級(jí)。
第 4 輪:隊(duì)伍數(shù) = 2 ,配對(duì)次數(shù) = 1 ,決出 1 支獲勝隊(duì)伍。
總配對(duì)次數(shù) = 7 + 3 + 2 + 1 = 13
方法1
第一種方法比較好理解, 也很簡(jiǎn)單, 一行代碼
一共參賽n個(gè)隊(duì)伍,只有一個(gè)冠軍,需要淘汰n-1個(gè)隊(duì)伍。
因?yàn)槊繄?chǎng)比賽淘汰一個(gè)隊(duì)伍,因此需要進(jìn)行了n-1場(chǎng)比賽, 所以共有n-1個(gè)配對(duì)。
func numberOfMatches(_ n: Int) -> Int {
return n - 1
}
方法2
這種方法就是對(duì)題意的機(jī)械翻譯
每一輪比賽場(chǎng)數(shù) temp / 2 (初始令 temp = n))
每一輪剩余隊(duì)伍 temp / 2 + temp % 2
func numberOfMatches(_ n: Int) -> Int {
var result = 0, temp = n
while(temp > 1) {
result += temp / 2
temp = temp / 2 + temp % 2
}
return result
}
題目來源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址