Java复习第二天

devtools/2025/1/20 2:51:30/
一、代码题

1.合并两个有序数组

(1)题目

给你两个按 非递减顺序 排列的整数数组 nums1和 nums2,另有两个整数 m和n,分别表示nums1和nums2 中的元素数目。 请你合并nums2到 nums1中,使合并后的数组同样按非递减顺序排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。

注意,因为m=0,所以nums1 中没有元素。nums1中仅存的0仅仅是为了确保合并结果可以顺利存放到nums1中。

  • 示例1: 输入:nums1=[1,2,3,0,0,0],m=3,nums2 =[2,5,6],n =3 输出:[1,2,2,3,5,6] 解释:需要合并[1,2,3]和[2,5,6]。 合并结果是[1,2,2,3,5,6],其中斜体加粗标注的为nums1中的元素。
  • 示例2: 输入:nums1=[1],m=1,nums2=[],n=0 输出:[1] 解释:需要合并[1]和[]。合并结果是[1]。
  • 示例3: 输入:nums1=[0],m=0,nums2=[1],n=1 输出:[1] 解释:需要合并的数组是[]和[1]。合并结果是[1]。

(2)思路实现

a.题目思路

  • 初始化三个指针:p1 指向 nums1 中的有效元素的最后一个位置 (m - 1),p2 指向 nums2 的最后一个位置 (n - 1),p 指向 nums1 的最后一个位置 (m + n - 1)。
  • 比较 nums1[p1] 和 nums2[p2] 的大小,将较大的元素放到 nums1[p] 位置,并移动相应的指针。
  • 重复步骤 2,直到 p1 或 p2 小于 0。
  • 如果 p2 还有剩余元素(即 p1 已经小于 0),将 nums2 中剩余的元素复制到 nums1 中。如果 p1 还有剩余元素,则不需要处理,因为它们已经在 nums1 的正确位置。

b.代码思路

  • 初始化三个指针 p1, p2, p 分别指向 nums1 和 nums2 的末尾以及合并后数组的末尾。
  • 使用 while 循环,比较 nums1[p1] 和 nums2[p2] 的大小,将较大的元素放到 nums1[p] 位置,并移动相应的指针。
  • 如果 p2 还有剩余元素,继续将 nums2 中剩余的元素复制到 nums1 中。

(3)代码实现

java">package com.thor.test;public class Demo {public static void main(String[] args) {//创建Solution对象的实例Solution solution = new Solution();//示例1:输入:nums1=[1,2,3,0,0,0],m=3,nums2 =[2,5,6],n =3 输出:[1,2,2,3,5,6]//解释:需要合并[1,2,3]和[2,5,6]。合并结果是[1,2,2,3,5,6],其中斜体加粗标注的为nums1中的元素。int[] nums1 = {1, 2, 3, 0, 0, 0};int[] nums2 = {2, 5, 6};solution.merge(nums1, 3, nums2, 3);for (int i = 0; i < nums1.length; i++) {System.out.print(nums1[i]+" ");}//示例2:输入:nums1=[1],m=1,nums2=[],n=0 输出:[1]//解释:需要合并[1]和[]。合并结果是[1]。int[] nums3 = {1};int[] nums4 = {};solution.merge(nums3, 1, nums4, 0);for (int i = 0; i < nums3.length; i++) {System.out.print(nums3[i]+" ");}//示例3:输入:nums1=[0],m=0,nums2=[1],n=1 输出:[1]//解释:需要合并的数组是[]和[1]。合并结果是[1]。int[] nums5 = {0};int[] nums6 = {1};solution.merge(nums5, 0, nums6, 1);for (int i = 0; i < nums5.length; i++) {System.out.print(nums5[i]+" ");}//注意,因为m=0,所以nums1 中没有元素。nums1 中仅存 的 0仅仅是为了确保合并结果可以顺利存放到nums1中.}
}
class Solution{/*** @description:* @author: Allen* @date: 2025/1/14 9:59* @param: [nums1, m, nums2, n] //nums1长度为m+n,m为nums1中元素个数,nums2长度为n+m,n为nums2中元素个数* @return:**/public  void  merge(int[] nums1,int m,int[] nums2,int n){//初始化指针p1,指向nums1的有效元素的最后一个位置int p1=m-1;//初始化指针p2,指向nums2的最后一个位置int p2=n-1;//初始化指针p,指向合并后数组的最后一个位置int p=m+n-1;//当p1和p2都大于等于0时候,继续比较和合并while(p1>=0&&p2>=0){//如果nums1[p1]>nums2[p2],则将nums1[p1]放到nums1[p]的位置if(nums1[p1]>nums2[p2]){nums1[p]=nums1[p1];//移动p1指针p1--;}else {//nums2[p2]放到nums1[p]的位置nums1[p]=nums2[p2];//移动p2指针p2--;}//移动p指针p--;}//如果p2还有剩余元素,继续将nums2中剩余的元素复制到nums1中while(p2>=0){nums1[p]=nums2[p2];p2--;p--;}}
}

2.二叉树的中序遍历

(1)题目

给定一个二叉树的根节点 root,返回它的中序遍历。

(2)实现思路

a.题目思路

中序遍历(Inorder Traversal)是一种二叉树的遍历方法,其顺序为:左子树 -> 根节点 -> 右子树。对于给定的二叉树,我们需要按照这个顺序访问每个节点,并将节点的值存储在一个列表中。

b.代码思路

