操作系统中的几种调度算法(JAVA版)
import java.text.DecimalFormat; import java.util.Arrays; import java.util.Scanner; /* * 作者:Chensx1020 * 时间:2016-12-11 * 功能:CPU调度算法 * 1)先到先服务调度算法(FCFS) * 2)最短作业优先调度算法,非抢占式(SJF) * 3)优先级调度算法(PSA) * 4)轮转法调度算法(RR) * 5)最高响应比调度算法(HRR) * 6)最短作业优先调度算法,抢占式(SJF) */ public class CPU { //排序方法 public static String whichComp="FCFS"; //时间片 public static int timeSlice=4; //进程类............................................................... public static class MyProcess implements Comparable<MyProcess> { private String name; //进程名字 private int arrive; //到达时间 private int work; //区间时间(服务时间) private int rWork; //还需时间 private int priority; //优先级 private int begin; //开始时间 private double hrr; //响应比 private boolean flag; //标记该进程是否执行 public MyProcess(String name){ this.name = name; this.flag = false; } public void setArrive(int arrive){ this.arrive = arrive; } public void setWork(int work){ this.work = work; } public void setRwork(int rWork){ this.rWork = rWork; } public void setPriority(int priority){ this.priority = priority; } public void setBegin(int begin){ this.begin = begin; } public void setHrr(){ this.hrr = (this.begin-this.arrive)*1.0/this.work + 1; } public void setHrr(double hrr){ this.hrr = hrr; } public void setFlag(){ this.flag = true; } public String getName(){ return this.name; } public int getArrive(){ return this.arrive; } public int getWork(){ return this.work; } public int getRwork(){ return this.rWork; } public int getPriority(){ return this.priority; } public int getBegin(){ return this.begin; } public double getHrr(){ return this.hrr; } public boolean getFlag(){ return this.flag; } @Override public int compareTo(MyProcess o) { if(whichComp.equals("FCFS")){ if(this.arrive>o.arrive) return 1; else if(this.arrive<o.arrive) return -1; else return this.work-o.work; } else if(whichComp.equals("SJF")){ if(this.work>o.work) return 1; else if(this.work<o.work) return -1; else return this.arrive-o.arrive; } else if(whichComp.equals("SJFS")){ if(this.rWork>o.rWork) return 1; else if(this.rWork<o.rWork) return -1; else return this.arrive-o.arrive; } else if(whichComp.equals("PSA")){ if(this.priority>o.priority) return 1; else if(this.priority<o.priority) return -1; else return this.arrive-o.arrive; } else if(whichComp.equals("HRR")){ if(this.begin>o.begin) return 1; else if(this.begin<o.begin) return -1; else{ if(this.hrr < o.hrr) return 1; else if(this.hrr > o.hrr) return -1; else{ return this.arrive-o.arrive; // if(this.arrive>o.arrive) // return 1; // else if(this.arrive<o.arrive) // return -1; // else // return this.work-o.work; } } } else{ return 0; } } } //FCFS类............................................................... public static class FCFS{ private int count; private String temp; public FCFS(MyProcess test[]){ Arrays.sort(test); count = test[0].getArrive(); temp = ""; int length = test.length; int wait = 0; //总等待时间 int cycle = 0; //总周转时间 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("先到先服务调度算法的结果为:"); System.out.println("进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t等待时间\t" + "周转时间\t带权周转时间\t"); for(int i=0; i<length-1; ++i){ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +count+"\t" +(count+test[i].getWork())+"\t" +(count-test[i].getArrive())+"\t" +(count-test[i].getArrive()+test[i].getWork())+"\t" +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t" ); wait += count-test[i].getArrive(); cycle += count-test[i].getArrive()+test[i].getWork(); count += test[i].getWork(); if(count < test[i+1].getArrive()) count = test[i+1].getArrive(); temp += test[i].getName()+" "; } System.out.println(test[length-1].getName()+"\t" +test[length-1].getArrive()+"\t" +test[length-1].getWork()+"\t" +count+"\t" +(count+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t" ); wait += count-test[length-1].getArrive(); cycle += count-test[length-1].getArrive()+test[length-1].getWork(); temp += test[test.length-1].getName()+" "; System.out.println("\n所以最后先到先服务调度算法执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //SJF类非抢占式............................................................... public static class SJF{ private int count; private String temp; public SJF(MyProcess test[]){ Arrays.sort(test); count = test[0].getArrive(); temp = ""; int length = test.length; int wait = 0; //总等待时间 int cycle = 0; //总周转时间 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("最短作业优先调度算法非抢占式的结果为:"); System.out.println("进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t等待时间\t" + "周转时间\t带权周转时间\t"); for(int i=0; i<length-1; ++i){ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +count+"\t" +(count+test[i].getWork())+"\t" +(count-test[i].getArrive())+"\t" +(count-test[i].getArrive()+test[i].getWork())+"\t" +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t" ); wait += count-test[i].getArrive(); cycle += count-test[i].getArrive()+test[i].getWork(); count += test[i].getWork(); if(count < test[i+1].getArrive()) count = test[i+1].getArrive(); temp += test[i].getName()+" "; } System.out.println(test[length-1].getName()+"\t" +test[length-1].getArrive()+"\t" +test[length-1].getWork()+"\t" +count+"\t" +(count+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t" ); wait += count-test[length-1].getArrive(); cycle += count-test[length-1].getArrive()+test[length-1].getWork(); temp += test[test.length-1].getName()+" "; System.out.println("\n所以最后最短作业优先调度算法非抢占式执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //SJF类抢占式............................................................... public static class SJFS{ private int count; private String temp; //执行的顺序 private int flag = 0; //计数,用于判断是否所有进程执行完毕 public SJFS(MyProcess test[]){ int wait = 0; //总等待时间 int cycle = 0; //总周转时间 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("最短作业优先调度算法抢占式的结果为:"); System.out.println("进程名字\t到达时间\t区间时长\t开始时间\t结束时间\t剩余服务时间\t等待时间\t" + "周转时间\t带权周转时间\t"); int length = test.length; //长度 whichComp="FCFS"; Arrays.sort(test); //按照进程的到达时间排序 count = test[0].getArrive(); //count的值为程序最先到达的进程的到达时间 whichComp="SJFS"; Arrays.sort(test); //所有进程按照剩余服务时间的长短排序 String lastName = ""; //上一次执行的进程的名字 for(int i=0; i<length; ++i){ if(test[i].getArrive()<=count){ lastName = test[i].getName(); System.out.print(test[i].getName() + "\t" + test[i].getArrive() + "\t" + test[i].getWork() + "\t" + count + "\t"); temp = test[i].getName()+" "; break; } } boolean done = false; while(true){ done = false; ++count; for(int j=0; j<length; ++j){ if(test[j].getName().equals(lastName)){ test[j].setRwork(test[j].getRwork()-1); //剩余时间-1 if(test[j].getRwork() == 0){ ++flag; test[j].setRwork(999999999); System.out.println(count + "\t" + "0\t\t" + (count-test[j].getWork()-test[j].getArrive()) + "\t" //等待时间 + (count-test[j].getArrive()) + "\t" //周转时间 + ((count-test[j].getArrive())*1.0/test[j].getWork()) + "\t" //带权周转 ); wait += count-test[j].getWork()-test[j].getArrive(); cycle += count-test[j].getArrive(); done = true; } break; } } if(flag==length){ break; } Arrays.sort(test); //所有进程按照剩余服务时间的长短重新排序 for(int i=0; i<length; ++i){ if(test[i].getArrive()<=count){ if(lastName.equals(test[i].getName())){ // System.out.println(test[i].getName()); } else{ for(int j=0; j<length; ++j){ if(test[j].getName().equals(lastName)){ if(!done){ System.out.println(count + "\t" + test[j].getRwork()+ "\t\t" + "未执行完\t" + "未执行完\t" + "未执行完\t"); } } } lastName = test[i].getName(); System.out.print(test[i].getName() + "\t" + test[i].getArrive() + "\t" + test[i].getWork() + "\t" + count + "\t"); temp += test[i].getName()+" "; } break; } } } System.out.println("\n所以最后最短作业优先调度算法抢占式执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //PSA类............................................................... public static class PSA{ private int count; private String temp; public PSA(MyProcess test[]){ Arrays.sort(test); count = test[0].getArrive(); temp = ""; int length = test.length; int wait = 0; //总等待时间 int cycle = 0; //总周转时间 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("优先级调度算法的结果为:"); System.out.println("进程名字\t到达时间\t服务时间\t优先级\t开始时间\t结束时间\t等待时间\t" + "周转时间\t带权周转时间\t"); for(int i=0; i<length-1; ++i){ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +test[i].getPriority()+"\t" +count+"\t" +(count+test[i].getWork())+"\t" +(count-test[i].getArrive())+"\t" +(count-test[i].getArrive()+test[i].getWork())+"\t" +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t" ); wait += count-test[i].getArrive(); cycle += count-test[i].getArrive()+test[i].getWork(); count += test[i].getWork(); if(count < test[i+1].getArrive()) count = test[i+1].getArrive(); temp += test[i].getName()+" "; } System.out.println(test[length-1].getName()+"\t" +test[length-1].getArrive()+"\t" +test[length-1].getWork()+"\t" +test[length-1].getPriority()+"\t" +count+"\t" +(count+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t" +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t" ); wait += count-test[length-1].getArrive(); cycle += count-test[length-1].getArrive()+test[length-1].getWork(); temp += test[test.length-1].getName()+" "; System.out.println("\n所以最后优先级调度算法执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //HRR类............................................................... public static class HRR{ private int count; private String temp; public HRR(MyProcess test[], MyProcess tests[]){ DecimalFormat df = new DecimalFormat("#.###"); //小数保留三位小数 Arrays.sort(tests); count = tests[0].getBegin(); temp = ""; int length = test.length; int wait = 0; //总等待时间 int cycle = 0; //总周转时间 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("最高响应比调度算法的结果为:"); for(int tur = 1; tur<=length; ++tur){ System.out.println("\n正在执行第"+tur+"个进程:"+tests[0].getName()); System.out.println("进程名字\t到达时间\t服务时间\t响应比\t开始时间\t结束时间\t等待时间\t" + "周转时间\t带权周转时间\t"); for(int i=0; i<length; ++i) { if(test[i].getFlag()){ //已执行 System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +"已执行完\t" +test[i].getBegin()+"\t" +(test[i].getBegin()+test[i].getWork())+"\t" +(test[i].getBegin()-test[i].getArrive())+"\t" +(test[i].getBegin()-test[i].getArrive()+test[i].getWork())+"\t" +df.format((test[i].getBegin()-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork())+"\t" ); continue; } else if(test[i].getArrive()>count){ //未到达 System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +"未到达\t" +"未到达\t" +"未到达\t" +"未到达\t" +"未到达\t" +"未到达\t" ); continue; } else{ //执行该进程 if(test[i].getName().equals(tests[0].getName())){ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +df.format(test[i].getHrr())+"\t" +test[i].getBegin()+"\t" +(test[i].getBegin()+test[i].getWork())+"\t" +(test[i].getBegin()-test[i].getArrive())+"\t" +(test[i].getBegin()-test[i].getArrive()+test[i].getWork())+"\t" +df.format((test[i].getBegin()-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork())+"\t" ); wait += test[i].getBegin()-test[i].getArrive(); cycle += test[i].getBegin()-test[i].getArrive()+test[i].getWork(); test[i].setFlag(); tests[0].setFlag(); } else{ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +df.format(test[i].getHrr())+"\t" +"未开始\t" +"未开始\t" +"未开始\t" +"未开始\t" +"未开始\t" ); } } } int count1=count+tests[0].getWork(); for(int j=tests.length-1; j>=1; --j){ if(tests[j].getFlag()){ ; } else{ if(count1 >= tests[j].getArrive()){ //进程已到 tests[j].setBegin(count1); int x; for(x=0; x<length; ++x){ if(tests[j].getName().equals(test[x].getName())) break; } test[x].setBegin(count1); tests[j].setHrr(); test[x].setHrr(); count = count1; } else{ count = tests[j].getBegin(); } } } temp += tests[0].getName()+" "; //改变执行过的进程数据,使再次排序时排在未执行数据的后面 tests[0].setArrive(999999999); tests[0].setBegin(999999999); tests[0].setHrr(-1.0); Arrays.sort(tests); //重新排序 } System.out.println("\n所以最后最高响应比调度算法执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //RR类............................................................... public static class RR{ private int count; private String temp; public RR(MyProcess test[]){ count = 0; temp = ""; int length = test.length; int wait = 0; //总等待时间 int cycle = 0; //总周转时间 int tur = 1; //第几趟 System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.println("轮转法调度算法的结果为:"); System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t剩余所需服务时间\t" + "等待时间\t周转时间\t带权周转时间\t"); int tempCount=0; //记录是否还有进程未执行完 int i=0; while(true){ if(test[i].getRwork()>timeSlice){ test[i].setRwork(test[i].getRwork()-timeSlice); System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +count+"\t" +(count+timeSlice)+"\t" +test[i].getRwork()+"\t\t" +"未执行完\t" +"未执行完\t" +"未执行完\t" ); count += timeSlice; temp += test[i].getName()+" "; ++i; if(i==length){ i=0; ++tur; System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t" + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t"); } } else if(test[i].getRwork()>0){ System.out.println(test[i].getName()+"\t" +test[i].getArrive()+"\t" +test[i].getWork()+"\t" +count+"\t" +(count+test[i].getRwork())+"\t" +"0\t\t" +(count+test[i].getRwork()-test[i].getWork()-test[i].getArrive())+"\t" +(count+test[i].getRwork()-test[i].getArrive())+"\t" +(count+test[i].getRwork()-test[i].getArrive())*1.0/test[i].getWork()+"\t" ); wait += count+test[i].getRwork()-test[i].getWork()-test[i].getArrive(); cycle += count+test[i].getRwork()-test[i].getArrive(); count += test[i].getRwork(); temp += test[i].getName()+" "; test[i].setRwork(0); ++i; if(i==length){ i=0; ++tur; System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t" + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t"); } ++tempCount; if(tempCount == length) break; } else{ ++i; if(i==length){ i=0; ++tur; System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t" + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t"); } continue; } } System.out.println("\n所以最后轮转法调度算法执行的顺序为:" + temp); System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length); } } //主函数................................................................ public static void main(String[] args) { Scanner input = new Scanner(System.in); while(true){ int n; //进程数 while(true){ try{ System.out.print("输入进程个数:"); n = input.nextInt(); break; } catch(Exception e){ System.out.println("输入不合法,请重新输入!"); input.nextLine(); } } MyProcess test[] = new MyProcess[n]; //进程数组 MyProcess tests[] = new MyProcess[n]; //临时进程数组(HRR用) System.out.println("您想执行何种操作:"); System.out.println("1.FCFS(先到先服务调度算法)"); System.out.println("2.SJF(最短作业优先调度算法,非抢占式)"); System.out.println("3.PSA(优先级调度算法)"); System.out.println("4.RR(轮转法调度算法)"); System.out.println("5.HRR(最高响应比调度算法)"); System.out.println("6.SJF(最短作业优先调度算法,抢占式)"); System.out.println("7.退出"); int which; try{ which = input.nextInt(); } catch(Exception e){ System.out.println("输入不合法,请重新输入!"); input.nextLine(); continue; } //FCFS if(which == 1){ for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:"); test[i].setArrive(input.nextInt()); test[i].setWork(input.nextInt()); } whichComp = "FCFS"; new FCFS(test); } //SJF,非抢占式 else if(which == 2){ for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:"); test[i].setArrive(input.nextInt()); test[i].setWork(input.nextInt()); } whichComp = "SJF"; new SJF(test); } //PSA else if(which == 3){ for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的到达时间和服务时间和优先级:"); test[i].setArrive(input.nextInt()); test[i].setWork(input.nextInt()); test[i].setPriority(input.nextInt()); } whichComp = "PSA"; new PSA(test); } //RR else if(which == 4){ System.out.print("请输入时间片的大小:"); timeSlice = input.nextInt(); for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的服务时间(剩余时间):"); test[i].setWork(input.nextInt()); test[i].setRwork(test[i].getWork()); } whichComp = "RR"; new RR(test); } //HRR else if(which == 5){ for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); tests[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:"); int a = input.nextInt(); test[i].setArrive(a); tests[i].setArrive(a); int b = input.nextInt(); test[i].setWork(b); tests[i].setWork(b); //设置开始时间和响应比 test[i].setBegin(a); test[i].setHrr(); tests[i].setBegin(a); tests[i].setHrr(); } whichComp = "HRR"; new HRR(test,tests); } //SJF,抢占式 else if(which == 6){ for(int i=0; i<n; ++i){ test[i] = new MyProcess("P"+(i+1)); System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:"); test[i].setArrive(input.nextInt()); test[i].setWork(input.nextInt()); test[i].setRwork(test[i].getWork()); //设置剩余时间 } whichComp = "SJFS"; new SJFS(test); } else if(which == 7){ System.out.println("程序结束!"); break; } else { System.out.println("输入不合法,请重新输入!"); } System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------"); System.out.print("------------------------------------------------------------------"); System.out.println("------------------------------------------------------------------\n\n"); } input.close(); } }
部分运行结果:
相同数据的最高响应比结果为
操作系统中的几种调度算法(JAVA版)的更多相关文章
- 南阳ACM 题目8:一种排序 Java版
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...
- 剑指offer第二版面试题1:数组中重复的数字(JAVA版)
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数.请找出数组中任意一个重复的数字.例如如果输入长度为7的数组{ ...
- 剑指offer:1.找出数组中重复的数(java版)
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...
- 单例模式的几种实现-Java版
目录 关键点 饿汉式 懒汉式 双检锁 静态内部类单例模式 枚举方式 关键点 私有化构造器 通过静态方法或枚举返回单例类对象 确保单例类对象只有一个,尤其在多线程环境下. 确保每个类被序列化不会重新创建 ...
- 剑指offer第二版面试题2:数组中重复的数字(JAVA版)
题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但是不能修改输入的数组.例如,如果输入长度为8的数组{2,3,5,4,3 ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- Oracle Berkeley DB Java 版
Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
题目: 输入一个链表.输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...
随机推荐
- vue组件详解(二)——使用props传递数据
在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的. 一.基本用法 组件不仅仅 ...
- 新概念英语(1-97)A Small Blue Case
Lesson 97 A small blue case 一只蓝色的小箱子 Listen to the tape then answer this question. Does Mr. Hall get ...
- C# 后台构造json数据
前后台传值一般情况下,都会用到json类型的数据,比较常见,但是每次用到的时候去网上找比较麻烦,所以自己记录一下,下次直接用. 构造的json串格式,如下: [{","name&q ...
- Excel 日期截取(函数)
需求:时间段截取,去掉年月日,保留时分. 实现函数: =TEXT(A2,"HH:MM")&"-"&TEXT(B2,"HH:MM& ...
- Hive&SqlServerql:inner join on条件中如果两边都是空值的情况下,关联结果中会把数据给过滤掉。
今天遇到的一个大坑,话不多少,看sql和下边的查询结果: --问题:恰好把buildingid is null的记录给过滤掉 ),buildingid ),)); ); ); ); ); ); ); ...
- Java-NIO(一):简介
Java NIO简介: Java New IO Non Blocking IO,从java1.4版本就开始引入了新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和 ...
- hdu1568 Fibonacci---前4位
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1568 题目大意: 求斐波那契数列第i项的前四位.i<1e8 思路: 由于数据范围大,不可能打表 ...
- poj1182-食物链-带权并查集-种类并查集
(这应该是我写的第一个和带权并查集相关的题,还不是很了解,所以这篇博客我以后还会做修改,力求更号理解! 题意和思路: 中文题意,我简单提一下: A->B,B->C,C->A.A吃B, ...
- markdown常用语法简记
一级标题 二级标题 三级标题 ..... 无序列表 First Second Third 有序列表 第一条 第二条 第三条 链接 我的github主页 锚点 无序列表 代码块 var vm = new ...
- 对于python这门课程的一些想法、计划、期望
本人是一名大二的码农,专业信息安全.之前在知乎上看到过对于python一些评论,说用python写的代码和诗一样.也在网上大概的了解了一下,python要求有严格的缩进.学习python语言,最想学的 ...