一、代码题
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("程序结束");