自学内容网 自学内容网

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)!