培训课程将在今后10天内进行两次。有N名员工(编号从0到N1)愿意参加。每位员工都提供了未来10天参加培训的名单。员工首选项表示为字符串数组。NK是一个由数字(0-9)组成的字符串,表示kth员工能够参加的日子。
需要找出在两天中至少有一天可以参加的员工的最大人数。
例如
Given E = ["039", "4", "14", "32", "", "34", "7"], the answer is 5. It can be achieved for example by running training on days 3 and 4. This way employees number 0, 1, 2, 3 and 5 will attend the training.
Given E = ["801234567", "180234567", "0", "189234567", "891234567", "98", "9"], the answer is 7. It can be achieved for example by running training on days 0 and 9. This way employees all will attend the training.
Given E = ["5421", "245", "1452", "0345", "53", "345"], the answer is 6. It can be achieved for example by running training once on day 5. This way employees all will attend the training.这是我的考试,但我没能解决。
我试过了,但只有1,2起案子有效。有谁能分享解决这个问题的窍门吗?
public int solution(String[] E) {
Map<String, Integer> daysCount = new HashMap<String, Integer>();
int n = E.length;
for (int i = 0; i < n; i++) {
String inp = E[i];
for (int j = 0; j < inp.length(); j++) {
char c = inp.charAt(j);
if (daysCount.containsKey(Character.toString(c))) {
daysCount.merge(Character.toString(c), 1, Integer::sum);
}
else {
daysCount.put(Character.toString(c), 1);
}
}
}
Map<String, Integer> topTen = daysCount.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).limit(2)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
List<String> vals = new ArrayList<String>();
topTen.entrySet().forEach(entry -> {
vals.add(entry.getKey());
});
int out = 0;
StringBuilder sb = new StringBuilder();
for (int z = 0; z < vals.size(); z++) {
sb.append(vals.get(z));
}
for (int i = 0; i < n; i++) {
String inp = E[i];
if (inp.matches(".*[" + sb.toString() + "].*")) {
out++;
}
}
return out;
}更新
我已经实现了,在所有员工的天数偏好中的所有天数的计数,并取有最大计数的一天,然后检查这一天是否存在于有多少员工的天数偏好中。
发布于 2022-04-28 17:39:55
诀窍是找出两个不同的集合,这些集合可以最大限度地增加员工的数量。
代码中的问题是,您只比较了两组(天数),这些集(天)是最高员工所首选的。这就是为什么在第2种情况下,您的代码只是比较单个对(第8天和第9天),这是给出有6名雇员的不同集合,而最大的不同集是通过比较第0天和第9天,即7名雇员而得到的。
因此,您应该比较所有的集合,所有的天,而不采取最大2(这将删除您的所有HashMap和最大逻辑)。
下面是代码,它可能不是经过优化的,但可以工作。
public int solution(String[] E) {
int n = E.length;
int max = 0;
for(int i=0;i <10; i++)
for(int j=i+1;j<10; j++) {
//create all pairs of days one by one like 01, 02, 03, 04, 05..... 89
String sb = i+""+j;
int out = 0;
for (int k = 0; k < n; k++) {
String inp = E[k];
if (inp.matches(".*[" + sb.toString() + "].*")) {
out++;
}
}
if(out>max) {
max=out;
}
}
return max;
}对于那些不明白这一点的人,你可以用2D矩阵来做。
days 0 1 2 3 4 5 6 7 8 9
emp0 1 1 1 1 1 1 1 1 1 0
emp1 1 1 1 1 1 1 1 1 1 0
emp2 1 0 0 0 0 0 0 0 0 0
emp3 0 1 1 1 1 1 1 1 1 1
emp4 0 1 1 1 1 1 1 1 1 1
emp5 0 0 0 0 0 0 0 0 1 1
emp6 0 0 0 0 0 0 0 0 0 1取所有集合/日的OR值,并对所有OR结果进行求和。例如,在上面的例子中,第8和第9列将给出最大的不同集,即7。
发布于 2022-04-28 17:53:55
我认为你们实施的问题是忽视了这样一个事实,即第一次计票后出席人数第二多的一天不一定是第二天可供选择。
例如,就E = ["01", "01", "2"]而言,乍一看,0和1似乎是所选日子的好人选。然而,由于0和1都是由相同的人选择的,因此选择2作为所选的日子之一实际上可以最大限度地增加服务人员的数量:
E = ["01", "01", "2"]
Chosen days [0,1] -> Total num of attendants is 2
Chosen days [0,2] or [1,2] -> Total num of attendants is 3因此,我认为你必须计算第二个最受欢迎的日子的出席人数,而不考虑那些已取得座位的雇员的喜好。
https://stackoverflow.com/questions/72046602
复制相似问题