Java复习第三天

ops/2025/1/20 18:10:29/
一、代码题

1.爬楼梯

(1)题目

假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?

  • 示例 1: 输入:n=2 输出:2
  • 解释:有两种方法可以爬到楼顶。 1阶+1阶 2 阶
  • 示例 2: 输入:n=3 输出:3
  • 解释:有三种方法可以爬到楼顶。 1 阶+1阶+1阶 1 阶 +2 阶 2 阶+1阶

(2)思路实现

问题的核心在于找到到达第 n 阶的方法数。每次你可以爬 1 或 2 个台阶,因此到达第 n 阶的方法数等于到达第 n-1 阶的方法数加上到达第 n-2 阶的方法数。这是因为从第 n-1 阶爬 1 个台阶可以到达第 n 阶,从第 n-2 阶爬 2 个台阶也可以到达第 n 阶。

(3)代码实现

java">package com.thor.test;public class Demo {public static void main(String[] args) {//创建Solution对象的实例Solution solution = new Solution();//示例 1: 输入:n=2 输出:2 解释:有两种方法可以爬到楼顶。1阶+1阶   2阶int i = solution.climbStairs(2);System.out.println(i);//示例 2: 输入:n=3 输出:3 解释:有三种方法可以爬到楼顶。 1阶+1阶+1阶   1阶+2阶   2阶+1阶int i1 = solution.climbStairs(3);System.out.println(i1);}
}
class Solution {/*** @description:* @author: Allen* @date: 2025/1/13 15:18* @param: [n] n为n层台阶* @return:**/public int climbStairs(int n){//此时n为0或1,直接返回1,因为只有一种方法可以到达if(n<=1){return 1;}//创建一个数组dp,用于存储到达每一阶的方法数int[] dp= new int[n+1];//初始化dp[0] dp[1] 因为到达第0阶和第1阶的方法数都是1dp[0]=1;dp[1]=1;//使用循环计算从第2阶到n阶的方法数for(int i=2;i<=n;i++){//状态转移方程dp[i]=dp[i-1]+dp[i-2];}//返回到达第n阶的方法数return dp[n];}
}

2.删除排序链表中的重复元素

(1)题目

给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表

示例 1: 输入:head =[1,1,2] 输出:[1,2]

示例 2: 输入:head =[1,1,2,3,3] 输出:[1,2,3]

(2)思路实现

1. 从链表的头节点开始遍历。

2. 对于每个节点,检查其值是否与下一个节点的值相同。

3. 如果相同,则跳过下一个节点,即将当前节点的 next 指针指向下一个节点的下一个节点。

4. 如果不同,则继续遍历下一个节点。

5. 重复上述步骤直到遍历完整个链表。

6. 返回处理后的链表头节点。

(3)代码实现

java">package com.thor.test;public class Demo {public static void main(String[] args) {// 创建 Solution 对象ListNode.Solution solution = new ListNode.Solution();// 示例 1: 输入: head = [1,1,2] 输出: [1,2]ListNode l1 = new ListNode(1, new ListNode(1, new ListNode(2)));ListNode listNode = solution.deleteDuplicates(l1);System.out.print("示例1输出:");printList(listNode);// 示例 2: 输入: head = [1,1,2,3,3] 输出: [1,2,3]ListNode l2 = new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3)))));ListNode listNode1 = solution.deleteDuplicates(l2);System.out.print("示例2输出:");printList(listNode1);}// 打印链表的辅助方法public static void printList(ListNode head) {ListNode current = head;while (current != null) {System.out.print(current.val + " ");current = current.next;}System.out.println();}
}
class ListNode {/*** @description:* @author: Allen* @date: 2025/1/13 17:19* @param:* @return:**/int val; // 节点值ListNode next; // 下一个节点ListNode() {} // 无参构造方法ListNode(int val) { this.val = val; } // 有参构造方法ListNode(int val, ListNode next) { this.val = val; this.next = next; } // 有参构造方法static class Solution {/*** @description:* @author: Allen* @date: 2025/1/13 16:50* @param: [head] // 链表头节点* @return:**/public ListNode deleteDuplicates(ListNode head) {// 初始化当前指针指向链表头节点ListNode current = head;// 遍历链表,当前节点和下一个节点都不为 nullwhile (current != null && current.next != null) {// 如果当前节点的值和下一个节点的值相同if (current.val == current.next.val) {// 跳过下一个节点,当前节点的 next 指向下一个节点的下一个节点current.next = current.next.next;} else {// 如果当前节点的值和下一个节点的值不同,则指针后移一位current = current.next;}}// 返回处理后的链表头节点return head;}}
}
二、数组

