经典Java算法50题(总)

40道JAVA经典算法面试(答案) 所有的面试目都不是一成不变的,特别是像一线大厂,上面的面试只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。大致内容包括了Java集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试等、等技术栈!希望对于大家有所助。a的值,其中a是一个数字。... 阅读详情

第一题:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
分析:通过简单的分析我们就可以发现,只有第一、二个月的兔子总数都为一,从第三个月开始,第n个月的兔子总数都是第(n-1)+(n-2)月的。
需要注意的点:数组的第一个下标为0,因此输出第n个月的兔子总数时数组下标应该为n-1

package test;

import java.util.Scanner;

public class test01 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你想查看的兔子总数的月份");
		int n = sc.nextInt();
		int[] m = new int[n];
		m[0] = m[1] = 1;
		for (int i = 2; i < n; i++) {
   
   
			m[i] = m[i - 1] + m[i - 2];
		}
		System.out.println("第" + n + "个月的兔子总数是" + m[n - 1]);
	}

}

第二题:判断101-200之间有多少个素数,并输出所有素数。
分析:素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。
需要注意的点:在第二层for循环中,我用的判断条件是将j<i/2,其实用Math.sqrt(i)更好,可以减少程序的复杂度

package test;

public class test02 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		int j;
		for (int i = 101; i <= 200; i++) {
   
   
			for (j = 2; j < i / 2; j++) {
   
   
				if (i % j == 0)
					break;
			}
			if (j == i / 2) {
   
   
				System.out.println(i);
			}
		}
	}

}

第三题:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
分析:根据题目我们可以锁定水仙花数的范围,然后将水仙花数的各位拆分,在判断该数是否是水仙花数
需要注意的点:对与我这种做法而言,将数拆分时不能直接在i下面赋值,这样a、b、c就是一个确定的数了。需要在for循环的内部定义,使每个i值都对应一个a、b、c

package test;

public class test03 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		int i = 100;
		// int a = i / 100;(不能在这里定义)
		// int b = i / 10 % 10;
		// int c = i % 10;
		System.out.print("水仙花数为:");
		for (; i < 1000; i++) {
   
   
			int a = i / 100;
			int b = i / 10 % 10;
			int c = i % 10;
			if (a * a * a + b * b * b + c * c * c == i) {
   
   
				System.out.print(i + " ");
			}
		}
	}

}

第四题:将一个正整数分解质因数。例如:输入90,打印出90=233 *5。
分析:分解质因数,只需要用输入的数n从2开始,慢慢往上除就行了
需要注意的点:以输入90为例,当i=3时,45/3=15,此时15%3==0,所以还需要以3为被除数,这就需要我们定义的被除数i不能使用一次就i++,具体怎么做请参照下面的程序

package test;

import java.util.Scanner;

public class test04 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int n = sc.nextInt();
		int i = 2;
		while (n >= i) {
   
   
			if (n == i) {
   
   
				System.out.println(n);
				break;
			} else if (n % i == 0) {
   
   
				System.out.print(i + " ");
				n /= i;
			} else {
   
   
				i++;
			}
		}
	}

}

第五题:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
分析:条件运算符是唯一一个三目运算符,语法:语句1 if条件表达式else语句2。条件运算符在执行时,会先对条件表达式进行求值判断如果判断结果为true,就执行语句1,并返回执行结果。如果判断结果为false,就执行语句2,并返回执行结果。
需要注意的点:本题条件运算的返回结果是字符,所以grade应该定义为char

package test;

import java.util.Scanner;

public class test05 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int score = sc.nextInt();
		char grade = score >= 90 ? 'A' : score >= 60 ? 'B' : 'C';
		System.out.println(grade);
	}

}

第六题:输入两个正整数m和n,求其最大公约数和最小公倍数。
分析:其它的点都容易,主要是对最大公约数的求法,一般有三种算法,在这里我展示了两种,有兴趣的朋友可以查查
需要注意的点:在使用辗转相除法求最大公约数时需要事先知道两个数的大小关系,但用更相减损法的时候不需要知道两个数的大小关系。

package test;

import java.util.Scanner;

public class test06 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt(), b = sc.nextInt();
		if (a < b) {
   
   
			int t;
			t = a;
			a = b;
			b = t;
		}
		int a1 = a, b1 = b;// 向a、b的原值保留用来求最小公倍数
		while (a1 % b1 != 0) {
   
   // 辗转相除法
			int temp = b1;
			b1 = a1 % b1;
			a1 = temp;
		}
		int c = a * b / b1;// 最小公倍数
		System.out.println("最大公约数为:" + b1 + ",最小公倍数为:" + c);
	}

}

第二种方法

package test;

import java.util.Scanner;

