【科大讯飞2017年笔试题】课程冲突

题目:课程冲突

小明是一名学生,又到了学校的选课时间,他想选一些课程学习,已知课程开课时间都在周一到周五之内,早上4节课,晚上2节课。

小明担心选课时间上有所冲突,所以他希望可以对课程时间进行检查。

输入:

首先输入一个整数n(0<n<=100),表示小明选课总数。

之后输入n行选课信息,每行选课信息有2个数字,前一位用0到4表示周一到周五,后一位用0到9表示从早到晚顺序第几讲课,如12表示礼拜2第3讲课。01表示礼拜

1第2讲课。

每行第二个数字表示课程代号,如:204521。课程代码为6位数字。输入课程代码为不重复。

输出:

如果没有冲突课程,输出YES。

如果有冲突课程,也就是同一时间多于一节课,输出所有冲突的课程。输出有多行,如果多个不同的上课时间都有课程冲突,按照周一到周五,早上到晚上时间先后,

按行输出冲突信息。在同一行内,先输出冲突时间,之后输出这一时间的所有课程,输出课程的顺序为输入中这些课程出现的顺序,课程之间以空格分隔,不要在行末输出

多余的空格。

样例输入:

5

01 204521

23 204523

22 204526

01 204528

22 204527

样例输出:

01 204521 204528

22 204526 204527


题目很长,我写的代码可能空间复杂度较高,我没在OJ上跑过,不知道能不能跑过。但是思路没有问题,就当自己练习练习。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class ConflictOfCourse {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int num = in.nextInt();
		in.nextLine();
		String[] str = new String[num];
		for(int i=0; i<num; i++){
			str[i] = in.nextLine();
		}
		String[] str1 = new String[num];
		String[] str2 = new String[num];
		for(int i=0; i<num; i++){
			String[] arr = str[i].split(" ");
			str1[i] = arr[0];
			str2[i] = arr[1];
		}
		
		List<List<String>> list = new ArrayList<List<String>>();
		
		
		for(int i=0; i<num; i++){
			if(str1[i] == null) 
				continue;
			List<String> list1 = new ArrayList<String>();
			list1.add(str1[i]);
			for(int j=i+1; j<num; j++){
				if(str1[i].equals(str1[j])){	
					str1[j] = null;
					list1.add(str2[i]);
					list1.add(str2[j]);
				}
			}
			list.add(list1);
		}
		
		List<List<String>> retlist = new ArrayList<List<String>>();
		for(int i=0; i<list.size(); i++){
			if(list.get(i).size() >= 3){
				retlist.add(list.get(i));
			}
		}
		// 无课程冲突
		if(retlist.size() == 0){
			System.out.println("YES");
			return;
		}
		
		// 按时间排序
		Collections.sort(retlist, new Comparator<List<String>>(){
			@Override
			public int compare(List<String> o1, List<String> o2) {
				return (o1.get(0)).compareTo(o2.get(0));
			}
		});
		
		for(int i =0; i<retlist.size(); i++){
			for(int j=0; j<retlist.get(i).size()-1; j++){
				System.out.print(retlist.get(i).get(j) + " ");
			}
			System.out.println(retlist.get(i).get(retlist.get(i).size()-1));
		}
	}
}



STL STL库由哪部分组成 库由哪部分组成 库由哪部分组成 库由哪部分组成 :容器 、算法迭代容器 、算法迭代容器 、算法迭代容器 、算法迭代容器 、算法迭代。 简答题: 简答题: 1. 冒泡排序和快速的优缺 冒泡排序和快速的优缺 冒泡排序和快速的优缺 冒泡排序和快速的优缺 冒泡排序和快速的优缺 冒泡排序和快速的优缺 冒泡排序和快速的优缺 点 2. 进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说进程和线共同使用的 技术(好像是这么说) 3. 指针和引用的区 指针和引用的区 指针和引用的区 指针和引用的区 别 4. 析构函数和普通成员的区 析构函数和普通成员的区 析构函数和普通成员的区 析构函数和普通成员的区 析构函数和普通成员的区 析构函数和普通成员的区 析构函数和普通成员的区 别 1. 答案 : 冒泡排序 冒泡排序 :优点稳 :优点稳 :优点稳 定;缺点: ;缺点: 慢。 快速 排序:优点 排序:优点 排序:优点 快速 ;缺点:不稳定。 ;缺点:不稳定。 ;缺点:不稳定。 ;缺点:不稳定。 2. 3. 答案 引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间引用访问 一个变量是直接,而指针间。 引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有引用是一个变量的别名,本身不单独分配自己内存空间 而指针有。 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 引用在开始的时候就绑定到了一个内存空间 (开始必须赋初值 开始必须赋初值 开始必须赋初值 开始必须赋初值 开始必须赋初值 开始必须赋初值 开始必须赋初值 ), 所以他只能是这 所以他只能是这 所以他只能是这 所以他只能是这 所以他只能是这 所以他只能是这 所以他只能是这 个内存 空间的名字 空间的名字 ,而不能改成其他的 而不能改成其他的 而不能改成其他的 而不能改成其他的 ,当然可以改变这个内存空间的 当然可以改变这个内存空间的 当然可以改变这个内存空间的 当然可以改变这个内存空间的 当然可以改变这个内存空间的 当然可以改变这个内存空间的 当然可以改变这个内存空间的 值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值