📜  门|门 IT 2006 |第 75 题(1)

📅  最后修改于: 2023-12-03 15:12:46.501000             🧑  作者: Mango

门|门 IT 2006 |第 75 题
题目描述

给你一个由多个字母组成的字符串,每个字母都代表着候选人的名字,并且候选人的名字可能会重复,你需要从中选出得票数最多的候选人,输出他的名字和得票数。

输入格式
  • 第一行包含一个整数n,表示字符串的长度。
  • 接下来一行包含一个长度为n的字符串s,表示投票情况。字符串中仅包含大写字母。
输出格式
  • 输出两行,第一行包含两个整数,分别表示得票数最多的候选人的得票数和候选人的名字。
  • 第二行输出第二个得票数最多的候选人的得票数和名字。如果存在多个得票数相同的候选人,则输出得票数最多的那个。
输入样例
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)。