public class test06too {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt(), b = sc.nextInt();
		int a1 = a, b1 = b;// 向a、b的原值保留用来求最小公倍数
		while (a1 != b1) {
   
   // 更相减损法
			if (a1 > b1) {
   
   
				a1 -= b1;
			} else {
   
   
				b1 -= a1;
			}
		}
		int c = a * b / b1;// 最小公倍数
		System.out.println("最大公约数为:" + b1 + ",最小公倍数为:" + c);
	}

}

第七题:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
分析:这题主要是要历遍全部字符以及判断字符属于哪一类
需要注意的点:在Java中没有直接从键盘上接收char型字符的方法,因此我们在需要从键盘上接收字符时可以借助String类型的字符串,然后通过toCharArray()方法将之保存到char[]类型的数组中,或者自己写一个简单的方法来接收字符

package test;

import java.util.Scanner;

public class test07 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		char[] ch = s.toCharArray();
		int count1 = 0, count2 = 0, count3 = 0, count4 = 0;
		for (int i = 0; i < ch.length - 1; i++) {
   
   
			if (ch[i] > '0' && ch[i] < '9') {
   
   
				count1++;
			} else if ((ch[i] > 'a' && ch[i] < 'z') || (ch[i] > 'A' && ch[i] < 'Z')) {
   
   
				count2++;
			} else if (ch[i] == ' ') {
   
   
				count3++;
			} else {
   
   
				count4++;
			}
		}
		System.out.println("数字的个数为:" + count1);
		System.out.println("字符的个数为:" + count2);
		System.out.println("空格的个数为:" + count3);
		System.out.println("其它字符的个数为:" + count4);
	}

}

第八题:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
分析:这题主要是要得到各项的值
需要注意的点:无

package test;

import java.util.Scanner;

public class test08 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int n = sc.nextInt();
		int b = 0, sum = 0;
		for (int i = 0; i < n; i++) {
   
   
			b += a;
			sum += b;
			a *= 10;
		}
		System.out.println(sum);
	}

}

第九题:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
分析:因子就是除去这个数本身之外,所有可以被这个数整除的数
需要注意的点:在第一层for循环和第二层for循环之间需要让sum=0,不然会影响最后一个if()对下一个值的判断

package test;

public class test09 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		int i = 1, sum = 0;
		for (; i <= 1000; i++) {
   
   
			sum = 0;
			for (int j = 1; j < i; j++) {
   
   
				if (i % j == 0) {
   
   
					sum += j;
				}
			}
			if (sum == i) {
   
   
				System.out.println(sum);
			}
		}
	}

}

第十题:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
分析:第十次落地时反弹了九次
需要注意的点:无

package test;

public class test10 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		double h = 100, s = h;
		for (int i = 1; i < 10; i++) {
   
   
			h /= 2;
			s += (h * 2);
		}
		System.out.println("小球第十次落地时经过的路程为:" + s + "  第十次反弹的高度为:" + h / 2);
	}

}

第十一题:有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输入。
分析:这题只需用三层for循环即可
需要注意的点:无

package test;

public class test11 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		int count = 0;
		for (int i = 1; i <= 4; i++) {
   
   
			for (int j = 1; j <= 4; j++) {
   
   
				for (int k = 1; k <= 4; k++) {
   
   
					if (i != j && j != k && k != i) {
   
   
						System.out.println(i * 100 + j * 10 + k);
						count++;
					}
				}
			}
		}
		System.out.println(count);
	}

}

