Java复习第二天
一、代码题
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)代码实现
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)代码实现
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
- }
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
- }
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
- }......
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.代码实现
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
用代码实现以下效果
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 元;否则,不给任何奖励。
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语句结束。
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:不换购
请选择:
本次消费总金额:
成功换购:
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(条件){
- 循环内容;
- 循环条件;
- }
int i = 1 , sum = 0;
while(i <= 100){
sum+=i;
i++;
}
System.out.println("和: "+sum);
2.dowhile
- do{
- 循环内容;
- 循环条件;
- }while(条件);
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)代码示例
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
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( ; ; ){}
Scanner scanner = new Scanner(System.in);
for (;;){
System.out.println("1");
}
System.out.println("2");//错误,死循环出不来,到不了这里
(6)加法表
for (int i=0,j=6;i<=6;i++,j--){
System.out.println(i+"+"+j+"="+(i+j));
}
九、购物结算
1.题目如下
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 循环
代码改正
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
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:结束当前循环
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:忽略不符合
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.代码实现
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. 代码展示
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.用什么比较——加上精度
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("程序结束");
原文地址:https://blog.csdn.net/m0_73757039/article/details/145234815
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!