雇主招聘问题的练习笔记
问题描述
小 U 作为一位雇主,想要招聘一位工人。现有 ( n ) 个人前来应聘,每个人都写下了他们期望的薪资。小 U 打算选择期望薪资最低的人,但为了避免纠纷,他只会选择在没有其他人提出相同期望薪资的情况下期望薪资最低的人。如果没有符合条件的人,他将不录用任何人。
你的任务是帮助小 U 找到合适的最低薪资。如果没有合适的人,输出 -1。
问题分析
这个问题的核心在于找到唯一的最小值。也就是说,我们需要在所有应聘者的期望薪资中,找出那些只出现一次的薪资,然后从中选出最小的那个。
解决思路:
- 统计薪资出现次数:使用哈希表(如 Python 的
Counter)统计每个薪资期望的出现次数。 - 筛选唯一薪资:找出只出现一次的薪资期望。
- 寻找最小值:在唯一薪资中选出最小的一个。
如果不存在只出现一次的薪资期望,则输出 -1。
难点
- 数据统计:如何高效地统计每个薪资期望的出现次数。
- 边界情况处理:当所有薪资期望都不唯一时,如何正确地输出
-1。
心路历程
最初,我考虑直接对薪资列表进行排序,然后遍历查找第一个不重复的薪资。但这种方法的时间复杂度为 ( O(n \log n) ),对于大型数据集效率不高。
随后,我想到可以使用哈希表来统计薪资的出现次数。这样可以在 ( O(n) ) 的时间复杂度内完成统计,并且方便地筛选出只出现一次的薪资期望。
代码实现
def solution(n: int, salaries: list) -> int:
from collections import Counter
salary_counts = Counter(salaries)
# 筛选出只出现一次的薪资
unique_salaries = [salary for salary, count in salary_counts.items() if count == 1]
if not unique_salaries:
return -1
else:
return min(unique_salaries)
if __name__ == '__main__':
print(solution(n=3, salaries=[3, 2, 1]) == 1)
print(solution(n=6, salaries=[1, 1, 4, 5, 1, 4]) == 5)
print(solution(n=3, salaries=[4, 4, 4]) == -1)
代码讲解
- 导入模块:
from collections import Counter用于统计薪资出现次数。 - 统计薪资出现次数:
salary_counts = Counter(salaries)得到一个字典,键为薪资,值为出现次数。 - 筛选唯一薪资:使用列表推导式
[salary for salary, count in salary_counts.items() if count == 1]得到只出现一次的薪资列表。 - 判断并返回结果:
- 如果不存在唯一薪资,返回
-1。 - 否则,返回唯一薪资中的最小值。
- 如果不存在唯一薪资,返回
测试样例分析
样例 1
- 输入:
n = 3, salaries = [3, 2, 1] - 薪资统计:{3:1, 2:1, 1:1}
- 唯一薪资:3, 2, 1
- 最小唯一薪资:1
- 输出:
1
样例 2
- 输入:
n = 6, salaries = [1, 1, 4, 5, 1, 4] - 薪资统计:{1:3, 4:2, 5:1}
- 唯一薪资:5
- 最小唯一薪资:5
- 输出:
5
样例 3
- 输入:
n = 3, salaries = [4, 4, 4] - 薪资统计:{4:3}
- 唯一薪资:无
- 输出:
-1
总结
通过使用哈希表统计薪资出现次数,我们可以高效地找到唯一的最小薪资期望,帮助小 U 做出招聘决策。该方法的时间复杂度为 ( O(n) ),空间复杂度为 ( O(n) ),适用于大规模数据。