在昨天参加了东哥的笔试,选择题做的还算可以,但是还有道编程题和关于jdk8的Stream特性难住了。鉴于此用博客总结一下这道编程题,并结合Stream特性来简化代码,熟悉Api。

题目描述

某校在积极推行无人监考制度,但是总有学生是不自觉的,如果将两个很熟的异性朋友放在同一个考场里,他们就会交流甚至作弊。因此一个考场中不能允许两个很熟的异性朋友存在,学校希望通过搬出一部分学生的方法来改善这一问题。但是又因为教室数量有限,因此希望一个教室中容下的学生尽可能多,即需要搬出教室的学生数量尽可能少,请你输出搬出教室人数最少,且字典序最小的方案。

输入

输入第一行有两个整数n和m,分别表示有n个男生和n个女生,有m个朋友关系。(1<=n<=500,1<=m<=100000)接下来m行,每行有两个整数,x和y,表示第x号男生和第y号女生是朋友

男生的编号均为[1,n],女生的编号为[n+1,2n]

输出

输出第一行包含一个整数a,表示最少需要搬出教室的人数。
输出第二行有a个整数,即a个需要搬出教室的人的编号,要求人数最少,且字典序最小

意思是:一个教室内不能有亲密关系的男女,选择要移除的人满足尽可能的少、学号尽可能的小。

思路

按照题目描述可以明确:移除人数最少代表先移除不止和一个人有关系的同学。学号尽可能的小代表着优先移除男生。它的优先级是:人数>学号。

有了这个目标,再来确定算法的数据结构,我运用了以下的数据结构:

  //维护每个学生的关系映射,一对多的关系
Map<Integer, List<Integer>> relationmap = new HashMap<>(16); //某个学生的关系具体学号
List templist = relationmap.getOrDefault(boynum, new ArrayList<>()); //存放男女生有关系的个数,男生与女生各n个,第一位不放数据。
int[] relation = new int[2*n+1];

然后利用伪代码来具体描述这个过程:

获得输入的男生人数n和关系m;
初始化relation数组,map;
for( m个关系){
接收男生与女生的关系; 将两个学号作key放入Map中; 把另一个学号作value放入map的List中; 以两个学号为下标的relation数组加一;
}
while(true){
从头到尾遍历relation数组,获得最大值的下标maxRelationIndex;
当maxRelationIndex==0,意味着当前没有亲密关系,break;
根据maxRelationIndex获得map中的关系结合list; for(list){
遍历list,将对应的relation数组的下标-1;
}
删除以学号为索引在relation数组的记录;
记录被删除的学号。
}
输出记录:

代码实现

 import java.util.*;

 /**
* TODO
* @Author: HILL
* @date: 2019/8/25 9:50
*
**/
public class Main {
public static void main(String[] args) { //维护关系映射
Map<Integer, List<Integer>> relationmap = new HashMap<>(16);
//男女生人数
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt(); //存放男女生有关系的个数
int[] relation = new int[2*n+1]; for (int i=0;i<m;i++){
int boynum = sc.nextInt();
int girlnum = sc.nextInt(); //添加男生关系映射
List templist = relationmap.getOrDefault(boynum, new ArrayList<>());
templist.add(girlnum);
relationmap.put(boynum,templist);
//添加女生关系映射
templist = relationmap.getOrDefault(girlnum, new ArrayList<>());
templist.add(boynum);
relationmap.put(girlnum,templist);
//维护每个人的关系度的权值,越大代表与越多人有关系
relation[girlnum]++;
relation[boynum]++; }
List<Integer> result = new ArrayList<>();
while (true){
int maxRelationIndex = 0; //从头到尾遍历,优先移除男生
for (int i=1 ;i<relation.length;i++ ){
if (relation[i]>maxRelationIndex){
maxRelationIndex = i;
}
}
//当教室里没有亲密关系时
if (maxRelationIndex == 0){
break;
} //优先移除与最多人有关系的学生
relation[maxRelationIndex] = 0;
//查出所有与被移除学生有关系的学生
List<Integer> list = relationmap.get(maxRelationIndex);
//将它们的关系计数-1
list.forEach(i-> relation[i]--); //将移除的学生加入到结果集
result.add(maxRelationIndex);
relationmap.remove(maxRelationIndex);
}
System.out.println(result.size());
result.forEach(num->System.out.print(num+" ")); }
}

提醒

以上代码仅供交流参考,用例不一定全部通过,因为当我想出来时已经没时间了。从总体上分析,性能估计不会很高,毕竟一个算法下来会有两次循环,同时空间复杂度也比较高。但能做一步是一步嘛,后面再看看能不能换个思路。

JD面试 || 移除教室人数的更多相关文章

  1. jd面试之感

    一面问题:问题都回答的很好,顺利进入二面 1.单点登录的改造和原理 2.hashmap 3.jvm:堆.方法区.栈,本地方法栈,gc,gc的方式 4.spring的ioc.aop的实现方式cglib和 ...

  2. HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

    考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更 ...

  3. HDU 2242 考研路茫茫----空调教室

    传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. 考研系列 HDU2242之空调教室 tarjan

    众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时 ...

  5. HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)

    考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 开篇词The Start以及[Vjudge][HDU2242]空调教室

    开篇 这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客. 以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看. [https://www.luogu.com. ...

  7. FZU 1894 志愿者选拔(单调队列)

    传送门 Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查. ...

  8. FZU1894 单调队列

    S - 1019 Time Limit:1500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  9. FZU 1894 (双端队列)

    Problem 1894 志愿者选拔 Accept: 1166    Submit: 3683 Time Limit: 1500 mSec    Memory Limit : 32768 KB  Pr ...

随机推荐

  1. Excel催化剂开源第46波-按行列排列多个图形技术要点

    此篇对应功能出自:第10波-快速排列工作表图形对象 - 简书 https://www.jianshu.com/p/eab71f2969a6 在Excel的对象模型中,列的宽度不是一般所期待的和行高一样 ...

  2. c语言进阶5-递归算法

    一.  什么是递归 程序调用自身的编程技巧称为递归( recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型 ...

  3. MetInfo5.3管理员密码重置漏洞

    点击忘记密码 下一步 输入已知用户名或者邮箱点击下一步用Burp拦截 右键发送到Repeater 在第一行php后面拼接?met_host虚拟机kali的ip地址:端口号拼接完成后 用虚拟机监听拼接的 ...

  4. java并发笔记之java线程模型

    警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码: ...

  5. string的学习

    原:https://blog.csdn.net/qq_37941471/article/details/82107077 一. string的构造函数的形式: string str:生成空字符串 st ...

  6. SpringBoot Admin 使用指南

    什么是 SpringBoot Admin? Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序.这些应用程序通过 Spring Boot Admin ...

  7. Java VisualVM监控远程JVM

    我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其是内存的消耗是非常庞大,JDK1.6开始自带的VisualV ...

  8. luogu1220_关路灯 区间dp

    传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...

  9. 用vue2.0+vuex+vue-router+element-ui+mockjs实现后台管理系统的实践探索

    A magical vue element touzi admin. 效果演示地址 更多demo展示 分支说明 master分支:前后端统一开发的版本:可以用于学习nodejs+mongodb+exp ...

  10. Go中的异常处理

    1. errors包 Go 有一个预先定义的 error 接口类型 : type error interface { Error() string } 错误值用来表示异常状态.Go也提供了一个包:er ...