大学生必学练习题 - Java 语言经典50例(1),javaweb面试题大汇总

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

在大学期间,Java 语言一般会作为计算机专业类的课程,而且也不少学生会选择 Java 来作为学习编程的主要语言。在学习掌握基础知识之后,通过大量的编程练习题,手写代码,是巩固基础知识,锻炼编程思维的重要手段之一。下面介绍 Java 语言练习实例50例,题目+解题思路 + 解法。

1 汉诺塔



题目:假设一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。

分析:利用递归实现圆盘的整个移动过程;当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

package com.nobody;

/**

  • @Description

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

// 将3个盘子从A移动到C

hanoi(3, ‘A’, ‘B’, ‘C’);

}

/**

  • 汉诺塔转移过程

  • @param n 盘子数量

  • @param from 起点柱子

  • @param inter 中转柱子

  • @param to 终点柱子

*/

public static void hanoi(int n, char from, char inter, char to) {

// 只剩一个盘子的时候直接从from移动到to

if (n == 1) {

System.out.println("盘子1从 " + from + " 移动到 " + to);

} else {

// 将最上面的n-1个盘子从起点借助终点移动到中转柱子

hanoi(n - 1, from, to, inter);

// 将当前最大的盘子直接从起点移动终点

System.out.println(“盘子” + n + "从 " + from + " 移动到 " + to);

// 再将刚才n-1个盘子从中转点借助起点移动到终点

hanoi(n - 1, inter, from, to);

}

}

}

演示代码的输出结果如下:

盘子1从 A 移动到 C

盘子2从 A 移动到 B

盘子1从 C 移动到 B

盘子3从 A 移动到 C

盘子1从 B 移动到 A

盘子2从 B 移动到 C

盘子1从 A 移动到 C

2 斐波那契数列



题目:斐波那契数列的第1项是0,第2项是1,第3项开始,每一项的值都是前两项之和。例如第3项是第1项和第2项之和,即 0+1=1,第4项是第2项和第3项之和,即 1+1=2。它是这样一个数列 0,1,1,2,3,5,8,13,21,…

分析:因为前2项比较特殊,所以单独处理,从第3项开始,通过前两项之和来求出下一项的值即可。有2种解法实现,一种解法是通过2个变量,不断保存前两项的值,然后求它们之和即可。另一种解法是通过递归算法,从当前项开始,不断递归求算前两项的值,直到第1项和第2项的值,即可回推。

package com.nobody;

