问题描述
小U作为一位雇主,想要招聘一位工人。现有 n 个人前来应聘,每个人都写下了他们期望的薪资。小U打算选择期望薪资最低的人,但为了避免纠纷,他只会选择在没有其他人提出相同期望薪资的情况下期望薪资最低的人。如果没有符合条件的人,他将不录用任何人。
你的任务是帮助小U找到合适的最低薪资。如果没有合适的人,输出 -1。
初步解决方案
public class Main {
public static int solution(int n, int[] salaries) {
// write code here
int flag = -1;
int[] biao = new int[100];
for (int salary : salaries) {
biao[salary]++;
}
// 遍历biao中的个数,取唯一且最小的数组元素
for (int i = 0; i < biao.length; i++) {
if (biao[i] == 1) {
flag = i;
break; // 找到第一个唯一且最小的薪资,直接返回
}
}
return flag;
}
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);
}
}
解释:
- 遍历
biao数组:在for循环中,我们遍历biao数组,检查每个薪资的出现次数。 - 找到唯一且最小的薪资:当找到第一个出现次数为1的薪资时,将其赋值给
flag并立即退出循环。 - 返回结果:最后返回
flag,如果找到了符合条件的薪资,返回该薪资;如果没有找到,返回-1。
然鹅,暴力解法,缺点明显
用hashmap进行改进
import java.util.HashMap;
public class Main {
public static int solution(int n, int[] salaries) {
// 使用 HashMap 记录每个薪资出现的次数
HashMap<Integer, Integer> salaryCount = new HashMap<>();
// 遍历 salaries 数组,记录每个薪资出现的次数
for (int salary : salaries) {
salaryCount.put(salary, salaryCount.getOrDefault(salary, 0) + 1);
}
// 找到唯一且最小的薪资
int minUniqueSalary = Integer.MAX_VALUE;
for (int salary : salaries) {
if (salaryCount.get(salary) == 1 && salary < minUniqueSalary) {
minUniqueSalary = salary;
}
}
return minUniqueSalary == Integer.MAX_VALUE ? -1 : minUniqueSalary;
}
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);
}
}
思路解释
-
数据结构选择:
- 使用
HashMap来记录每个薪资出现的次数。HashMap是一种键值对数据结构,其中键是薪资,值是该薪资出现的次数。
- 使用
-
记录薪资出现次数:
- 遍历输入数组
salaries,对于每个薪资,将其作为键存入HashMap中,并将其对应的值(出现次数)加一。
- 遍历输入数组
-
查找唯一且最小的薪资:
- 再次遍历输入数组
salaries,检查每个薪资在HashMap中的出现次数。如果某个薪资的出现次数为1,并且它是当前找到的最小薪资,则更新最小薪资。
- 再次遍历输入数组
-
返回结果:
- 如果找到了唯一且最小的薪资,返回该薪资;如果没有找到,返回
-1。
- 如果找到了唯一且最小的薪资,返回该薪资;如果没有找到,返回