  • 递归终止条件:如果当前节点为空,直接返回。
  • 递归遍历左子树:首先递归地对左子树进行中序遍历。
  • 访问根节点:将当前节点的值添加到结果列表中。
  • 递归遍历右子树:最后递归地对右子树进行中序遍历。

(3)代码实现

java">package com.thor.test;import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) {// 创建Solution对象的实例Solution solution = new Solution();// 示例1: 输入: root = [1, null, 2, 3]// 输出: [1, 3, 2]TreeNode root1 = new TreeNode(1);root1.right = new TreeNode(2);root1.right.left = new TreeNode(3);List<Integer> result1 = solution.inorderTraversal(root1);System.out.println("示例1结果: " + result1); // 输出: [1, 3, 2]// 示例2: 输入: root = []// 输出: []TreeNode root2 = null;List<Integer> result2 = solution.inorderTraversal(root2);System.out.println("示例2结果: " + result2); // 输出: []// 示例3: 输入: root = [1]// 输出: [1]TreeNode root3 = new TreeNode(1);List<Integer> result3 = solution.inorderTraversal(root3);System.out.println("示例3结果: " + result3); // 输出: [1]}
}
//Definition for a binary tree node.
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}
class Solution {public List<Integer> inorderTraversal(TreeNode root) {// 创建一个列表用于存储中序遍历的结果List<Integer> result = new ArrayList<>();// 调用递归方法进行中序遍历inorderHelper(root, result);// 返回结果列表return result;}/*** 辅助递归方法,用于执行中序遍历* @param node 当前遍历的节点* @param result 存储遍历结果的列表*/private void inorderHelper(TreeNode node, List<Integer> result) {// 如果当前节点为空,直接返回if (node == null) {return;}// 递归遍历左子树inorderHelper(node.left, result);// 访问当前节点,将节点值添加到结果列表中result.add(node.val);// 递归遍历右子树inorderHelper(node.right, result);}
}
二、选择结构

1.if else 结构

  • if(条件为真){
  • 代码片段1
  • }else{
  • 代码片段2
  • }
java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的成绩:");
int score = scanner.nextInt();
if (score >= 90) {System.out.println("优秀");
}else {System.out.println("不及格");
}

2.if 结构

  • if(条件){
  • 代码片段1
  • }
java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的成绩:");
int score = scanner.nextInt();
if (score >= 90) {System.out.println("优秀");
}
System.out.println("程序结束");

3.if else if else 结构

  • if(条件 1){
  • 代码片段 1
  • }else if(条件 2){
  • 代码片段 2
  • }else{
  • 代码片段 3
  • }......
java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的成绩:");
int score = scanner.nextInt();
if (score >= 90) {System.out.println("优秀");
} else if (score >= 80) {System.out.println("良好");
}else {System.out.println("不及格");
}
三、逻辑运算符

1. 与:&&,只要有一个假,结果为假

2. 或:||,只要有一个为真,结果为真

3. 非:原来真,现在假 ;原来假,现在真

四、幸运抽奖

1.规则:会员号的百位数字等于产生的随机数字即为幸运会员

2.实现思路

  • 产生随机数
  • 从控制台接收一个 4 位会员号
  • 分解获得百位数
  • 判断是否是幸运会员

3.产生随机数(0-9)的方法

int random=int(Math.random()*10);

