算法第四版习题答案.docx

上传人:b****5 文档编号:6654815 上传时间:2023-01-08 格式:DOCX 页数:24 大小:21.85KB
下载 相关 举报
算法第四版习题答案.docx_第1页
第1页 / 共24页
算法第四版习题答案.docx_第2页
第2页 / 共24页
算法第四版习题答案.docx_第3页
第3页 / 共24页
算法第四版习题答案.docx_第4页
第4页 / 共24页
算法第四版习题答案.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

算法第四版习题答案.docx

《算法第四版习题答案.docx》由会员分享,可在线阅读,更多相关《算法第四版习题答案.docx(24页珍藏版)》请在冰豆网上搜索。

算法第四版习题答案.docx

算法第四版习题答案

算法第四版习题答案1.2

/*

 *1.2.1编写一个Point2D的用例,从命令行接受一个整数N。

在单位正方形内生成N个随机点,然后计算两点之间的最近距离

 */

publicclasstestPoint2D{

publictestPoint2D(){

//TODOAuto-generatedconstructorstub

}

  

publicstaticvoiddrawbox(doublebw,doublebh)

{

StdDraw.setPenRadius(0.005);

StdDraw.setPenColor(StdDraw.RED);

Interval1Dxinterval=newInterval1D(0,bw);

Interval1Dyinterval=newInterval1D(0,bh);

Interval2Dbox=newInterval2D(xinterval,yinterval);

box.draw();

}

publicstaticPoint2D[]drawpoint(intN)

{  

Point2D[]p=newPoint2D[N];

for(inti=0;i

{

doublex=Math.random();

doubley=Math.random();

p[i]=newPoint2D(x,y);

  p[i].draw();

}

returnp;

}

publicstaticdoublefindmindist(Point2D[]p)

{

 

Point2Dp1=p[0];

Point2Dp2=p[1];

doublemindist=p[0].distanceTo(p[1]);

StdDraw.setPenRadius(0.002);

StdDraw.setPenColor(StdDraw.RED);

intn=p.length;

for(inti=1;i

for(intj=i+1;j

{

doubletemp=p[i].distanceTo(p[j]);

if(temp

{mindist=temp;

p1=p[i];

p2=p[j];

}

}

p1.drawTo(p2);

StdOut.print("mindist="+mindist+p1.toString()+p2.toString());

returnmindist;

}

publicstaticvoidmain(String[]args){

intN=StdIn.readInt();//读取画点的数量

//StdDraw.setXscale(0,1);

//StdDraw.setYscale(0,1);

drawbox(1,1);//画出一个单位大小的正方形

StdDraw.setPenRadius(0.01);

StdDraw.setPenColor(StdDraw.BLACK);

//drawpoint(N);//画出N个点

doublemin=findmindist(drawpoint(N));

}

}

/*

 *编写一个Interval1D的用例,从命令行接受一个整数N。

从标准输入中读取N个间隔(每个间隔由一对double值定义)并打印出所有相交的间隔对

 */

publicclasstestInterval1D{

publictestInterval1D(){

//TODOAuto-generatedconstructorstub

}

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

intN=StdIn.readInt();

Interval1D[]interval=newInterval1D[N];

intT=N;

while(N>0){

doublelo=N;

doublehi=N+N;

interval[T-N]=newInterval1D(lo,hi);

StdOut.println(interval[T-N].toString());

N--;

}

StdOut.println("OUT:

");

for(inti=0;i

for(intj=i+1;j

if(interval[i].intersects(interval[j])==true){

StdOut.println(interval[i].toString()

+interval[j].toString());

}else{

StdOut.println(interval[i].toString()

+interval[j].toString()+"none");

}

}

}

}

/**

 *1.2.3

 */

/**

 *@authorAdministrator

 * 

 */

publicclassTestInterval2D{

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

StdOut.println("enterN:

");

intN=10;

StdOut.println("enterminandmax:

");

doublemin=0.1;

doublemax=0.9;

StdDraw.setXscale(0,1);

StdDraw.setYscale(0,1);

StdDraw.setPenRadius(0.001);

StdDraw.setPenColor(StdDraw.RED);

Interval2D[]box=newInterval2D[N];

Interval1D[]xinterval=newInterval1D[N];

Interval1D[]yinterval=newInterval1D[N];

doubleaverage=(max-min);

Point2D[][]p=newPoint2D[N][2];

/*

*Point2D[][]p使用数组保存点二位平面的对角顶点,用来计算是否包含。

Interval2D[]box

*建立数组对象,保存每个平面的信息。

*/

for(inti=0;i

doublex=Math.random();

doubley=Math.random();

doublex1=x+average*Math.random();

doubley1=y+average*Math.random();

if(x1>1){

x1=1;

}

if(y1>1){

y1=1;

}

p[i][0]=newPoint2D(x,y);

p[i][1]=newPoint2D(x1,y1);

xinterval[i]=newInterval1D(x,x1);

yinterval[i]=newInterval1D(y,y1);

box[i]=newInterval2D(xinterval[i],yinterval[i]);

box[i].draw();

}

/*

*检测时候相交

*/

for(inti=0;i

for(intj=i+1;j

if(box[i].intersects(box[j])){

StdDraw.setPenColor(StdDraw.BLACK);

box[i].draw();

box[j].draw();

//StdOut.println(box[i].toString()+box[j].toString());

}

}

/*

*是否包含

*/

for(inti=0;i

for(intj=i+1;j

if(box[i].contains(p[j][0])&&box[i].contains(p[j][1])){

StdDraw.setPenRadius(0.005);

StdDraw.setPenColor(StdDraw.BLUE);

box[i].draw();

StdDraw.setPenColor(StdDraw.GREEN);

box[j].draw();

StdOut.println("i="+i+"j="+j+" "

+box[i].toString()+box[j].toString());

}

}

}

}

/*

 *1.2.6 回环变位检测

 *1.2.7 递归返回值

 */

publicclassCircularRotation{

publicCircularRotation(){

//TODOAuto-generatedconstructorstub

}

  publicstaticStringmystery(Strings)

  {

   intN=s.length();

   if(N<=1)returns;

   Stringa=s.substring(0,N/2);

   Stringb=s.substring(N/2,N);

   StdOut.println(a+b);

   returnmystery(b)+mystery(a);

  

  }

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

Strings1="ACTGACG";

Strings2="TGACGAC";

Stringss;

ss=s1.concat(s1);

//intp=ss.indexOf(s2);

if(s1.length()==s2.length()&&ss.indexOf(s2)>0){

StdOut.println("Yes!

");

}else{

StdOut.println("NO!

");

StdOut.println(ss.indexOf(s2,ss.indexOf(s2))+" "

+ss.indexOf(s2));

}

   //测试mystery(s)

ss="0123456789";

Stringa=mystery(ss);

StdOut.println("a="+a);

}

}

/*************************************************************************

 * 1.2.9

 * 

 * 

 * Compilation:

 javacBinarySearch.java

 * Execution:

  javaBinarySearchwhitelist.txt

 * Datafiles:

 http:

//algs4.cs.princeton.edu/11model/tinyW.txt

 *        http:

//algs4.cs.princeton.edu/11model/tinyT.txt

 *        http:

//algs4.cs.princeton.edu/11model/largeW.txt

 *        http:

//algs4.cs.princeton.edu/11model/largeT.txt

 *

 * %javaBinarySearchtinyW.txt

 * 50

 * 99

 * 13

 *

 * %javaBinarySearchlargeW.txt

 * 499569

 * 984875

 * 295754

 * 207807

 * 140925

 * 161828

 * [367,966totalvalues]

 * 

 *************************************************************************/

importjava.util.Arrays;

/**

 *TheBinarySearchclassprovidesastaticmethodforbinarysearching

 *foranintegerinasortedarrayofintegers.

 *

 *Therankoperationstakeslogarithmictimeintheworstcase.

 *

 *Foradditionaldocumentation,see

 *href="http:

//algs4.cs.princeton.edu/11model">Section1.1of

 *Algorithms,4thEditionbyRobertSedgewickandKevinWayne.

 * 

 *@authorRobertSedgewick

 *@authorKevinWayne

 */

publicclassBinarySearch3{

/**

*Thisclassshouldnotbeinstantiated.

*/

/**

*Searchesfortheintegerkeyinthesortedarraya[].

*@paramkey

*      thesearchkey

*@parama

*      thearrayofintegers,mustbesortedinascendingorder

*@returnindexofkeyinarraya[]ifpresent;-1ifnotpresent

*/

publicstaticintrank(intkey,int[]a,Countercounter){

intlo=0;

inthi=a.length-1;

while(lo<=hi){

//Keyisina[lo..hi]ornotpresent.

intmid=lo+(hi-lo)/2;

if(key

hi=mid-1;

counter.increment();

StdOut.println("

}elseif(key>a[mid]){

lo=mid+1;

counter.increment();

StdOut.println(">c="+counter.tally());

}else{

StdOut.println("c="+counter.tally());

returnmid;

}

}

return-1;

}

/**

*Readsinasequenceofintegersfromthewhitelistfile,specifiedasa

*command-lineargument.Readsinintegersfromstandardinputandprints

*tostandardoutputthoseintegersthatdo*not*appearinthefile.

*/

publicstaticvoidmain(String[]args){

//readtheintegersfromafile

Inin=newIn("LargeW");

int[]whitelist=in.readAllInts();

Countercounter=newCounter("counter");

//sortthearray

Arrays.sort(whitelist);

StdOut.println(whitelist.length);

//readintegerkeyfromstandardinput;printifnotinwhitelist

while(!

StdIn.isEmpty()){

intkey=StdIn.readInt();

if(rank(key,whitelist,counter)==-1)

StdOut.println(key);

}

}

}

/*

 *1.2.10编写一个VisualCounter类,支持加一和减一操作。

它的构造函数接受两个参数N和max,

 *其中N指定了操作的最大次数,max指定了计数器的最大绝对值。

作为副作用,用图像显示每次计数器变化后的值。

 */

publicclassVisualCounter{

privateintcount;

privateintmaxOperation;

privateintval;//RecordvalueoftheCounter

privateintmaxVal;

privateintx=0;

publicVisualCounter(intN,intmax){

maxOperation=N;

maxVal=max;

StdDraw.setXscale(0,N);

StdDraw.setYscale(-max,max);

StdDraw.setPenRadius(0.005);

//TODOAuto-generatedconstructorstub

}

//currentvalue

/**

*Initializesanewcounterstartingat0,withthegivenid.

*@paramid

*      thenameofthecounter

*/

/**

*Incrementsthecounterby1.

*/

publicvoidincrement(){

if(count

count++;

val++;

x++;

StdDraw.setPenColor(StdDraw.BLACK);

StdDraw.point(x,val);

}

}

/**

*decrementthecounterby1.

*/

publicvoiddecrement(){

if(count-maxVal){

count++;

val--;

x++;

StdDraw.setPenColor(StdDraw.RED);

StdDraw.point(x,val);

}

}

/**

*Returnsthecurrentcount.

*/

publicinttally(){

returncount;

}

/**

*Returnsastringrepresentationofthiscounter

*/

publicStringtoString(){

returncount+"";

}

publicstaticvoidmain(String[]args){

VisualCounterVC=newVisualCounter(2000,1000);

for(inti=0;i<2000;i++){

if(i/1000==1)

VC.decrement();

else

VC.increment();

}

StdOut.println(VC.tally());

}

}

 

/*

*1.2.11根据Date的API实现SmartDate类型在日期非法时抛出一个异常

*1.2.12为SmartDate添加一个方法dayofWeek(),为日期返回一个星期。

*1.2.19字符串解析。

*/

publicclassSmartDateimplementsDatable{

privatefinalintmonth;

privatefinalintday;

privatefinalintyear;

publicintmonth(){

returnmonth;

}

publicintday(){

returnday;

}

publicintyear(){

returnyear;

}

/*

*原理:

蔡勒公式:

W={[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1}%7(其中[]为取整符号)

*其中,W是所求日期的星期数.如果求得的数大于7,可以减去7的倍数,直到余数小于7为止.c是公元年份

*的前两位数字,y是已知公元年份的后两位数字;m是月数,d是日数.方括[]表示只截取该数的整数部分。

*/

publicStringdayofWeek(){

intw=(year/100/4-2*(year/100)+year%100+year%100

/4+26*(month+1)/10+day-1)%7;

switch(w){

case1:

return"Monday";

case2:

return"Tuseday";

case3:

return"Wednesday";

case4:

return"Thu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1