问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用java求一年内,连续3月都最后3名的同学姓名,求最佳算法

发布网友 发布时间:2022-05-09 13:40

我来回答

4个回答

热心网友 时间:2024-01-31 05:57

确实有些复杂,这也难怪我们都用数据库,用java实现查询,统计等就比较复杂了。整了一半天终于弄出来了。上代码

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.Random;

public class LowScore {

Student[] mStuArray;

Random ran;

int[][] lowestStudent;

public LowScore(){

mStuArray=new Student[20];

//测试用,随机产生分数

ran=new Random();

for(int i=0;i<mStuArray.length;i++){

//初始化学生信息

mStuArray[i]=new Student("学生"+(i+1));

//当然楼主可以自己在这里设置学生的实际分数

//为了方便我就随机设置一些分数

setRandomScore(mStuArray[i]);//设置每个学生的分数

}

//可以看一下第一个学生的分数,当然你也可以查看所有学生的成绩

mStuArray[0].displayScore();

//用于存放每一个月的成绩最低的三名学生

lowestStudent=new int[12][3];

for(int i=0;i<12;i++){

//初始化每一月分数最低的三个学生的数组坐标

int[] temascIndex=getLowScoreAsc(i);

for(int j=3;j<mStuArray.length;j++){

float temScore=mStuArray[j].getScoreByMonth(i);

if(temScore>=mStuArray[temascIndex[2]].getScoreByMonth(i)){

continue;

}

freshMinScore(temascIndex,j,i);

}

//temascIndex,每个月分数最低的三位学生

lowestStudent[i]=temascIndex;

}

//用Hashtable表存放续三个月都是后三名的学生名单

Hashtable<Integer,Integer> hashStu=new Hashtable<Integer,Integer>();

//如果连续三个月都是后三名的学生,则输出姓名

for(int i=0;i<lowestStudent.length-2;i++){

//查看后三名的学生是否连续三次都是最后3名

for(int j=0;j<lowestStudent[i].length;j++){

if(hashStu.containsKey(lowestStudent[i][j])){

//如果hash中已经有他的名单,就不要重复写进去了

continue;

}

if(isThreeLow(i,lowestStudent[i][j])){

//如果上榜就放进哈希名单表

hashStu.put(lowestStudent[i][j], i);//value表示滴(i+1)个月开始

}

}

}

//现在hashStu中的名单就是至少连续出现3个月,成绩在后三名的学生名单

Enumeration<Integer> en = hashStu.keys();

//输出学生名单

System.out.println("\n\n一下学生连续3个月上榜倒数第三名");

while(en.hasMoreElements()){

Object key_num = en.nextElement();

String studentName=mStuArray[(Integer)key_num].getName();

int startMonth=hashStu.get(key_num);

System.out.println("学生姓名: " + studentName);

System.out.println("第"+(startMonth+1)+"月开始,以及后面几个月的成绩:");

int studentId=(Integer)key_num;

for(int i=startMonth;i<12;i++){

if(isHaveStudent(i,studentId)){

System.out.println("\n第"+(i+1)+"月:"+mStuArray[studentId].getScoreByMonth(i));

System.out.println("这个月所有学生的成绩:");

showScoreByMonth(i);

System.out.println("第"+(i+1)+"月最后三名学生以及分数:");

showMonthLowScore(i);

}else{

break;

}

}

System.out.println("\n*** *** ** *** *** *** *** *** ** ***\n");

}

}

public static void main(String[] args){

new LowScore();

}

protected void showMonthLowScore(int pMonth){

for(int i=0;i<lowestStudent[pMonth].length;i++){

Student tem=mStuArray[lowestStudent[pMonth][i]];

System.out.print(tem.getName()+":"+tem.getScoreByMonth(pMonth)+"   ");

}

System.out.println();

}

protected boolean isHaveStudent(int pMonth,int pStuId){

for(int j=0;j<lowestStudent[pMonth].length;j++){

if(pStuId==lowestStudent[pMonth][j]){

return true;

}

}

return false;

}

private boolean isThreeLow(int pMonth,int pStuId){

//连续出现在后三名的次数

int monthCount=1;

for(int month=pMonth+1;month<pMonth+3&&month<12;month++){

boolean contain=false;

for(int j=0;j<lowestStudent[month].length;j++){

if(pStuId==lowestStudent[month][j]){

contain=true;

break;

}

}

if(contain){

monthCount++;

}else{

//如果后面了两个月没有连续出现,则不能选择

break;

}

}

if(monthCount==3){//连续出现3次,上榜啦

return true;

}

//否则就没上榜哦

return false;

}

protected void showScoreByMonth(int pMonth){

for(int i=0;i<mStuArray.length;i++){

if(i%5==4){

System.out.println(mStuArray[i].getScoreByMonth(pMonth));

continue;

}

System.out.print(mStuArray[i].getScoreByMonth(pMonth)+", ");

}

}

private void freshMinScore(int[] temascIndex,int pNew,int pMonth){

int tem=0;

boolean start=false;

for(int i=0;i<temascIndex.length;i++){

if(start){

tem=temascIndex[i];

temascIndex[i]=tem;

continue;

}

if(mStuArray[temascIndex[i]].getScoreByMonth(pMonth)>=mStuArray[pNew].getScoreByMonth(pMonth)){

tem=temascIndex[i];

temascIndex[i]=pNew;

start=true;

}

}

}

protected int[] getLowScoreAsc(int pMonth){

int[] result={0,1,2};

//做排序,是的学生result[0]的分数小于result[1]小于result[2]

for(int i=0;i<result.length;i++){//传说中的冒泡排序

float temScore=mStuArray[result[i]].getScoreByMonth(pMonth);

int index=i;

for(int j=i+1;j<result.length;j++){

if(mStuArray[result[j]].getScoreByMonth(pMonth)<temScore){

index=j;

temScore=mStuArray[result[j]].getScoreByMonth(pMonth);

}

}

//说明mStuArray的下表为result[i]的学生当月成绩不是他后面中最小的

if(index!=i){//交换位置

int tem=result[index];

result[index]=result[i];

result[i]=tem;

}

}

//排序后保证mStuArray[result[i]].getScoreByMonth(pMonth)

/**

 * mStuArray[result[0]].getScoreByMonth(pMonth)<=mStuArray[result[1]].getScoreByMonth(pMonth)

 * mStuArray[result[1]].getScoreByMonth(pMonth)<=mStuArray[result[2]].getScoreByMonth(pMonth)

 */

return result;

}

public void orderTest(){

int[] testArray={5,8,3,5,9};

for(int i=0;i<testArray.length;i++){//传说中的冒泡排序

int temScore=testArray[i];

int index=i;

for(int j=i+1;j<testArray.length;j++){

if(testArray[j]<temScore){

index=j;

temScore=testArray[j];

}

}

//说明mStuArray的下表为testArray[i]的学生当月成绩不是他后面中最小的

if(index!=i){//交换位置

int tem=testArray[index];

testArray[index]=testArray[i];

testArray[i]=tem;

}

}

for(int i=0;i<testArray.length;i++){//ok

System.out.println(testArray[i]);

}

}

protected void setRandomScore(Student pStu){

for(int i=0;i<pStu.getScore().length;i++){

pStu.setScoreByMonth(i, 20+ran.nextInt(80));

}

}

}

