学习笔记——雇主招聘问题

70 阅读3分钟

Java与Python实现——唯一最低薪资求解问题

在招聘场景中,我们需要找到唯一的最低薪资。给定候选人期望的薪资,要求我们返回最低且唯一的薪资值,如果没有符合条件的,返回 -1。以下是 Java 和 Python 两种实现方法的学习笔记,包括解题思路、代码实现和分析。


问题分析

目标:在一组候选人期望的薪资数据中找到最低且唯一的薪资。

输入:一个整数 n(表示候选人数量)和一个数组 salaries(表示候选人的薪资期望)。

输出:符合条件的唯一最低薪资,如果没有符合条件的,返回 -1

示例

  • 输入 n = 3, salaries = [3, 2, 1],输出 1
  • 输入 n = 6, salaries = [1, 1, 4, 5, 1, 4],输出 5
  • 输入 n = 3, salaries = [4, 4, 4],输出 -1

解题思路

  1. 排序薪资数组:将薪资按从小到大的顺序排序,便于后续处理。
  2. 遍历薪资数组:检查排序后的每个薪资,判断其是否唯一(即不等于前后相邻元素的值)。
  3. 输出结果:找到唯一的最低薪资则返回它;遍历完未找到,返回 -1

Java 解决方案

在 Java 中,使用 Arrays.sort() 方法对薪资数组进行排序。然后通过遍历排序后的数组,检查相邻元素是否相同,找到唯一的最低薪资。

import java.util.Arrays;

public class Main {
    public static int solution(int n, int[] salaries) {
        // 1. 对薪资数组进行排序
        Arrays.sort(salaries);
        
        // 2. 遍历排序后的数组,检查当前薪资是否唯一
        for (int i = 0; i < n; i++) {
            // 检查当前薪资是否唯一
            if ((i == 0 || salaries[i] != salaries[i - 1]) && (i == n - 1 || salaries[i] != salaries[i + 1])) {
                return salaries[i];
            }
        }
        
        // 如果没有找到唯一的最低薪资,返回 -1
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, new int[]{3, 2, 1}) == 1);
        System.out.println(solution(6, new int[]{1, 1, 4, 5, 1, 4}) == 5);
        System.out.println(solution(3, new int[]{4, 4, 4}) == -1);
    }
}

代码解析

  • Arrays.sort(salaries):对薪资数组进行排序,使得相同的薪资相邻。
  • if 条件:检查 salaries[i] 是否唯一,即前后值均不同。
  • 直接返回唯一最低薪资:遍历过程中找到符合条件的最低薪资时立即返回。
  • 若遍历结束未找到,返回 -1

时间复杂度O(n log n)(排序耗时),空间复杂度为 O(1)


Python 解决方案

在 Python 中,我们可以使用 collections.Counter 对薪资进行计数,然后筛选出只出现一次的最低薪资。

from collections import Counter

def find_min_unique_salary(n, salaries):
    # 统计每个薪资的出现次数
    salary_counts = Counter(salaries)
    
    # 找出仅出现一次的薪资
    unique_salaries = [salary for salary, count in salary_counts.items() if count == 1]
    
    # 如果没有唯一的最低薪资,返回 -1
    if not unique_salaries:
        return -1
    
    # 返回唯一最低薪资
    return min(unique_salaries)

# 测试样例
print(find_min_unique_salary(3, [3, 2, 1]) == 1)  # 输出: 1
print(find_min_unique_salary(6, [1, 1, 4, 5, 1, 4]) == 5)  # 输出: 5
print(find_min_unique_salary(3, [4, 4, 4]) == -1)  # 输出: -1

代码解析

  • Counter(salaries):统计每个薪资的出现次数。
  • unique_salaries 列表推导:提取只出现一次的薪资。
  • unique_salaries 为空,返回 -1,否则返回其中的最小值。

时间复杂度O(n)(使用计数器和遍历一次列表),空间复杂度 O(n)(存储薪资计数)。


总结与比较

特性Java 实现Python 实现
使用方法数组排序+遍历使用计数器
时间复杂度O(n log n)O(n)
空间复杂度O(1)O(n)
可读性简洁,但依赖排序和条件判断简洁,依赖字典计数器

总结

  • Java 方案利用排序和条件判断,较适合直接处理小型或中型数据集,避免了额外空间开销。
  • Python 方案通过计数器,较高效地找到唯一最低薪资,尤其适合处理大规模数据。

以上两种方法实现了同一算法的不同语言解决方案,各自具有独特优势。