1.使用

  • 格式:数据类型 [] 变量名 = new 数据类型 [ 长度 ]————动态初始化
  • 数据类型 [] 变量名={数值 1,数值 2,数值 3......}————静态初始化
  • 赋值:变量名 [序号] = 数值
  • 代码
java">//数组格式
int [] arr= new int[5];
//赋值
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[3]=4;
arr[4]=5;
//输出
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);

2.length

(1)属性和方法的区别

  • 有小括号叫方法——length()
  • 无小括号叫属性——length

(2)使用

  • 快速使用:arr.for 或者 arr.fori
  • 代码
java">int[]arr= {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);
}

(3)练习题

a.题目:有一个数列:8,4,2,1,23,344,12。

  • 循环输出数列的值
  • 求数列中所有数值的和
  • 猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数

补充知识点:三目运算符 ——这里的 condition 是一个布尔表达式,如果它的值为 true,则整个表达式的结果为 value1;如果为 false,则结果为 value2

代码

java">Scanner scanner = new Scanner(System.in);
int[]arr= {8,4,2,1,23,344,12};
int sum= 0;
for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");sum+=arr[i];
}
System.out.println("\n"+"和:"+sum);
System.out.print("请输入一个数: ");
int number = scanner.nextInt();
boolean flag= false;
for (int i = 0; i < arr.length; i++) {if(number==arr[i]){flag=true;break;}
}
System.out.println(flag?"存在":"不存在");

b.题目:从表格的形式输出5笔购物金额及总金额

实现步骤:

  • 创建一个长度为5的double类型数组,存储购物金额
  • 循环输入5笔购物金额,并累加总金额
  • 利用循环输出5笔购物金额最后输出总金额

代码

java">Scanner scanner = new Scanner(System.in);
double [] arr = new double[5];
System.out.println("消费记录");
for (int i = 0; i < arr.length; i++) {System.out.print("请输入第"+(i+1)+"笔购物金额: ");arr[i] = scanner.nextDouble();
}
System.out.println("序号\t金额");
double sum = 0;
for (int i = 0; i < arr.length; i++) {System.out.println((i+1)+"\t"+arr[i]);sum+=arr[i];
}
System.out.println("总金额: "+sum);
三、 Array类
  • 提供了很多操作数组的方法

1.sort——排序(升序)

java">int[]arr={1,4,7,3,2};
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);
}

2.to String——将数组转换成字符串

java">int[]arr={1,4,7,3,2};
System.out.println(Arrays.toString(arr));

3.equals——boolean equals(array1,array2):比较array1和array2两个数组是否相等

java">int[]arr1={1,4,7,3,2};
int[]arr2={1,4,7,3,2};
System.out.println(Arrays.equals(arr1,arr2));

4.fill——void fill(array,val):把数组array所有元系都赋值为val

java">int[]arr1={1,4,7,3,2};
Arrays.fill(arr1,12);
System.out.println(Arrays.toString(arr1));

5.copyOf——copy0f(array,length):将数组array复制成一个长度为length的新数组,返回类型与复制的数组一致

空位置默认为 0

java">int[]arr1={1,4,7,3,2};
System.out.println( Arrays.toString(Arrays.copyOf(arr1,6)));

练习题

题目:将 一组乱序的字符(a、d、r、t、y、u、h)进行排序进行升序和逆序输出

实现步骤:

  • 创建数组存储原字符序列
  • 利用Arrays类的sort()方法对数组进行排序,并循环输出
  • 从最后一个元素开始,将数组中的元素逆序输出

代码

java">char [] arr ={'a','d','r','t','y','u','h'};
System.out.print("原字符系列: ");
for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");
}
Arrays.sort(arr);
System.out.println();
System.out.print("升序排序后: ");
for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");
}
System.out.println();
System.out.print("逆序输出后: ");
for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");
}
四、练习题

