2014.3.8 去哪儿网实习生笔试题

实习的题目跟应届的差不少,只有三个题

1.在有序数组中查找元素,若存在,返回位置;若不存在,返回应该插入的位置

2.统计全校学生的成绩和信息。两个文件,一个score.txt,包含全部学生的学号、科目、单科成绩;一个info.txt,包含学生的学号、学院、专业、姓名。

要求输出每个学院每个专业的第一名的姓名,挂科不算。

两个文件:info.txt 存放学生基本信息

  学号 学院 专业 姓名
  1001 计算机学院 软件工程 刘月
  1002 生物工程 服装设计 孙丽

score.txt存放分数信息

  学号 学科 成绩

  1001 数据结构 85
  1001 线性代数 89
  1002 数据库 100
  1002 面料工艺 30

3.对第一题给出完整的测试程序。

第一题是典型的二分查找,基本所有的有关数据结构与算法的教科书上都找得到。所以在此略过不提。针对第二题,现在给出我的解答,如果中间哪里存在纰漏的话,诸位看家不妨指出来,以求共同进步。整体思路基本如下:

1 创建Student类,各字段按照info文件中属性来安排,在读入info.txt时将Student初始化并放入list中;

2 创建HashMap,读取score.txt,对学号进行hash,map中 的值记录该学生的总成绩,如果有不及格的课程,则总成绩记为-1;

3 为求的最终的输出结果,创建HashMap,对学院以及专业进行hash,map中的值存放一个list,该list中保存最高成绩的那几位同学(包含多个第一名)

废话不多说,上代码:

package cn.xjie.arith;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class MajorScore {
	public static void main(String[] args) {
		MajorScore ms = new MajorScore();
		List<Student> list = ms.getInfo();
		Map<String,Integer> scoreMap = ms.getScore();
		Map<String,List<Student>> topMap = ms.getTopStu(list, scoreMap);
		for(Map.Entry<String, List<Student>> me:topMap.entrySet()){
			String schoolMajor = me.getKey();
			String str[] = schoolMajor.split("_");
			System.out.println(str[0] +"\t" + str[1]+":");
			for(Student stu:me.getValue()){
				System.out.println(stu.toString() + scoreMap.get(stu.getId()));
			}
		}
	}
	//读取info.txt  
	public List<Student> getInfo() {		
		try {
			List<Student> list = new LinkedList<Student>();
			FileReader fr = new FileReader("src/info.txt");
			BufferedReader br = new BufferedReader(fr);
			int lineNum = 0;
			String str;
			while ((str = br.readLine()) != null) {
				lineNum++;
				if (lineNum == 1){
					//第一行是列名,故不用读取
					continue;
				}else{
					String info[] = str.split("\\s+");  //文件中有用空格和tab分割来对齐的,所以纯粹用" ",经测试不行,用tab倒是可以
					Student stu = new Student(info[0], info[1], info[2], info[3]);
					list.add(stu);
				}
			}
			fr.close();br.close();
			for (Student stu : list) {
				System.out.println(stu.toString());
			}
			return list;
		} catch (Exception e) {
			System.out.println("info文件读取出错");
			e.printStackTrace();
			return null;
		}
	}
	
	//读取score,放入hashmap,key为学生id,value为总成绩,有不及格的科目不及格的记为-1  HashMap<String,Integer>
	public HashMap<String,Integer>  getScore(){
		Map<String,Integer> map = new HashMap<String,Integer>();
		try{
			FileReader fr = new FileReader("src/score.txt");
			BufferedReader br = new BufferedReader(fr);
			int lineNum = 0;
			String str;
			while ((str = br.readLine()) != null) {
				lineNum++;
				if (lineNum == 1){
					//第一行是列名,故不用读取
					continue;
				}else{
					if(str.matches("^\\s*$")) //str为空格字符串或空字符串
						break;
					String score[] = str.split("\\s+"); //后来测试又发生一个错误,score文件中存在空行也不行,所以加了上面的检查
					if(map.containsKey(score[0]) && (map.get(score[0])!=-1)){
						if(Integer.parseInt(score[2])>=60){
							map.put(score[0], map.get(score[0])+Integer.parseInt(score[2]));
						}else{
							map.put(score[0], -1); //不及格总成绩记为-1
						}
					}else{
						map.put(score[0],Integer.parseInt(score[2]));
					}
				}
			}
			for(Map.Entry<String, Integer> me:map.entrySet()){
				System.out.println(me.getKey()+"\t"+me.getValue());
			}
			return (HashMap<String, Integer>) map;
		}catch (Exception e) {
			System.out.println("score文件读取出错");
			e.printStackTrace();
			return null;
		}
	}
	//考虑重复的情况,所以,map的值里放入List<Student> 学院_专业 为关键字
	public Map<String,List<Student>> getTopStu(List<Student> list,Map<String,Integer> scoreMap){
		 Map<String,List<Student>> topMap = new  HashMap<String,List<Student>>();
		 for(Student stu:list){
			 String key=stu.getSchool()+ "_"+stu.getMajor();
			 if(topMap.containsKey(key)){
				 String id = topMap.get(key).get(0).getId(); //获得该学院最高成绩学生的id
				 if(scoreMap.get(stu.getId()).compareTo(scoreMap.get(id))<0){ //当前学生与map中的最高成绩做比较
					 continue;
				 }else if(scoreMap.get(stu.getId()).equals(scoreMap.get(id))){ //等于则添加
					 topMap.get(key).add(stu);
				 }else{  //大于则清空list,然后将stu加入toplist
					 topMap.get(key).clear();
					 topMap.get(key).add(stu);
					 
				 }
			 }else{
				 List<Student> toplist = new LinkedList<Student>();
				 toplist.add(stu);
				 topMap.put(key, toplist);
			 }
		 }
		return topMap;
	}
}


class Student{
	private String id;
	private String school;
	private String major;
	private String name;
	public Student(String id, String school, String major, String name) {
		super();
		this.id = id;
		this.school = school;
		this.major = major;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", school=" + school + ", major=" + major
				+ ", name=" + name + "]";
	}
	public String toString(int i) {
		return "Student [id=" + id + ", school=" + school + ", major=" + major
				+ ", name=" + name + "]";
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public String getMajor() {
		return major;
	}
	public void setMajor(String major) {
		this.major = major;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

在此附上info.txt

学号		学院		专业		姓名
1001	理学院	信息		张三
1002	化学院	化学  		李四
1003	物理学院	物理		王五
1004	理学院	信息		张四
1005	理学院	信息		张五

以及score.txt

学号		课程		成绩
1001	数据结构 	89
1003	离散数学	98
1001	离散数学	87
1002 	数学 		80
1002 	离散数学	90
1003	组成原理	87
1005	数据结构 	89
1005	离散数学	87
1004	数据结构 	100
1004	离散数学	59	

最终的输出结果
Student [id=1001, school=理学院, major=信息, name=张三]
Student [id=1002, school=化学院, major=化学, name=李四]
Student [id=1003, school=物理学院, major=物理, name=王五]
Student [id=1004, school=理学院, major=信息, name=张四]
Student [id=1005, school=理学院, major=信息, name=张五]
1003	185
1004	-1
1001	176
1002	170
1005	176
物理学院	物理:
Student [id=1003, school=物理学院, major=物理, name=王五]185
理学院	信息:
Student [id=1001, school=理学院, major=信息, name=张三]176
Student [id=1005, school=理学院, major=信息, name=张五]176
化学院	化学:
Student [id=1002, school=化学院, major=化学, name=李四]170




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值