你的位置:首页 > Java教程

[Java教程]2017中兴校招编程题


1.数字打印-规律题


java代码:
  package zhongxing;  publicclass zhongxingTest8 {  publicstaticvoid main(String[] args){  int rows =6;  patternPrint(rows);  }  publicstaticvoid patternPrint(int rows){  int mid=rows-1;  for(int i=1;i<=rows;i++)  {  if(i%2==1)  {  System.out.print(i);  for(int j =0; j < mid; j++){  System.out.print(i);  }  System.out.println(i+1);  }else{  System.out.print(i+1);  for(int j =0; j < mid; j++){  System.out.print(i);  }  System.out.println(i);  }  }  }  }

2.SJF-最短作业优先

java代码:
 1   package zhongxing; 2   publicclass zhongxingTest9 { 3   publicstaticvoid main(String[] args){ 4   int[] requestTimes ={0,2,4,5}; 5   int[] durations ={7,4,1,4}; 6   float averageWaitingTime = waitingTimeSJF(requestTimes, durations); 7   System.out.println(averageWaitingTime); 8   } 9   /**10   *11   * @param requestTimes 任务提交时间12   * @param durations 任务服务时间13   * @return14   */15   publicstaticfloat waitingTimeSJF(int[] requestTimes,int[] durations){16   if(requestTimes ==null|| durations ==null)17   return-1;18   if(requestTimes.length != durations.length)19   return-1;20   int n = requestTimes.length;21   //这个地方得用clone()方法。这样才是深拷贝。直接复制是浅拷贝,只是对数组的一个引用。22   int[] durationTimes = durations.clone();23   int[] startTimes =newint[n];// 开始时间24   int[] endTime =newint[n];// 结束时间25   int[] waitingTime =newint[n];// 等待时间26   int[] cycleTime =newint[n];// 周转时间27   // 第一个执行任务的开始时间、结束时间、等待时间28   startTimes[0]= requestTimes[0];29   endTime[0]= startTimes[0]+ durations[0];30   waitingTime[0]=0;31   /** 核心代码 **/32   int lastIndex =0;// 上一次执行任务的索引33   int minIndex =0;// 最短任务的索引34   for(int i =1; i < n; i++){35   minIndex = getMinIndex(durations);// 最短任务索引为当前任务36   startTimes[minIndex]= endTime[lastIndex];// 当前任务的开始时间为上一个任务的结束时间37   endTime[minIndex]= startTimes[minIndex]+ durationTimes[minIndex];// 结束时间 = 开始时间 + 服务时间38   waitingTime[minIndex]= startTimes[minIndex]- requestTimes[minIndex];// 等待时间 = 开始时间 - 提交时间39   cycleTime[minIndex]= endTime[minIndex]- requestTimes[minIndex];// 周转时间 = 结束时间 - 提交时间40   lastIndex = minIndex;// 更新当前任务索引为下一次循环中的“上一次任务索引”41   }42   // 计算平均等待时间43   int s =0;44   float averageTime =0;45   for(int i : waitingTime){46   s += i;47   averageTime =(float) s /(float) n;48   }49   return averageTime;50   }51   // 获取最短任务索引,获取完成之后,该任务的服务时间置为最大值,从下一次寻找最短任务的过程中排除。52   publicstaticint getMinIndex(int[] arr){53   if(arr ==null)54   return-1;55   int minValue =Integer.MAX_VALUE;// 最短任务值56   int minIndex =0;57   for(int i =1; i < arr.length; i++){58   if(arr[i]< minValue){59   minValue = arr[i];60   minIndex = i;61   }62   }63   arr[minIndex]=Integer.MAX_VALUE;// 该任务的服务时间置为最大值,从下一次寻找最短任务的过程中排除。64   return minIndex;// 返回索引65   }66   }

 


上面的代码在测试的时候测试用例没有完全通过,因为少考虑了特殊情况。

这个情况就是:可能出现求出的最小值对应的开始时间大于上个任务结束时间。这样的情况就没得等待时间了。
 1   package zhongxing; 2   publicclass zhongxingTest91 { 3   publicstaticvoid main(String[] args){ 4   int[] requestTimes ={0,1,3,9}; 5   int[] durations ={2,1,7,5}; 6   float averageWaitingTime = waitingTimeSJF(requestTimes, durations); 7   System.out.println(averageWaitingTime); 8   } 9   /**10   *11   * @param requestTimes 任务提交时间12   * @param durations 任务服务时间13   * @return14   */15   publicstaticfloat waitingTimeSJF(int[] requestTimes,int[] durations){16   if(requestTimes ==null|| durations ==null){17   return-1;18   }19   if(requestTimes.length != durations.length){20   return-1;21   }22   int n = requestTimes.length;23   //这个地方得用clone()方法。这样才是深拷贝。直接复制是浅拷贝,只是对数组的一个引用。24   int[] durationTimes = durations.clone();25   int[] startTimes =newint[n];// 开始时间26   int[] endTime =newint[n];// 结束时间27   int[] waitingTime =newint[n];// 等待时间28   int[] cycleTime =newint[n];// 周转时间29   // 第一个执行任务的开始时间、结束时间、等待时间30   startTimes[0]= requestTimes[0];31   endTime[0]= startTimes[0]+ durations[0];32   waitingTime[0]=0;33   /** 核心代码 **/34   int lastIndex =0;// 上一次执行任务的索引35   int minIndex =0;// 最短任务的索引36   for(int i =1; i < n; i++){37   //minIndex = getMinIndex(durations); // 作曲最短任务索引为当前任务38   //服务时间,提交时间,结束时间39   minIndex = getMinIndex(durations,requestTimes,endTime[lastIndex]);40   startTimes[minIndex]= endTime[lastIndex];// 当前任务的开始时间为上一个任务的结束时间41   endTime[minIndex]= startTimes[minIndex]+ durationTimes[minIndex];// 结束时间 = 开始时间 + 服务时间42   waitingTime[minIndex]= startTimes[minIndex]- requestTimes[minIndex];// 等待时间 = 开始时间 - 提交时间43   cycleTime[minIndex]= endTime[minIndex]- requestTimes[minIndex];// 周转时间 = 结束时间 - 提交时间44   lastIndex = minIndex;// 更新当前任务索引为下一次循环中的“上一次任务索引”45   }46   // 计算平均等待时间47   int s =0;48   float averageTime =0;49   for(int i : waitingTime){50   s += i;51   averageTime =(float) s /(float) n;52   }53   return averageTime;54   }55   // 获取最短任务索引,获取完成之后,该任务的服务时间置为最大值,从下一次寻找最短任务的过程中排除。56   //这个地方要考虑特殊情况,可能出现求出的最小值对应的开始时间大于上个任务结束时间。考试的时候没有考虑到,所以测试用例不能完全通过57   publicstaticint getMinIndex(int[] durations,int[] requestTimes,int endtime){58   int minValue =Integer.MAX_VALUE;59   int minIndex =0;60   for(int i =1; i < durations.length; i++){61   //只有提交时间是小于上一个任务的结束时间,这个任务才需要等待,才有等待时间。否则是不需要等待的。也就是我们下面的第二个判断条件62   if(durations[i]< minValue && requestTimes[i]<=endtime){63   minValue = durations[i];64   minIndex = i;65   }66   }67   //置成最大,避免下次重复选中了这个任务68   durations[minIndex]=Integer.MAX_VALUE;69   return minIndex;70   }71   }

 

 

3.矩阵反转

某个图像通过一个整数组成的m*n矩阵表示,其中每个整数表示一个像素值。写出一种方法,根据flag变量的值将图像向右或者向左旋转90°。如果flag值为0,则向左旋转,如果flag为1,则向右旋转。

函数rotatePictureMethod的输入分别由矩阵matrix、矩阵的维度m和n以及flag的值组成。

函数应返回一个指向二维矩阵指针,该矩阵是按照flag值旋转后的结果矩阵而动态分配的。

示例:

如果标志flag=1且m=3,n=3,输入矩阵

1   2   3

4   5   6

7   8   9

输出矩阵

7   4   1

8   5   2

9   6   3

java代码:
 1   publicclass zhongxingTest7 { 2   /** 3   * 中兴的题是不需要sc得到输入的,都是封装好的 4   * 本题实质上就是对数组的旋转 5   * @param args 6   */ 7   publicstaticvoid main(String[] args){ 8   // TODO Auto-generated method stub 9   /*Scanner sc = new Scanner(System.in);10   while(sc.hasNextLine()){11   String s = sc.nextLine();12   }*/13   int[][]matrix ={14   {1,2,3},15   {4,5,6},16   {7,8,9}};17   int m =3;18   int n=3;19   int flag =1;20   int[][]mat = rotatePictureMethod(matrix,m,n,flag);21   //对数组的循环遍历输出22   for(int i=0;i<mat.length;i++){23   for(int j =0;j<mat[0].length-1;j++){24   System.out.print(mat[i][j]+" ");25   }26   System.out.println(mat[i][mat[0].length-1]);27   }28   }29   //关键是下面的赋值规律30   publicstaticint[][]rotatePictureMethod(int[][]matrix,int m,int n,int flag){31   //flag值为0,则向左旋转,如果flag为1,则向右旋转32   int[][]matrix10 =newint[n][m];33   if(flag ==1){//右转34   for(int i=0;i<m;++i){35   for(int j =0;j<n;j++){36   //这部分是整个代码的核心37   matrix10[n-1-j][m-1-i]= matrix[i][n-1-j];38   }39   }40   }else{//左转41   for(int i=0;i<m;++i){42   for(int j =0;j<n;j++){43   matrix10[n-1-j][m-1-i]= matrix[m-1-i][j];44   }45   }46   }47   return matrix10;48   }49   }50 51 

 


 

以上内容为原创,转载请注明地址:http://www.cnblogs.com/coderli/p/f93ad2f8b0dd72aa5a997c766a6a95ac.html

来自为知笔记(Wiz)



附件列表