1.二重循环

题目:若有3个班级各4名学员参赛,如何计算每个班级参赛学员的平均分?

思路:外层循环控制班级数目,内层循环控制每个班级学员数目

代码:

java">Scanner scanner = new Scanner(System.in);
//外循环班级,内循环学生
for (int i = 1; i <= 3; i++) {System.out.println("第输入第" + i + "个班级的成绩");int sum = 0;for (int j = 1; j <= 4; j++) {System.out.print("第" + j + "个学生的成绩: ");sum+=scanner.nextInt();}System.out.println("第" + i + "个班级的平均成绩是: " + sum/4.0);
}

2.正方形

java">for (int i = 0; i <=5; i++) {for (int j = 0; j <= 5; j++) {System.out.print("*"+" ");}System.out.println();
}

3.直角三角形

java">for (int i = 1; i <= 5; i++) {for (int j = 1; j <= i; j++) {System.out.print("*");}System.out.println();
}

4.倒直角三角形

java">for (int i = 1; i <= 5; i++) {for (int j = 0; j < 5 - i; j++) {System.out.print("*");}System.out.println();
}

5.等腰三角形

java">for (int i = 1; i <= 5; i++) {for (int j = 1; j <= 5 - i; j++) {System.out.print(" ");}for (int k = 1; k <= 2 * i - 1; k++) {System.out.print("*");}System.out.println();
}

6.九九乘法表

java">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();
}

7.冒泡排序

java">int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};
for (int i = 0; i < arr.length  - 1; i++) {for (int j = 0; j < arr.length  - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换 arr[j] 和 arr[j + 1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
}
// 打印排序后的数组的每个元素 
for (int i = 0; i < arr.length;  i++) {System.out.println(arr[i]);  // 只打印当前元素,而不是整个数组 
}
// 如果你还想打印整个排序后的数组,可以这样做一次: 
System.out.println(Arrays.toString(arr));  // 打印整个排序后的数组一次 
五、二维数组

1.格式

  • int[ ][ ] arr = new int [ ][ ]

2.代码

java">int[][]arr={{1,2,3},{4,5,6},{7,8,9}
};
//二重循环
//外循环:行数  内循环:行的元素
for (int i = 0; i < arr.length; i++) {for(int j = 0; j <arr[i].length ; j++){System.out.print(arr[i][j]+"\t");}System.out.println();
}
六、函数

1.有无返回值、参数

java">public static void main(String[] args) {//无参无返f01();//无参有返f02();int i = f02();System.out.println("返回的值: "+i);//有参无返f03("allen", 18);//有参有返f04("allen", 18);System.out.println("返回的值: "+i);
}
/** @description: 公共的访问修饰符public 静态的static 没有返回值的void 方法名(参数列表){ 方法体 }* @author: Allen* @date: 2025/1/19 20:21* @param:* @return:*/
public static void f01(){System.out.println("f01\n");
}
/** @description: 公共的访问修饰符public 静态的static 有返回值的int 方法名(参数列表){ 方法体  return 数字 }* @author: Allen* @date: 2025/1/19 20:23* @param:* @return:*/
public static int f02(){System.out.println("f02");return 0;
}
/** @description: 公共的访问修饰符public 静志的static 没有返回值的void 方法名(参数列表){ 方法体  return 数字;} 有参无返* @author: Allen* @date: 2025/1/19 20:27* @param:* @return:*/
public static void f03(String name,int age){System.out.println("\n"+name);System.out.println(age+"\n");
}
/** @description: 公共的访问修饰符public 静志的static 有返回值的int 方法名(参数列表){ 方法体  return 数字;} 有参有返* @author: Allen* @date: 2025/1/19 20:34* @param:* @return:*/
public static int f04(String name,int age){System.out.println(name);System.out.println(age);return 1;
}

2.函数重载

  • 什么是:函数支持同名
  • 原则:方法名相同,参数列表不相同,与返回值无关

代码

java">public static void main(String[] args) {f01(1);f01(1.0);
}
public static void f01(double money){
System.out.println("1");
}
public static int f01(int age){
System.out.println(age);
return age;
}

