JAVA经典算法40题.docx
- 文档编号:10662654
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:50
- 大小:31.18KB
JAVA经典算法40题.docx
《JAVA经典算法40题.docx》由会员分享,可在线阅读,更多相关《JAVA经典算法40题.docx(50页珍藏版)》请在冰豆网上搜索。
JAVA经典算法40题
JAVA经典算法40题
有一组字符串比如北京,北京,上海,上海,上海,武汉-------->要得到北京,上海,武汉
怎么去掉里面重复的字符串?
functionDelRepetStr(Stringstr)
{
varresult;
varlist=str.split(",");
for(vari=0;i { if(result.indexOf(list(i))==-1)result=result+list(i)+","; } returnresult; } 一个ArrayList里放的是字符串,数字型的,如"111","122","111","233"...如何把重复的去掉: 参考: publicclasstestStr{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub ArrayListtmp=newArrayList(); tmp.add("111"); tmp.add("112"); tmp.add("111"); tmp.add("111"); tmp.add("114"); Stringt1,t2; /**********方法一start************/ //for(inti=0;i //t1=(String)tmp.get(i); //for(intj=i+1;j //t2=(String)tmp.get(j); //if(t1.equals(t2)){ //tmp.remove(j); //j--; //} //} //} /**********方法一end*********××***/ /**********方法二start************/ //for(inti=0;i //t1=(String)tmp.get(i); //for(intj=tmp.size()-1;j>i;j--){ //t2=(String)tmp.get(j); //if(t1.equals(t2)){ //tmp.remove(j); //} //} //} /**********方法二end**************/ /**********方法三start************/ //tmp=(ArrayList)removeDuplicateObj(tmp); /**********方法三end**************/ /**********方法四start************/ TreeSetset=newTreeSet(tmp); Iteratorit=set.iterator(); int[]arr=newint[set.size()]; inti=0; while(it.hasNext()){ arr[i]=Integer.parseInt(it.next().toString()); i++; } Arrays.sort(arr); for(intj=0;j System.out.println(arr[j]); } /**********方法四end**************/ System.out.println("tmp--"+tmp.size()); } /** *@paramlist */ privatestaticListremoveDuplicateObj(Listlist){ //................ SetsomeSet=newHashSet(list); //将Set中的集合,放到一个临时的链表中(tempList) Iteratoriterator=someSet.iterator(); ListtempList=newArrayList(); inti=0; while(iterator.hasNext()){ tempList.add(iterator.next().toString()); i++; } returntempList; } } 【程序1】 题目: 古典问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... publicclassexp2{ publicstaticvoidmain(Stringargs[]){ inti=0; for(i=1;i<=20;i++) System.out.println(f(i)); } publicstaticintf(intx) { if(x==1||x==2) return1; else returnf(x-1)+f(x-2); } } 或 publicclassexp2{ publicstaticvoidmain(Stringargs[]){ inti=0; mathmymath=newmath(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } classmath { publicintf(intx) { if(x==1||x==2) return1; else returnf(x-1)+f(x-2); } } 【程序2】 题目: 判断101-200之间有多少个素数,并输出所有素数。 1.程序分析: 判断素数的方法: 用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 publicclassexp2{ publicstaticvoidmain(Stringargs[]){ inti=0; mathmymath=newmath(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } classmath { publicintf(intx) { if(x==1||x==2) return1; else returnf(x-1)+f(x-2); } publicbooleaniszhishu(intx) { for(inti=2;i<=x/2;i++) if(x%2==0) returnfalse; returntrue; } } 【程序3】 题目: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。 例如: 153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析: 利用for循环控制100-999个数,每个数分解出个位,十位,百位。 publicclassexp2{ publicstaticvoidmain(Stringargs[]){ inti=0; mathmymath=newmath(); for(i=100;i<=999;i++) if(mymath.shuixianhua(i)==true) System.out.println(i); } } classmath { publicintf(intx) { if(x==1||x==2) return1; else returnf(x-1)+f(x-2); } publicbooleaniszhishu(intx) { for(inti=2;i<=x/2;i++) if(x%2==0) returnfalse; returntrue; } publicbooleanshuixianhua(intx) { inti=0,j=0,k=0; i=x/100; j=(x%100)/10; k=x%10; if(x==i*i*i+j*j*j+k*k*k) returntrue; else returnfalse; } } 【程序4】 题目: 将一个正整数分解质因数。 例如: 输入90,打印出90=2*3*3*5。 程序分析: 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 publicclassexp2{ publicexp2(){} publicvoidfengjie(intn){ for(inti=2;i<=n/2;i++){ if(n%i==0){ System.out.print(i+"*"); fengjie(n/i); } } System.out.print(n); System.exit(0);///不能少这句,否则结果会出错 } publicstaticvoidmain(String[]args){ Stringstr=""; exp2c=newexp2(); str=javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出): "); intN; N=0; try{ N=Integer.parseInt(str); }catch(NumberFormatExceptione){ e.printStackTrace(); } System.out.print(N+"分解质因数: "+N+"="); c.fengjie(N); } } 【程序5】 题目: 利用条件运算符的嵌套来完成此题: 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析: (a>b)? a: b这是条件运算符的基本例子。 importjavax.swing.*; publicclassex5{ publicstaticvoidmain(String[]args){ Stringstr=""; str=JOptionPane.showInputDialog("请输入N的值(输入exit退出): "); intN; N=0; try{ N=Integer.parseInt(str); } catch(NumberFormatExceptione){ e.printStackTrace(); } str=(N>90? "A": (N>60? "B": "C")); System.out.println(str); } } 【程序6】 题目: 输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析: 利用辗除法。 最大公约数: publicclassCommonDivisor{ publicstaticvoidmain(Stringargs[]) { commonDivisor(24,32); } staticintcommonDivisor(intM,intN) { if(N<0||M<0) { System.out.println("ERROR! "); return-1; } if(N==0) { System.out.println("thebiggestcommondivisoris: "+M); returnM; } returncommonDivisor(N,M%N); } } 最小公倍数和最大公约数: importjava.util.Scanner; publicclassCandC { //下面的方法是求出最大公约数 publicstaticintgcd(intm,intn) { while(true) { if((m=m%n)==0) returnn; if((n=n%m)==0) returnm; } } publicstaticvoidmain(Stringargs[])throwsException { //取得输入值 //Scannerchin=newScanner(System.in); //inta=chin.nextInt(),b=chin.nextInt(); inta=23;intb=32; intc=gcd(a,b); System.out.println("最小公倍数: "+a*b/c+"\n最大公约数: "+c); } } 【程序7】 题目: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析: 利用while语句,条件为输入的字符不为'\n'. importjava.util.Scanner; publicclassex7{ publicstaticvoidmain(Stringargs[]) { System.out.println("请输入字符串: "); Scannerscan=newScanner(System.in); Stringstr=scan.next(); StringE1="[\u4e00-\u9fa5]"; StringE2="[a-zA-Z]"; intcountH=0; intcountE=0; char[]arrChar=str.toCharArray(); String[]arrStr=newString[arrChar.length]; for(inti=0;i { arrStr[i]=String.valueOf(arrChar[i]); } for(Stringi: arrStr) { if(i.matches(E1)) { countH++; } if(i.matches(E2)) { countE++; } } System.out.println("汉字的个数"+countH); System.out.println("字母的个数"+countE); } } 【程序8】 题目: 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 1.程序分析: 关键是计算出每一项的值。 importjava.io.*; publicclassSumloop{ publicstaticvoidmain(String[]args)throwsIOException { ints=0; Stringoutput=""; BufferedReaderstadin=newBufferedReader(newInputStreamReader(System.in)); System.out.println("请输入a的值"); Stringinput=stadin.readLine(); for(inti=1;i<=Integer.parseInt(input);i++) { output+=input; inta=Integer.parseInt(output); s+=a; } System.out.println(s); } } 另解: importjava.io.*; publicclassSumloop{ publicstaticvoidmain(String[]args)throwsIOException { ints=0; intn; intt=0; BufferedReaderstadin=newBufferedReader(newInputStreamReader(System.in)); Stringinput=stadin.readLine(); n=Integer.parseInt(input); for(inti=1;i<=n;i++){ t=t*10+n; s=s+t; System.out.println(t); } System.out.println(s); } } 【程序9】 题目: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如6=1+2+3.编程 找出1000以内的所有完数。 publicclassWanshu{ publicstaticvoidmain(String[]args) { ints; for(inti=1;i<=1000;i++) { s=0; for(intj=1;j if(i%j==0) s=s+j; if(s==i) System.out.print(i+""); } System.out.println(); } } 【程序10】题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米? 第10次反弹多高? publicclassEx10{ publicstaticvoidmain(String[]args) { doubles=0; doublet=100; for(inti=1;i<=10;i++) { s+=t; t=t/2; } System.out.println(s); System.out.println(t); } } 【程序11】 题目: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数? 都是多少? 1.程序分析: 可填在百位、十位、个位的数字都是1、2、3、4。 组成所有的排列后再去 掉不满足条件的排列。 publicclassWanshu{ publicstaticvoidmain(String[]args) { inti=0; intj=0; intk=0; intt=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) for(k=1;k<=4;k++) if(i! =j&&j! =k&&i! =k) {t+=1; System.out.println(i*100+j*10+k); } System.out.println(t); } } 【程序12】 题目: 企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析: 请利用数轴来分界,定位。 注意定义时需把奖金定义成长整型。 importjava.util.*; publicclasstest{ publicstaticvoidmain(String[]args){ doublesum;//声明要储存的变量应发的奖金 Scannerinput=newScanner(System.in);//导入扫描器 System.out.print("输入当月利润"); doublelirun=input.nextDouble();//从控制台录入利润 if(lirun<=100000){ sum=lirun*0.1; }elseif(lirun<=200000){ sum=10000+lirun*0.075; }elseif(lirun<=400000){ sum=17500+lirun*0.05; }elseif(lirun<=600000){ sum=lirun*0.03; }elseif(lirun<=1000000){ sum=lirun*0.015; }else{ sum=lirun*0.01; } System.out.println("应发的奖金是"+sum); } } 后面其他情况的代码可以由读者自行完善. 【程序13】 题目: 一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少? 1.程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。 请看具体分析: public
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 经典 算法 40