首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到可以参加会议的最大学生。

找到可以参加会议的最大学生。
EN

Stack Overflow用户
提问于 2022-04-28 15:40:03
回答 2查看 473关注 0票数 1

培训课程将在今后10天内进行两次。有N名员工(编号从0到N1)愿意参加。每位员工都提供了未来10天参加培训的名单。员工首选项表示为字符串数组。NK是一个由数字(0-9)组成的字符串,表示kth员工能够参加的日子。

需要找出在两天中至少有一天可以参加的员工的最大人数。

例如

代码语言:javascript
复制
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起案子有效。有谁能分享解决这个问题的窍门吗?

代码语言:javascript
复制
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;
    }

更新

我已经实现了,在所有员工的天数偏好中的所有天数的计数,并取有最大计数的一天,然后检查这一天是否存在于有多少员工的天数偏好中。

EN

回答 2

Stack Overflow用户

发布于 2022-04-28 17:39:55

诀窍是找出两个不同的集合,这些集合可以最大限度地增加员工的数量。

代码中的问题是,您只比较了两组(天数),这些集(天)是最高员工所首选的。这就是为什么在第2种情况下,您的代码只是比较单个对(第8天和第9天),这是给出有6名雇员的不同集合,而最大的不同集是通过比较第0天和第9天,即7名雇员而得到的。

因此,您应该比较所有的集合,所有的天,而不采取最大2(这将删除您的所有HashMap和最大逻辑)。

下面是代码,它可能不是经过优化的,但可以工作。

代码语言:javascript
复制
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矩阵来做。

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2022-04-28 17:53:55

我认为你们实施的问题是忽视了这样一个事实,即第一次计票后出席人数第二多的一天不一定是第二天可供选择。

例如,就E = ["01", "01", "2"]而言,乍一看,01似乎是所选日子的好人选。然而,由于01都是由相同的人选择的,因此选择2作为所选的日子之一实际上可以最大限度地增加服务人员的数量:

代码语言:javascript
复制
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

因此,我认为你必须计算第二个最受欢迎的日子的出席人数,而不考虑那些已取得座位的雇员的喜好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72046602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档