青训营X豆包MarsCode 技术训练营第二课 | 豆包MarsCode AI 刷题

91 阅读2分钟

第499题 雇主招聘问题

题目分析

小U作为雇主希望找到一个薪资要求最低且不与其他人重复的候选人。如果所有候选人的薪资要求都有重复,则不录用任何人。我们需要从给定的薪资列表中,找出唯一且最低的薪资。

输入:

  • n: 候选人数。
  • salaries: 包含每个候选人期望薪资的列表。

输出:

  • 返回符合条件的最低薪资,若没有则返回 -1。

解题思路

  • 统计薪资出现次数:我们需要找出每个薪资在列表中出现的次数,以识别哪些薪资是唯一的。

  • 筛选唯一薪资:从统计结果中提取出只出现一次的薪资。

  • 求最小值:如果存在唯一薪资,找出其中的最小值;如果不存在,则返回 -1。

通过这样的思路,我们可以确保正确模拟比赛的过程并找到最终的赢家。

解题代码

from collections import Counter
def solution(n: int, salaries: list) -> int:
    # 统计每个薪资的出现次数
    salary_count = Counter(salaries)
    
    # 初始化最小唯一薪资为一个较大数值
    min_unique_salary = float('inf')
    
    # 找出出现次数为1且值最小的薪资
    for salary, count in salary_count.items():
        if count == 1 and salary < min_unique_salary:
            min_unique_salary = salary
    
    # 如果 min_unique_salary 没有被更新,说明没有符合条件的薪资
    return min_unique_salary if min_unique_salary != float('inf') else -1

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)

模块解释

  • collections.Counter:这个模块提供了一种快速且简单的方法来计数元素的出现次数。在这里,我们使用它来统计每个薪资的出现频率。

  • 列表推导式unique_salaries = [salary for salary, count in salary_counts.items() if count == 1] 用于从字典中筛选出只出现一次的薪资,简洁而高效。

  • min() :用于返回列表中的最小值。

结论

通过使用 Counter 模块来统计薪资的频率,并结合列表推导式筛选出唯一的薪资,最终能够高效地找到符合条件的最低薪资。如果没有这样的薪资,返回 -1。这个解法时间复杂度为 O(n),空间复杂度也为 O(n),对于大多数实际应用场景都是有效的。