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。
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 方案通过计数器,较高效地找到唯一最低薪资,尤其适合处理大规模数据。
以上两种方法实现了同一算法的不同语言解决方案,各自具有独特优势。