/**

  • @Description 递归解法

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

// 输出前20个数

int num = 20;

for (int i = 1; i <= num; i++) {

System.out.println(“斐波那契数列第” + i + “项是” + fibonacci(i));

}

}

public static long fibonacci(long number) {

// 第1项和第2项特殊处理,即返回0和1

if (number == 1 || number == 2) {

return number - 1;

} else {

// 排除第1项和第2项,都是前两项的和

return fibonacci(number - 2) + fibonacci(number - 1);

}

}

}

package com.nobody;

/**

  • @Description 非递归解法

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

// 输出前20个数

int num = 20;

// 保存前两项的值

int x = 0, y = 1;

// 当前项的值

int curData;

for (int i = 1; i <= num; i++) {

// 第1项和第2项特殊处理,即返回0和1

if (i == 1 || i == 2) {

System.out.println(“斐波那契数列第” + i + “项是” + (i - 1));

} else { // 排除第1项和第2项,都是前两项的和

curData = x + y;

System.out.println(“斐波那契数列第” + i + “项是” + curData);

x = y;

y = curData;

}

}

}

}

演示代码的输出结果如下:

斐波那契数列第1项是0

斐波那契数列第2项是1

斐波那契数列第3项是1

斐波那契数列第4项是2

斐波那契数列第5项是3

斐波那契数列第6项是5

斐波那契数列第7项是8

斐波那契数列第8项是13

斐波那契数列第9项是21

斐波那契数列第10项是34

斐波那契数列第11项是55

斐波那契数列第12项是89

斐波那契数列第13项是144

斐波那契数列第14项是233

斐波那契数列第15项是377

斐波那契数列第16项是610

斐波那契数列第17项是987

斐波那契数列第18项是1597

斐波那契数列第19项是2584

斐波那契数列第20项是4181

3 九九乘法表



题目:输出九九乘法表。

分析:使用两层 for 循环遍历输出九九乘法表。

package com.nobody;

/**

  • @Description 九九乘法表

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

for (int i = 1; i <= 9; i++) {

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

System.out.print(j + “×” + i + “=” + i * j + “\t”);

}

System.out.println();

}

}

}

演示代码的输出结果如下:

1×1=1

1×2=2 2×2=4

1×3=3 2×3=6 3×3=9

1×4=4 2×4=8 3×4=12 4×4=16

1×5=5 2×5=10 3×5=15 4×5=20 5×5=25

1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36

1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49

1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64

1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

4 字符串替换



题目:将字符串的某一子串替换为另外的字符串。例如将 陈皮的JavaLibJava 子串替换为 C ,则最终变为 陈皮的CLib

分析:Java 类库中有许多实用的类,定义了许多通用的方法,可以使用 String 类的 replace 方法。

package com.nobody;

/**

  • @Description

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

String str = “我是陈皮,我的公众号【陈皮的JavaLib】”;

System.out.println(“全部替换陈皮狗蛋之后的字符串:” + str.replace(“陈皮”, “狗蛋”));

System.out.println(“全部替换陈皮狗蛋之后的字符串:” + str.replaceAll(“陈皮”, “狗蛋”));

System.out.println(“只替换一个陈皮狗蛋之后的字符串:” + str.replaceFirst(“陈皮”, “狗蛋”));

}

}

演示代码的输出结果如下:

全部替换陈皮狗蛋之后的字符串:我是狗蛋,我的公众号【狗蛋的JavaLib】

全部替换陈皮狗蛋之后的字符串:我是狗蛋,我的公众号【狗蛋的JavaLib】

只替换一个陈皮狗蛋之后的字符串:我是狗蛋,我的公众号【陈皮的JavaLib】

5 字符串反转



题目:将字符串反转,例如 abcde 反转为 edcba

分析:直接调用 StringBuffer 类的 reverse 方法。

package com.nobody;

/**

  • @Description

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

String str = “abcde”;

String reverse = new StringBuffer(str).reverse().toString();

System.out.println(str + “反转后:” + reverse);

}

}

演示代码的输出结果如下:

abcde反转后:edcba

6 打印倒立的三角形



题目:打印倒立的三角形,使用 * 号来打印。

分析:倒立的三角形,我们使用一行行往下打印的方法,注意的是每打印一行的时候,需要计算每一行前面需要打印多少个空格。

package com.nobody;

/**

  • @Description 打印倒立的三角形

  • @Author Mr.nobody

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

// 打印6行的倒立的三角形

for (int i = 1; i <= 6; i++) {

// 打印每一行前的空格,下一行总会比上一行多一个空格

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

System.out.print(" ");

}

// 打印*

for (int k = 1; k <= 11 - 2 * (i - 1); k++) {

System.out.print(“*”);

}

System.out.println();

}

}

}

演示代码的输出结果如下:






7 解析 URL



题目:url 地址是有几部分组成的,例如协议,IP,端口,文件名等。请从 URL 中提取出来。

分析:通过 URL 类,里面定义了许多方法,分别用于提取 URL 中相应的信息。

package com.nobody;

import java.net.URL;

/**

  • @Description 解析 URL

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) throws Exception {

URL url = new URL(“http://www.nobody.com/html/index.html”);

System.out.println(“URL:” + url.toString());

System.out.println(“协议:” + url.getProtocol());

System.out.println(“主机:” + url.getHost());

System.out.println(“端口号:” + url.getPort());

System.out.println(“文件名:” + url.getFile());

System.out.println(“路径:” + url.getPath());

System.out.println(“默认端口号:” + url.getDefaultPort());

}

}

演示代码的输出结果如下:

URL:http://www.nobody.com/html/index.html

协议:http

主机:www.nobody.com

端口号:-1

文件名:/html/index.html

路径:/html/index.html

默认端口号:80

8 水仙花数



题目:水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,153 = 1^3 + 5^3 + 3^3.

分析:遍历100-999 之间的数,计算每位数字的立方是否等于其本身。

package com.nobody;

/**

  • @Description 水仙花数

  • @Date 2021/5/31

  • @Version 1.0

*/

public class Demo {

public static void main(String[] args) {

int x, y, z;

for (int i = 100; i <= 999; i++) {

x = i % 10;

y = i / 10 % 10;

z = i / 100 % 10;

if (i == (x * x * x + y * y * y + z * z * z)) {

System.out.println(i);

}

}

}

}

演示代码的输出结果如下:

153

370

371

407

9 杨辉三角



题目:杨辉三角的两个腰边的数都是 1,其它位置的数都是上顶上两个数之和。

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


题目:杨辉三角的两个腰边的数都是 1,其它位置的数都是上顶上两个数之和。

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

[外链图片转存中…(img-lJcB0lw8-1713462297109)]

[外链图片转存中…(img-yRZyJXFh-1713462297109)]

由于内容太多,这里只截取部分的内容。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-Ms2VBNrs-1713462297110)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值