📅  最后修改于: 2023-12-03 15:12:46.501000             🧑  作者: Mango
给你一个由多个字母组成的字符串,每个字母都代表着候选人的名字,并且候选人的名字可能会重复,你需要从中选出得票数最多的候选人,输出他的名字和得票数。
10
BDBACACDEB
5 B
3 C
首先,我们需要用哈希表来记录每个候选人的得票数,然后遍历整个字符串,统计每个候选人的得票数。最后,我们找到得票数最多的候选人以及其得票数。
为了找到得票数第二多的候选人,我们可以先将所有得票数都存储在一个数组中,然后将数组排序,找到第二大的数,最后在哈希表中找到对应候选人的名字即可。
def find_candidate(s):
candidate = {}
for c in s:
if c not in candidate:
candidate[c] = 1
else:
candidate[c] += 1
return candidate
def find_winner(candidate):
sorted_candidate = sorted(candidate.items(), key=lambda x: x[1], reverse=True)
return sorted_candidate[0]
def find_runner_up(candidate):
vote_nums = [v for k, v in candidate.items()]
vote_nums.sort(reverse=True)
max_vote, second_max_vote = vote_nums[0], vote_nums[1]
for k, v in candidate.items():
if v == second_max_vote:
return v, k
def main():
n = int(input())
s = input().strip()
candidate = find_candidate(s)
max_vote, winner = find_winner(candidate)
print(f"{max_vote} {winner}")
second_max_vote, runner_up = find_runner_up(candidate)
print(f"{second_max_vote} {runner_up}")
if __name__ == '__main__':
main()
返回markdown格式:
## 门|门 IT 2006 |第 75 题
### 题目描述
给你一个由多个字母组成的字符串,每个字母都代表着候选人的名字,并且候选人的名字可能会重复,你需要从中选出得票数最多的候选人,输出他的名字和得票数。
### 输入格式
- 第一行包含一个整数n,表示字符串的长度。
- 接下来一行包含一个长度为n的字符串s,表示投票情况。字符串中仅包含大写字母。
### 输出格式
- 输出两行,第一行包含两个整数,分别表示得票数最多的候选人的得票数和候选人的名字。
- 第二行输出第二个得票数最多的候选人的得票数和名字。如果存在多个得票数相同的候选人,则输出得票数最多的那个。
### 输入样例
10 BDBACACDEB
### 输出样例
5 B 3 C
### 解题思路
首先,我们需要用哈希表来记录每个候选人的得票数,然后遍历整个字符串,统计每个候选人的得票数。最后,我们找到得票数最多的候选人以及其得票数。
为了找到得票数第二多的候选人,我们可以先将所有得票数都存储在一个数组中,然后将数组排序,找到第二大的数,最后在哈希表中找到对应候选人的名字即可。
### 代码实现
```python
def find_candidate(s):
candidate = {}
for c in s:
if c not in candidate:
candidate[c] = 1
else:
candidate[c] += 1
return candidate
def find_winner(candidate):
sorted_candidate = sorted(candidate.items(), key=lambda x: x[1], reverse=True)
return sorted_candidate[0]
def find_runner_up(candidate):
vote_nums = [v for k, v in candidate.items()]
vote_nums.sort(reverse=True)
max_vote, second_max_vote = vote_nums[0], vote_nums[1]
for k, v in candidate.items():
if v == second_max_vote:
return v, k
def main():
n = int(input())
s = input().strip()
candidate = find_candidate(s)
max_vote, winner = find_winner(candidate)
print(f"{max_vote} {winner}")
second_max_vote, runner_up = find_runner_up(candidate)
print(f"{second_max_vote} {runner_up}")
if __name__ == '__main__':
main()
本题中,遍历整个字符串的时间复杂度为 O(n);哈希表中插入一条数据的时间复杂度为 O(1);排序的时间复杂度为 O(nlogn)。因此,总时间复杂度为 O(nlogn)。
在本题中,哈希表的空间复杂度为 O(n);排序时需要的数组空间也为 O(n)。因此,总空间复杂度为 O(n)。