class Student{

private float[] score;

private String name;

public Student(){

score=new float[12];

}

public Student(String sName){

score=new float[12];

this.name=sName;

}

public float[] getScore(){

return score;

}

public float getScoreByMonth(int pMonth){

if(pMonth<0||pMonth>=score.length){

return -1;

}

return score[pMonth];

}

public void setScoreByMonth(int pMonth,float pScore){

if(pMonth<0||pMonth>=score.length){

return;

}

score[pMonth]=pScore;

}

public void displayScore(){

System.out.println("******  "+name+"的成绩  *******");

for(int i=0;i<score.length;i++){

System.out.print((i+1)+"月:"+score[i]+"    ");

if(i%3==2){

System.out.println();

}

}

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

    当然啦,可以看到,我把楼主的student类做了一点改变,把12个月的成绩放在一个数组score中,而且还给学生加了一个名字属性。

  可以看看我运行的结果截图,希望楼主满意,望采纳O(∩_∩)O~!

热心网友 时间:2024-01-31 05:57

因为是要连续的三个月先将12个月考试最后三名超过三次的学生存入一个集合中 然后再循环判断这些学生的成绩是否是连续三个月的

热心网友 时间:2024-01-31 05:58

用Map就方便存储每个月每个学生的名字和对应的成绩了。
再来个排序,把12个月的Map中的数据进行排序。
好了,关键时刻:
设成绩倒数后3名同学=a,b,c
设A=成绩倒数后3名同学A(a,b,c)
设A# = #月份的成绩倒数后3名同学
设N=下一个处理对象任务集合N(a(count),b(count),c(count)),count描述a、b、c的连续的月数
设R=处理结果集R(stu)
//-------------------------------------
从1月开始,拿出1月份的A去和2月份的A进行比较,如果A1(a)==A2(a)将A1(a)放入N(a),如果A1(b)==A2(b)将A1(b)放入N(b),如果A1(c)==A2(c)将A1(c)放入N(c);
进入下一次比较:3月份,如果N中有任务,先处理N的任务,如果N没有任务,则将3月份的A放入N中!处理N中的任务方法是:从N调出任务,对A3进行比较(规则是N(a)只能和A#(a)进行比较!),如果找到结果,将结果放入R中,并将N中的对应的任务清除!
以此类推,一直到12月。
最后将处理结果R输出。

思路算是比价复杂吧,没办法,用自己的描述方法,不知道能不能看懂。
让我来写这个代码也要几个小时。

热心网友 时间:2024-01-31 05:58

额, 有难度。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
伊犁师范学院办学规模 伊犁师范大学研究生院建立时间 伊犁师范大学小学教育研究生专业好考不 ...计算除法算式什么除以四十七时错把除数四十七写成了七十四,结果得到... 2024伊犁师范大学研究生学费多少钱一年 被除数47错写成74这样商比原来多了3个而余数恰好相同除数余数各是多少... 在计算除法时把除数47写成74,得到的商是12,余数是29,正确的结果应该�... 用美金换日元好还是用人民币换日元好? 去日本旅游··兑换和实用日元最实惠的方法·· 核桃和桂圆治失眠吗 有首英文歌叫Low。 是一男一女一起唱的。 单片机AD转换后在数码管显示的问题? 编写函数,求成绩数组中的平均成绩和低于平均成绩的人数 求用c++程序编写 不需要太复杂的 求有关JORDAN SHOW&#39;M LOW的相关信息 grow,show,low,crowd 湖南省2019年普通高等学校对口招生考试计算机应用类专业综合知识试题及参*(word手工录入版) 计算机应用知识10道选择10道判断,求正确答案 未成年人可以邻取腾讯新闻红包并提取到微信钱包中吗? QQ的腾讯新闻的那个运动红包怎么取的啊,不知道怎么提现啊,不知道什么是开通什么鬼的 福特领界4S店销售:降至9W左右了,降不动了 重实用偏稳重 简析江铃福特领界 淘宝上传新宝贝时显示宝贝图片已参加实拍保护怎么办 淘宝实拍保护,是不是要先申请实拍保护在上图??? 深圳云天下做网站在同行中口碑怎样,有人了解吗? 淘宝的图片已实拍保护我该怎样处理才能上传呢 云天下数字传媒工资怎么样 淘宝平面拍摄能申请实拍保护吗 淘宝申请图片保护显示身份不符签约失败怎么为淘宝申请实拍保护显示身份不符签约失败怎么办_百度问一问 淘宝不露脸图片可以实拍保护吗 淘宝申请图片保护显示身份不符签约失败怎么为淘宝申请实拍保护显示身份不符签约失败怎么办_百度问一问 有关成长的初一作文600左右,记叙文,不要太扯 急求这是什么歌啊! 关于青春或者成长为话题的作文,初一的,600字左右 oppo所有在售机型型号 重复和渐变混合起来的构成 有没有三张园林平面图分别是由重复、近似、渐变构成的? 在学平面构成时,老师会要求做一些点,线,面,或渐变,重复的构成作品。训练的目的是什么 第一次买车,提车时该注意些什么? windows显示“无法打开添加打印机 操作无法完成(错误0x00000c1)”是什么意思? 艾科.乐易捷2如何册除历史忆值的? 艾科乐易捷血糖仪结果判定 易捷血糖仪怎么样 有没有一个血糖仪能无限存储血糖数据啊 怡成血糖仪和易捷同时测为什么误差在3个 南特血糖仪的操作步骤是怎样的? 艾科血糖仪如何清除记忆值 乐易捷血糖仪e_4是什么故障 我想问问艾科精益血糖仪怎么样?哪位知道血糖仪的优点的呢? 为什么我用&quot;乐易捷&quot;血糖仪,测到19.9而身体没有不适的感觉 发现最近血糖偏高,医生建议家备血糖仪,血糖仪怎么用吗?