  • Math.random()产生一个左闭右开之间的一个小数,即 [0.0-1.0)
  • 目标产生 0-9 之间的数,一共 10 个
  • [0.0-1.0)*10——>[0.0-10.0)——>强转[0-10)

4.代码实现

java">Scanner scanner = new Scanner(System.in);
System.out.println("辛运抽奖\n");
System.out.print("请输入4位会员号:");
int code = scanner.nextInt();
int baiwei = code / 100 % 10;
int luck = (int) Math.random() * 10;
System.out.println("辛运数字是:" + luck);
if (luck == baiwei) {System.out.println("恭喜你中奖了");
} else {System.out.println("很遗憾,没有中奖");
}
五、字符串比较和嵌套 if

用代码实现以下效果

java">Scanner scanner = new Scanner(System.in);
System.out.println("请输入是否要充值会员(y/n):");
String result = scanner.next();
System.out.println("请输入购物金额");
int money = scanner.nextInt();
double discount = 1.0;
if(result.equals("y")){if (money>200){discount = 0.75;}else {discount = 0.8;}
}else {if(money>100){discount = 0.9;}
}
System.out.println("应付金额为:"+money*discount);
六、switch结构

1.格式

  • switch(条件){
  • case 1:
  • 代码块 1
  • break;
  • case 2:
  • 代码块 2
  • break;
  • default:
  • 代码块 3
  • break;
  • }

2.条件

  • 适用于等值判断,不适合范围判断

3.代码实现

需求:Allen参加计算机编程大赛,如果获得第一名,奖励 1000 元;如果获得第二名,奖励 500 元;如果获得第三名,奖励 300 元;否则,不给任何奖励。

java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入名次:");
int rank = scanner.nextInt();
switch (rank){case 1:System.out.println("恭喜你,获得1000元");break;case 2:System.out.println("恭喜你,获得500元");break;case 3:System.out.println("恭喜你,获得300元");break;default:System.out.println("很遗憾,无任何奖励");break;
}

4.switch 透传

当某个case没有使用break语句来终止时,程序会继续执行后续的case语句,直到遇到break语句或者switch语句结束。

java">Scanner scanner = new Scanner(System.in);
System.out.println("请输入星期几(1-7):");
int dayOfWeek = scanner.nextInt();
String dayType;
switch (dayOfWeek) {case 1:dayType ="星期一";break;case 2:dayType ="星期二";break;case 3:case 4:case 5:dayType ="工作日";break;case 6:dayType ="星期六";break;case 7:dayType ="星期天";break;default:dayType ="无效输入";
}System.out.println("今天是: " + dayType);
七、商品换购

请输入消费金额:

是否参加优惠换购活动:

1:满50元,加2元换购百事可乐饮料1瓶

2:满100元,加3元换购500m1可乐一瓶

3:满100元,加10元换购5公斤面粉

4:满200元,加10元可换购1个苏泊尔炒菜锅

5:满200元,加20元可换购欧莱雅爽肤水一瓶

0:不换购

请选择:

本次消费总金额:

成功换购:

java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入消费金额:");
double money = scanner.nextDouble();
System.out.println("是否换购:");
System.out.println("1:满50元,加2元换购产品1");
System.out.println("2:满100元,加3元换购产品2");
System.out.println("3:满100元,加10元换购产品3");
System.out.println("4:满200元,加10元换购产品4");
System.out.println("5:满200元,加20元换购产品5");
System.out.println("0:不换购");
System.out.print("请选择:");
int choose = scanner.nextInt();
String goods = "不换购";
switch (choose) {case 1:if (money >= 50) {money += 2;goods = "产品1";}break;case 2:if (money >= 100) {money += 3;goods = "产品2";}break;case 3:if (money >= 100) {money += 10;goods = "产品3";}break;case 4:if (money >= 200) {money += 10;goods = "产品4";}break;case 5:if (money >= 200) {money += 20;goods = "产品5";}break;
}
System.out.println("消费金额: "+money);
System.out.println("成功换购: "+goods);
八、循环结构

1.while

  • while(条件){
  • 循环内容;
  • 循环条件;
  • }
java">int i = 1 , sum = 0;
while(i <= 100){sum+=i;i++;
}
System.out.println("和: "+sum);

2.dowhile

  • do{
  • 循环内容;
  • 循环条件;
  • }while(条件);
java">int i = 1 , sum = 0;
do {sum+=i;i++;
}while (i<=100);
System.out.println("和: "+sum);

3.for

(1)特点:循环次数固定用 for,如果我们知道循环至少走一次的话,选择 dowhile 循环而不是 while 循环

(2)结构

