# interview_qnxg **Repository Path**: lstar01/interview_qnxg ## Basic Information - **Project Name**: interview_qnxg - **Description**: 易千面试题 - **Primary Language**: HTML/CSS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-20 - **Last Updated**: 2021-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 原题目: ## 易千的人员报名系统 最近易千网络文化工作室开始向某大学招收同学。因为同学们积极参与,报名人数过多,原有的报名系统需要进行升级。现有方案如下,同学的报名信息需要收集学号和姓名,易千今年拟招收 n 名程序同学,目前有很多名同学报名,同时,同学每天可以打卡,增加自己的报名意愿,为简化设计,打卡和报名采用同一个接口,同时打卡可以修改自己的信息.当易千已经招到n名同学时,再次招收的同学会把最不活跃最久的同学移除,给更加感兴趣的同学机会。但是,同时易千的管理员发现,有一部分同学恶意刷自己的活跃度,因此,管理员会手动剔除一部分同学。假设 "IN" 表示报名/修改,"OUT"表示剔除,opt表示操作类型。管理员可以随时用"LOOK"指令查看同学学号对应的姓名,未查到则输出"ERROR"。假设共有m次操作,并且管理员剔除的学生的学号一定是存在的.最后应当输入剩余的同学学号(顺序无关紧要) ## 输入输出如下 第一行输入n,m (int) 后续m行 输入操作类型 opt 如果 opt=="IN" 则后续输入为 stuid(学号) name(姓名) //代表该学号对应的同学报名或者修改报名 活跃度+1 如果 opt == 'OUT' 则后续输入为 stuid (学号) //代表管理员提出了该学号的同学 如果 opt == 'LOOK' 则后续输入为 stuid (学号) //代表管理员查该学号对应的姓名 ## 示例 输入示例 3,11 //招收3名同学 共有11个操作 IN 123 wjq //第1名同学的学号是123 姓名是wjq IN 234 wjq1 //第2名同学的学号是234 姓名是wjq1 LOOK 999 //查看学号999的同学的信息,不存在 输出"ERROR" LOOK 123 //查看学号123的同学的信息, 输出"wjq" IN 345 wjq2 //第3名同学的学号是356 姓名是wjq2 IN 444 wjq3 //第4名同学的学号是444 姓名是wjq3,此时系统里已经有3名同学,需要找到最不活跃最久的同学,此时前三名同学的活跃度都是1,最久的同学是123,故移除123同学,加入444同学 LOOK 123 //查看123同学的信息,不存在 输出"ERROR" IN 234 wjq4 //第5名同学的学号是234,姓名是wjq4,发现是原有的同学打卡,同时修改了自己的姓名,活跃度++ IN 888 wjq6 //第6名同学加入,此时已经有3名同学,分别是 234 345 444,234同学的活跃度是2,345和444同学的活跃度都是1,移除最久未活跃的345同学,加入888同学 LOOK 345 //查看345同学的信息,不存在,输出 “ERROR” IN 777 wjq7 //777同学加入,此时系统里的同学是 234 444 和888 ,最不活跃的最久的同学是444,移除444,加入777同学 ## 输出示例 根据以上分析 ERROR wjq ERROR ERROR 234,wjq4 888,wjq6 777,wjq7 # 开发背景和小插曲 一开始看到面试题的时候,输入输出,开始查看需求要用什么语言来实现,发现什么都可以那就来最简单的Python吧! 当写完Python代码,总感觉哪里不太对劲,作为一个报名系统,那当然得多平台实现,总不能报名还需要编译程序或者只能运行exe吧,于是就想着我可不可以写个网页...... 既然有了网页,那肯定少不了数据库,由于比较熟悉PHP,所以将PHP作为后端语言并实现数据库的交互。于是就有了下面提到的网页系统-代码模式。 写完之后又感觉哪里不太对劲,我都写了网页系统了,为什么不能有个可视化页面呢,普通用户看到代码都懒得去报名了吧,于是我又新建了一个project开始着手可视化界面(相比代码模式的可视化 而非终端页面和图形化页面的区别)。 数据库写好了,页面可以正常访问了,我把它扔进了我自己的服务器里,想来想去,要是所有人都用同一个数据库的表,那大家测试的时候报名信息啥的不就混乱了嘛,毕竟我这可是一个网络数据库哇,于是又写了一个随机生成编号并在数据库里给每一个访问的用户生成了一个专属数据表。 零零散散的时间,终于把整个系统写完了,回头一看,三天过去了,好像最初的面试题没有这么多需求的来着...... # Python部分(看注释就好 不做过多解释啦) #### 主要程序思路: 首先获取人数和指令数,进行循环参数的设定,接着获取指令,指令交给函数action_achieve专门处理,它可以将指令进行分离并使用三个if判断opt类型,进行相应的操作即可。 #### 数据储存思路: 使用变量储存的就不说了,使用一个字典来实现学号和名字的对应,使用一个列表来模拟最后的名单。报名则在列表最后插入该同学学号,打卡则将列表中原有学号删去,重新在最后插入,使得整个列表保持从头到尾是最不活跃到最活跃,人超了就把头(列表第一个学号)去掉就好。 ### 代码部分 ``` # 定义变量 namedic = {} interviewer_id =[] # 定义执行指令的函数 def action_achieve(action): # 拿到指令后先进行指令分析 action_list = action.split(" ") # 将指令拆分为列表 # 开始判断opt类型 if action_list[0] == "IN": # opt为IN,执行插入操作 id = action_list[1] name = action_list[2] if id in interviewer_id: # 如果之前已经报名,则更新活跃列表,默认更改名字 interviewer_id.remove(id) interviewer_id.append(id) namedic[id] = name else: # 之前没报名就开始报名 interviewer_id.append(id) namedic[id] = name # 还需要判断有没有挤掉别人 if len(interviewer_id) == (need_num + 1): # 说明有人要出去了,删掉最不活跃的 del interviewer_id[0] if action_list[0] == "LOOK": # opt为LOOK,执行查看操作 id = action_list[1] # 从字典中获取相应的名字,没有则输出ERROR print(namedic.get(id, "ERROR")) if action_list[0] == "OUT": # opt为OUT,执行删除操作 id = action_list[1] # 题目未要求 但是人为输入数据有必要进行报错处理 if id in interviewer_id: interviewer_id.remove(id) del namedic[id] else: print("ERROR") # 下面是主函数的执行 num = input().split(",") need_num = int(num[0]) ac_num = int(num[1]) # 开始从键盘输入指令并执行,指令会逐句执行 for i in range(ac_num): action = input() action_achieve(action) # 输出最后的名单 for i in range(need_num): print(interviewer_id[i],namedic[interviewer_id[i]],sep=",",end=" ") ``` # 网页系统部分 ### 一些小说明 本系统有两种模式,一种是可视化模式,即表单完全可视化,你只需要选择你需要的操作,输入对应的录取人数,学号,姓名就可以直接提交执行;另一种是代码模式,即表单只有两栏,即录取人数和代码,你需要使用题目中所说的IN 123 test来完成报名/打卡操作,其他指令见题目。 ## 1.如果你想直接使用或测试 1.可视化模式直接访问[易千报名系统-可视化版](https://ulpower.cn/interviewer_qnxg) 2.代码模式直接访问[易千报名系统-代码版](https://ulpower.cn/interviewer_qnxg/index_code.php) 【网站使用的是自己的服务器,且由于一些原因暂时关闭了CDN,访问可能稍慢请谅解!】 ### 注意事项: #### 1.由于每个访问者的数据库之间是隔离的,您的测试操作不会影响他人。 #### 2.题目中需求没有提到被移除的同学的信息是否仍保留在数据库中,本系统默认不保留被移除同学的数据,如您在测试过程中修改了录取同学的人数,之前被移除的同学不会出现在录取名单中。 #### 3.最终名单为前后端直接交互,如您在新标签页中进行操作后没有在本标签页刷新,其结果将不会发生改变,不会自动刷新。 ## 2.如果你想深入了解该系统,查看源码或者让代码在本地端运行 #### 网页前端:HTML,CSS,JS,ElementUI #### 网页后端:PHP #### 数据库:MySQL ## 代码文件解释 ### index.php 该页用于实现可视化模式的报名系统,通过前端的input输入后,通过post请求交由action.php进行处理。同时该页也将直接连接数据库,用于最终名单的显示。同时还将实现第一次进入时的进行提示。 ### index_code.php 该页用于实现代码模式的报名系统,通过前端的input输入后,通过post请求交由action.php进行处理。其他同index.php ### action.php 该文件用于处理上述文件传来的get请求和post请求,并与数据库进行连接,最后将运行结果通过弹窗和cookie再次返回到index或者index_code中。 ### exit.php 该文件用于重置cookie,重置后进入系统将重新生成新的数据库,之前的数据将无法找回。 ### connect.php 该文件用于数据库的链接,数据库的相关参数再次设定,如果在本地端运行请在此修改你的数据库参数。