- 西安交通大学915考研--编程题Java代码踩坑(2017年真题)
- 2017.2--折半查找的实现(递归)
- 2017.3--顺序栈的实现
- 2017.4--作业调度问题
思路:
- 初始low指针在0,high指针在最后
- mid=(low+high)/2,判断mid处的值大小
- 若大于目标值,说明应该在左边找,让high=mid-1;
- 若小于目标值,说明应该在右边找,让low=mid+1;
- 递归的出口,对于每层,mid处的值等于目标值,返回mid下标;递归的最后一层不满足low<=high,说明查找失败,目标值不存在
代码实现:
package com.xjtu; public class A2016_03 { public static void main(String[] args) { int[] arr = {1, 2, 3, 5, 6, 8, 9, 12, 45, 78, 99, 123}; System.out.println(Binsearch(arr, 0, arr.length - 1, 6)); } public static int Binsearch(int[] arr, int low, int high, int k) { if (low <= high) {//low 要小于等于 high int mid = (low + high) / 2; if (arr[mid] == k) { return mid;//查找成功的递归出口 } else if (arr[mid] < k) {//查找序列右一半 return Binsearch(arr, mid + 1, high, k); } else {//查找序列左一半 return Binsearch(arr, low, mid, k); } } else {//low>high,查找失败 return -1; } } }
输入输出:
42017.3–顺序栈的实现
思路:
共享栈的实现是基本知识,详细也可以见下边代码注释。
代码实现:
package com.xjtu; public class A2017_03 { public static int[] arr = new int[100];//申请长度为100的数组 public static int top1, top2;//设置两个指针 public static void S1_push(int num) {//栈1的压栈 *** 作 //首先判断共享栈是不是已经满了 if (top2 - top1 == 1) { System.out.println("栈满!S1 无法压栈"); } else { arr[++top1] = num;//先让指针加一,再把数据放进栈中 } } public static int S1_pop() {//栈1的出栈 *** 作 if (top1 == -1) { System.out.println("栈空!S1 无法d栈"); return -1; } else { return arr[top1--];//先返回栈顶元素,后将指针减一 } } public static void S2_push(int num) {//栈2的压栈 *** 作 if (top2 - top1 == 1) { System.out.println("栈满!S2 无法压栈"); } else { arr[--top2] = num;//先让指针减一,再把数据放进栈中 } } public static int S2_pop() {//栈2的出栈 *** 作 if (top2 == arr.length) { System.out.println("栈空!S2 无法d栈"); return -1; } else { return arr[top2++];//先返回栈顶元素,后将指针加一 } } }2017.4–作业调度问题
问题描述:
n个作业,m个机器,机器每次只能执行一个文件,现在采取小作业优先(同等规模采取先来先服务)原则,问如何安排每一台机器的作业分配。
思路:
考察的实质就是一个排序过程,要求排序是稳定的
- 接受作业数量n,机器数量m,接受每一个作业的工作时长(申请一个数组 no[ ] 存储作业的编号,这里用数组下标+1代表作业名称)
- 对工作进行稳定排序,同时对no [ ] 进行同步 *** 作,以便记录作业的编号
- 对于机器 i ,将执行编号为 i,i+m,i+2m …(解释,这里已经按照工作时长从小到大的顺序排好了,第一台机器第一个工作是作业1,第二个是1+m,第三个是i+2m,之所以是i+2m是因为前面i+2m-1个作业已经完成或者正在其他机器上晚上,因为第一台机器总是最先完成本轮工作)
代码实现:
package com.xjtu; import java.util.Scanner; public class A2017_04 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入作业数 n:"); int workNum = in.nextInt(); System.out.println("请输入机器数 m:"); int mechanNum = in.nextInt(); int workTime[] = new int[workNum]; int no[] = new int[workNum]; int temp; System.out.println("请依次输入每个工作所需要的工作时间:"); for (int i = 0; i < workNum; i++) { workTime[i] = in.nextInt(); no[i] = i + 1; } //冒泡排序,对作业按照时间递增排序 for (int i = workTime.length - 1; i >= 1; i--) { boolean flag = true; for (int j = 1; j <= i; j++) { if (workTime[j - 1] > workTime[j]) { //交换 workTime 数组 temp = workTime[j - 1]; workTime[j - 1] = workTime[j]; workTime[j] = temp; //交换对应的 no 数组 temp = no[j - 1]; no[j - 1] = no[j]; no[j] = temp; flag = false; } } if (flag) { break; } } System.out.print("机器 1: "); for (int i = 0; i < workTime.length; i = i + 3) { System.out.print("作业" + no[i] + " "); } System.out.println(); System.out.print("机器 2: "); for (int i = 1; i < workTime.length; i = i + 3) { System.out.print("作业" + no[i] + " "); } System.out.println(); System.out.print("机器 3: "); for (int i = 2; i < workTime.length; i = i + 3) { System.out.print("作业" + no[i] + " "); } } }
输入输出:
请输入作业数 n: 10 请输入机器数 m: 3 请依次输入每个工作所需要的工作时间: 3 5 1 9 4 2 7 7 1 8 机器 1: 作业3 作业1 作业7 作业4 机器 2: 作业9 作业5 作业8 机器 3: 作业6 作业2 作业10
2017年题目结束,这里是传送门:
西安交通大学915考研–编程题Java代码踩坑(2015年真题)
西安交通大学915考研–编程题Java代码踩坑(2016年真题)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)