  • for(声明初始化循环变量;条件;修改循环变量){
  • 循环体
  • }

(3)代码示例

java">int sum=0;
for(int i =0;i<=100;i++){sum+=i;
}
System.out.println("和:"+sum);

(4)五门功课的成绩

输入学生姓名: Allen

请输入5门功课中第1门课的成绩: 85

请输入5门功课中第2门课的成绩:65

请输入5门功课中第3门课的成绩:75

请输入5门功课中第4门课的成绩: 99

请输入5门功课中第5门课的成绩:87

Allen 的平均分是:82.2

java">Scanner scanner = new Scanner(System.in);
System.out.print("请输入学生姓名:");
String name = scanner.next();
int sum = 0;
for(int i = 0;i<5;i++){System.out.print("请输入第"+(i+1)+"门课的成绩:");sum+= scanner.nextInt();
}
System.out.println(name+"同学的平均成绩为:"+sum/5.0);

(5)特殊写法——死循环——for( ; ; ){}

java">Scanner scanner = new Scanner(System.in);
for (;;){System.out.println("1");
}
System.out.println("2");//错误,死循环出不来,到不了这里

(6)加法表

java">for (int i=0,j=6;i<=6;i++,j--){System.out.println(i+"+"+j+"="+(i+j));
}
九、购物结算

1.题目如下

java">Scanner scanner = new Scanner(System.in);
System.out.println("购物结算");
System.out.println("**********");
System.out.println("请选择购物的商品编号:");
System.out.println("1.T恤,2.网球鞋,3.网球拍");
System.out.println("**********");
String continues = "y";
while(continues.equals("y")){System.out.print("请输入商品编号:");int select = scanner.nextInt();switch(select){case 1:System.out.println("T恤,100元");break;case 2:System.out.println("网球鞋,200元");break;case 3:System.out.println("网球拍,300元");break;default:System.out.println("没有该商品");break;}System.out.print("是否继续(y/n)");continues = scanner.next();
}
System.out.println("程序结束");

2. 注意:如果我们知道循环至少走一次的话,选择 dowhile 循环而不是 while 循环

代码改正

java">Scanner scanner = new Scanner(System.in);
System.out.println("购物结算");
System.out.println("**********");
System.out.println("请选择购物的商品编号:");
System.out.println("1.T恤,2.网球鞋,3.网球拍");
System.out.println("**********");
String continues = "y";
do{System.out.print("请输入商品编号:");int select = scanner.nextInt();switch(select){case 1:System.out.println("T恤,100元");break;case 2:System.out.println("网球鞋,200元");break;case 3:System.out.println("网球拍,300元");break;default:System.out.println("没有该商品");break;}System.out.print("是否继续(y/n)");continues = scanner.next();
}while (continues.equals("y"));
System.out.println("程序结束");

3.类名和全类名

类名:Scanner

全类名:Java.util.Scanner

十、摄氏华氏对照表

需求:使用do-while实现:输出摄氏温度与华氏温度的对照表,要求它从摄氏温度0度到250度,每隔20度为一项,对照表中的条目不超过10条。转换关系:华氏温度=摄氏温度*9/5.0+3

java">double huashi,sheshi = 0;
int count = 0;
do {huashi=sheshi*9/5.0+32;System.out.println(huashi+"vs"+sheshi);sheshi+=20;count++;
}while (sheshi<=250&&count<=10);
十、break 和 continue

1.break:结束当前循环

java">Scanner scanner = new Scanner(System.in);
int sum = 0;
for (int i =0;i<=5;i++){System.out.print("成绩: ");int score = scanner.nextInt();if (score>=0){System.out.println("成绩合格");}else {break;}
}
System.out.println("结束");

2.continue:忽略不符合

java">Scanner scanner = new Scanner(System.in);
int sum = 0;
for (int i =0;i<=5;i++){System.out.print("成绩: ");int score = scanner.nextInt();if (score>=0){System.out.println("成绩合格");}else {continue;}sum+=score;
}
System.out.println("和: "+sum);
十一、录入客户信息

1.需求

MyShopping管理系统> 客户信息管理> 添加客户信息

请输入会员号(<4位整数>):1008

请输入会员生日(月/日<用两位整数表示>):05/06

请输入会员积分:3000

您录入的会员信息是:1080 05/06 3000

请输入会员号(<4位整数>):1236

请输入会员生日(月/日<用两位整数表示>):11/25

请输入会员积分:1000

您录入的会员信息是:1236 11/25 1000

请输入会员号(<4位整数>):1501

请输入会员生日(月/日<用两位整数表示>):12/05

请输入会员积分:300

您录入的会员信息是:1501 12/05 300

程序结束!

2.代码实现