3.函数可变个数参数

java">public static void main(String[] args) {f01(new int[]{1,2,3});f01();f01(1);f01(1,2);f01(1,2,3);f01(1,2,3,4);
}
public static void f01(int... x){System.out.println(Arrays.toString(x));
}

4.foreach——增加和简化for循环

  • foreach 输出,没有下标
java">public static void main(String[] args) {f01(new int[]{1,2,3});f01();f01(1);f01(1,2);f01(1,2,3);f01(1,2,3,4);
}
public static void f01(int... arr){for (int i : arr) {System.out.print(i);}
}

5.传参

  • 基本数据类型
java">public static void main(String[] args) {int x=10;f01(x);
}
public static void f01(int y){
System.out.println(y);
y++;
System.out.println(y);
}
  • 引用数据类型
java">public static void main(String[] args) {int [] x={10,20,30};f01(x);System.out.println(Arrays.toString(x));
}
public static void f01(int[] y){System.out.println(Arrays.toString(y));y[0]++;System.out.println(Arrays.toString(y));
}

http://www.ppmy.cn/ops/151730.html

相关文章

Go 语言 select 的实现原理

介绍 select是Go在语言层面提供的I/O多路复用的机制&#xff0c;其专门用来让Goroutine同时等待多个channel是否准备完毕:可读或可写。在Channel状态改变之前&#xff0c;select会一直阻塞当前线程或者goroutine。 特性&#xff1a; case 必须是一个通信操作&#xff0c;主要是…

K8S的探针说明和使用方式

探针概述 探针分类 K8S中 探针&#xff08;Probes&#xff09; 是用于检查容器的健康状况和可用性的机制。探针可以自动判断应用的运行状态&#xff0c;并根据需要重启容器、替换容器或将流量路由到健康的实例。从而确保应用始终处于健康、可用的状态&#xff0c;并帮助自动化…

Rust 错误处理(下)

目录 1、用 Result 处理可恢复的错误 1.1?传播错误的简写&#xff1a;? 运算符 1.2 哪里可以使用 ? 运算符 2、要不要 panic! 2.1?示例、代码原型和测试都非常适合 panic 2.2?当我们比编译器知道更多的情况 2.3?错误处理指导原则 2.4?创建自定义类型进行有效性验…

MySQL表的创建实验

创建并使用数据库mydb6_product 。 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec)mysql> use mydb6_product; Database changed 新建employees表。 对于gender&#xff0c;有默认值意味着不为空&#xff0c;在建表时可以选择不写not nul…

会话_JSP_过滤器_监听器_Ajax

第8章 会话_JSP_过滤器_监听器_Ajax 8.1 会话 8.1.1 会话管理概述 1、为什么需要会话管理 HTTP是无状态协议&#xff1a; 无状态就是不保存状态&#xff0c;即无状态协议(stateless)&#xff0c;HTTP协议自身不对请求和响应之间的通信状态进行保存&#xff0c;也就是说&…

Centos 8 交换空间管理

新增swap 要增加 Linux 系统的交换空间&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建一个交换文件 首先&#xff0c;选择文件路径和大小&#xff08;例如&#xff0c;增加 1 GB 交换空间&#xff09;。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…

斯坦福iDP3的Learning代码解析:逐步分解人形策略iDP3的数据集、模型、策略代码

前言 今25年1.14日起&#xff0c;我和同事孙老师连续出差苏州、无锡、南京、上海 1.14日在苏州&#xff0c;一家探讨人形合作研发&#xff0c;一家是客户1.15-1.16两天在南京&#xff0c;和同事姚博士、合作商一块接待一机器人集团客户 客户表示高校偏科研&#xff0c;但我们…

处理没有提示的字符串、计算相隔天数应用题

正常情况下&#xff0c;小云每天跑 1 千米。如果某天是周一或者月初&#xff08;1 日&#xff09;&#xff0c;为了激励自己&#xff0c;小云要跑 2 千米。如果同时是周一或月初&#xff0c;小云也是跑 2 千米。 小云跑步已经坚持了很长时间&#xff0c;从 1990 年 1 月 1 日周…