第十二题:企业发放的奖金根据利润提成。利润(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%提成,从键盘输入当月利润,求应发放奖金总数?
分析:可以通过利润各部分提成的不同将利润分成不同的部分,再利用if语句解决
需要主要的点:不能用switch语句,我第一次就想用switch,结果编译器报错以下是截图
在这里插入图片描述
意思是switch()括号里的形参变量不能是double类型的,只能是整型,字符串和枚举类型的

package test;

import java.util.Scanner;

public class test12 {
   
   

	public static void main(String[] args) {
   
   
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		double x = sc.nextDouble();
		double y = 0;
		if (x >= 0 && x <= 10) {
   
   
			y = x * 0.1;
		} else if (x <= 20) {
   
   
			y = (20 - x) * 0.075 + 10 * 0.1;
		} else if (x <= 40) {
   
   
			y = 10 * 0.1 + 10 * 0.075 + (x - 20) * 0.05;
		} else if (x <= 60) {
   
   
			y = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (x - 40) * 0.03;
		} else if (x <= 100) {
   
   
			y = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (x - 60) * 0.015;
		} else if (x > 100) {
   
   
			y = 10 * 0.1 + 10 
13 道典型 Java 面试算法题及解答 思路:首先需要了解正则表达式,\d 表示数字。{n,m}表示字符个数。可以使用正则表达式从第6位之后开始截取 8 位即可取年月日。// 测试是否为合法的身份证号码 String [ ] strs = {i ++) {// 用于提取生日字符串 Pattern p3 = Pattern . compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日 for(int i = 0; 阅读详情

相关推荐

Java经典算法50(含代码)

【程序1】 目:古典问:有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子数为多少? //这是一个菲波拉契数列问 public class test01 { public static void main(String[] args) { int f1=1,f2=1,f; ...

夏桑菊泡面 10万+

java经典算法题

1.Java多线程:写一下两个线程交替打印 0~100 的奇偶数 这种实现方式的原理就是线程1打印之后唤醒其他线程,然后让锁,自己进入休眠状态。因为进入了休眠状态就不会与其他线程抢锁,此时只有线程2在获取锁,所以线程2必然会拿到锁。线程2以同样的逻辑执行,唤醒线程1并让自己持有的锁,自己进入休眠状态。这样来来回回,持续执行直到任务完成。就达到了两个线程交替获取锁的效果了。 private int count = 0; private final Object lock = new Object()

ZHANGLIZENG的博客 8771

50经典java程序

程序一 目:古典问:有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 本需要用到递归思想,而这的核心是:a[n]=a[n-1]+a[n-1] 代码如下:`package code.test; import java.util.*; class test01 { public static void main...

qq_41269379的博客 2427

12道Java经典算法题(附带参考代码)

/这是一个菲波拉契数列问

m0_73379901的博客 3588

JAVA之——经典算法50

转载请注明处:http://blog.csdn.net/l1028386804/article/details/51097928/******************************************************************************** @author liuyazhuang &lt;1028386804@qq.com&gt;********...

冰河的专栏 9万+

Java经典逻辑编程50

相信很多 Java 初学者都看到过这些,本人也看了几遍,最终下定决心弄到我的博客中来作为我的学习记录,同时也可供后面的 Java 学习者参考。目的代码有些时看别人的,大部分是自己写的,如有雷同,请忽略。 欢迎留言,相互学习

贵在坚持 3万+

经典Java算法50整理(1~10

第一:古典问:有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子数为多少? 分析:通过简单的分析我们就可以发现,只有第一、二个月的兔子数都为一,从第三个月开始,第n个月的兔子数都是第(n-1)+(n-2)月的。 需要注意的点:数组的第一个下标为0,因此输第n个月的兔子数时数组下标应该为n-1 第二:判断101-200之间有多少个素数,并输所有素数。 分析:素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不

qq_47627886的博客 2016

JAVA经典算法50

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试答案整理在了PDF文档里《一线大厂Java面试解析+核心结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!s) {i < 3;i++)j < 3;

2401_84093054的博客 769

Java经典程序编程50(较适合初学者)

Java基础编程练习50 本人初学Java一个月左右,通过自己对网上流传较广的已有的经典50Java编程分析理解整理(不少型的考察点相识,换汤不换药),对每道分析并敲写了代码(基本实现了干要求),有的自认为解思路还算巧妙,有的也许虽然实现了但是可能较为“死板“^ - ^,欢迎新手或大佬参阅批评指正! 【程序1】 目: 古典问:有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 分析:利用递归解决斐波那契数列。

qq_29940377的博客 2万+

LeetCode刷指南:用C语言征服50经典算法题

LeetCode 作为全球知名的算法练习平台,提供了大量经典算法题目。使用 C 语言刷,不仅可以加深对算法的理解,还能提升对底层编程的掌握。本指南将带领你用 C 语言征服 50经典算法题,为你的技术能力提升助力。

星辰夜语的博客 1930

Java经典50

转载原创:https://blog.csdn.net/wenzhi20102321/article/details/52274976 版权声明:本文为博主原创文章。只要评论中留言就可以转载。 https://blog.csdn.net/wenzhi20102321/article/details/52274976 ...

tengyu0508的博客 4632

java50经典算法题

【程序1】 目:古典问:有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 具体分析如下: f(1) = 1(第1个月有一对兔子) f(2) = 1(第2个月还是一对兔子) f(3) = 2(原来有一对兔子,第3个开始,每个月生一...

兔PP的博客 1698

我整理了50经典Java算法题,直接进了字节跳动!!

肝了半个月,整理了万字长文Java经典算法题!!

冰河的专栏 5573

Java最新练习50 Java经典50 Java算法 带解思路,附答案

Java基础练习501.有一对兔子,从生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....2.判断101-200之间有多少个素数,并输所有素数。3.打印所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。4.将一个正整数分解质因数。例如:输入90,打印90=2

qq_43541242的博客 3285

java经典50详解

java经典50详解 最近系统的做了一下java经典50. 目的难度不太大,而且不会用到什么生僻的类, 很适合接触java不太久的人来锻炼自己的逻辑思维,和加深对数组,逻辑控制,字符串等基础知识的理解… 本次做,我尽量将代码变得灵活,使得代码可以通过参数的调整来适应更多的问 而且对于每一个的答案都进行过测试… 下面就将解的代码分享给大家 1—10 pac...

.... 1万+
上一篇: Java经典算法50题(41~50题)
下一篇: 史上最全Java知识点总结
poinner…
博客等级 码龄6年 26粉丝 66原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值