java">Scanner scanner = new Scanner(System.in);
System.out.println("增加客户信息");
for (int i=0;i<3;i++){System.out.print("会员号《4位》: ");int number = scanner.nextInt();if (number<1000||number>9999){continue;}System.out.print("生日《mm/dd》: ");String birth = scanner.next();if (birth.length()!=5){continue;}System.out.print("积分: ");int score = scanner.nextInt();if (score<0){continue;}System.out.println("会员信息是: "+number+"\t"+birth+"\t"+score);
}
System.out.println("程序结束");
十二、小数比较不能使用==或者!=

1. 代码展示

java">Scanner scanner = new Scanner(System.in);
System.out.print("小数1: ");
double decimal1 = scanner.nextDouble();
System.out.print("小数2: ");
double decimal2 = scanner.nextDouble();
System.out.print("小数3: ");
double decimal3 = scanner.nextDouble();
if (decimal1+decimal2==decimal3){System.out.println("相等");
}else {System.out.println("不相等");
}
System.out.println("程序结束");

2.用什么比较——加上精度

java">final double PRECISION = 0.00001;
Scanner scanner = new Scanner(System.in);
System.out.print("小数1: ");
double decimal1 = scanner.nextDouble();
System.out.print("小数2: ");
double decimal2 = scanner.nextDouble();
System.out.print("小数3: ");
double decimal3 = scanner.nextDouble();
if (decimal1+decimal2<=decimal3+PRECISION && decimal1+decimal2>=decimal3-PRECISION) {System.out.println("相等");
}else {System.out.println("不相等");
}
System.out.println("程序结束");

http://www.ppmy.cn/devtools/151983.html

相关文章

矩阵碰一碰发视频源码技术开发全解析,支持OEM

在当今数字化内容传播迅速发展的时代&#xff0c;矩阵碰一碰发视频功能以其便捷、高效的特点&#xff0c;为用户分享视频提供了全新的体验。本文将深入探讨矩阵碰一碰发视频源码的技术开发过程&#xff0c;从原理到实现&#xff0c;为开发者提供全面的技术指引。 一、技术原理 …

两个关于TCP/IP的问题

tcp的客户端是会随机选择一个端口连接到服务端的&#xff0c;那么如果在非常短的时间内&#xff0c;在客户端生产上百万个的tcp连接&#xff0c;会导致什么问题&#xff1f;出现这样的问题&#xff0c;在linux操作系统里面要怎么解决&#xff1f;在其他的操作系统里面又要怎么解…

简单组合逻辑

多路选择器 在多路数据传输过程中&#xff0c;能够将任意一路选出来的电路叫做数据选择器&#xff0c;也称多路选择器。对于一个具有2^n个输入和一个输出的多路选择器&#xff0c;有n个选择变量&#xff0c;多路选择器也是FPGA内部的一个基本资源&#xff0c;主要用于内部信号的…

中软高科鸿蒙Next身份证读卡SDK集成说明

导入har 项目中导入提供的开发包 readcardlibrary.har 鸿蒙next的NFC使用配置&#xff0c;请参考官方文档。 需要在EntryAbility 中添加NFC tag相关的监听。 在项目的 module.json5 文件中需要配置NFC的权限 "requestPermissions": [{"name": "o…

【进程与线程】前端进程与后端进程

在操作系统和计算机系统中&#xff0c;前端进程 和 后端进程 是两类不同的进程类型&#xff0c;主要根据进程的交互方式和运行特点来分类。 前端进程 前端进程 是指直接与用户交互的进程&#xff0c;通常负责处理用户输入、显示输出结果。它们通常运行在前台&#xff0c;用户…

【数据库】MySQL数据库SQL语句汇总

目录 1.SQL 通用语法 2.SQL 分类 2.1.DDL 2.2.DML 2.3.DQL 2.4.DCL 3.DDL 3.1.数据库操作 3.1.1.查询 3.1.2.创建 3.1.3.删除 3.1.4.使用 3.2.表操作 3.2.1.查询 3.2.2.创建 3.2.3.数据类型 3.2.3.1.数值类型 3.2.3.2.字符串类型 3.2.3.3.日期时间类型 3.2…

基于 Spring Boot、Vue 实现的调问开源问卷系统

是一款简单、高效、成熟、稳定、专业的开源问卷系统&#xff0c;自2012年启动至今经过9年的积累&#xff0c;已经形成一套完善的基于 JAVA WEB 的开源问卷表单解决方案。 &#x1f389;&#x1f389;&#x1f389; 企业版 全新的 企业版 已经发布&#xff0c;前后端分别采用 …

js高亮文本

高亮文本 const inputs ["这是一个普通文本&#xff0c;包含关键字测试。",<p style"font-size: 10px">这是一个<span>GVM</span> <strong>测试</strong>内容。</p>, ];const keywords ["测试", "G…