「Java案例」输出最大的数及其出现的次数

60 阅读5分钟

案例解析

基础实现案例

编写一个程序,输入1个整数,如果该整数不是0,则继续输入,直到输入0时为止。查找这一组数中最大的数,并输出最大的数出现的次数。如果输入的第一个数为0,就输出:“Only 0 is inputed”。

# 源文件保存为“FindMaxAndCount.java”
import java.util.Scanner;

public class FindMaxAndCount {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入整数(输入0结束):");
        int firstNum = scanner.nextInt();
        
        if (firstNum == 0) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int max = firstNum;
        int count = 1;
        
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) {
                break;
            }
            
            if (num > max) {
                max = num;
                count = 1;
            } else if (num == max) {
                count++;
            }
        }
        
        System.out.println("最大的数是: " + max);
        System.out.println("它出现的次数是: " + count);
    }
}

运行结果 直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):5
4
5
2
0
最大的数是: 5
它出现的次数是: 2

代码解析:

  • 先用Scanner获取第一个输入的数字
  • 如果第一个数就是0,直接输出提示信息并结束程序
  • 初始化max为第一个数,count初始化为1
  • 进入无限循环,不断读取输入的数字
  • 遇到0就跳出循环
  • 每次遇到比当前max更大的数,就更新max并重置count
  • 遇到和max相等的数,count加1
  • 最后输出结果

这个程序能正确处理各种情况,包括所有数都相同、第一个数就是最大的、或者后面出现更大的数等情况。

找出最小数及其出现次数

稍微修改一下就能实现找最小数的功能:

# 源文件保存为“FindMinAndCount.java”
import java.util.Scanner;

public class FindMinAndCount {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入整数(输入0结束):");
        int firstNum = scanner.nextInt();
        
        if (firstNum == 0) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int min = firstNum;
        int count = 1;
        
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) break;
            
            if (num < min) {
                min = num;
                count = 1;
            } else if (num == min) {
                count++;
            }
        }
        
        System.out.println("最小的数是: " + min);
        System.out.println("它出现的次数是: " + count);
    }
}

直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):1
6
1
0
最小的数是: 1
它出现的次数是: 2

变化之处:

  1. 把max改成了min
  2. 比较条件从>变成了<
  3. 其他逻辑完全一致

同时找出最大和最小数

有时候我们需要同时获取最大和最小值:

# 源文件保存为“FindBoth.java”
import java.util.Scanner;

public class FindBoth {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入整数(输入0结束):");
        int firstNum = scanner.nextInt();
        
        if (firstNum == 0) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int max = firstNum;
        int min = firstNum;
        int maxCount = 1;
        int minCount = 1;
        
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) break;
            
            if (num > max) {
                max = num;
                maxCount = 1;
            } else if (num == max) {
                maxCount++;
            }
            
            if (num < min) {
                min = num;
                minCount = 1;
            } else if (num == min) {
                minCount++;
            }
        }
        
        System.out.println("最大的数是: " + max + ",出现次数: " + maxCount);
        System.out.println("最小的数是: " + min + ",出现次数: " + minCount);
    }
}

运行结果 直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):5
8
4
8
4
4
0
最大的数是: 8,出现次数: 2
最小的数是: 4,出现次数: 3

改进点:

  • 同时维护max和min两个变量
  • 分别统计它们的出现次数
  • 每次输入都要同时更新两套逻辑

使用数组存储后再处理

有时候我们需要保留所有输入数据,可以先用数组存储:

# 源文件保存为“ArrayVersion.java”
import java.util.ArrayList;
import java.util.Scanner;

public class ArrayVersion {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<>();
        
        System.out.print("请输入整数(输入0结束):");
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) break;
            numbers.add(num);
        }
        
        if (numbers.isEmpty()) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int max = numbers.get(0);
        int count = 1;
        
        for (int i = 1; i < numbers.size(); i++) {
            int num = numbers.get(i);
            if (num > max) {
                max = num;
                count = 1;
            } else if (num == max) {
                count++;
            }
        }
        
        System.out.println("最大的数是: " + max);
        System.out.println("它出现的次数是: " + count);
    }
}

运行结果 直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):5
4
5
2
0
最大的数是: 5
它出现的次数是: 2

特点:

  • 使用ArrayList动态存储所有输入
  • 处理完输入后再进行计算
  • 适合需要多次处理同一组数据的情况

实践练习题

处理负数情况

修改程序,使其能够正确处理所有负数输入的情况。

参考代码:

# 源文件保存为“NegativeNumbers.java”
import java.util.Scanner;

public class NegativeNumbers {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入整数(输入0结束):");
        int firstNum = scanner.nextInt();
        
        if (firstNum == 0) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int max = firstNum;
        int count = 1;
        
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) break;
            
            if (num > max) {
                max = num;
                count = 1;
            } else if (num == max) {
                count++;
            }
        }
        
        System.out.println("最大的数是: " + max);
        System.out.println("它出现的次数是: " + count);
    }
}

运行结果 直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):1
-1
1
-1
0
最大的数是: 1
它出现的次数是: 2

说明: 实际上原来的代码已经能正确处理负数了,因为比较逻辑num > max对负数同样适用。这个练习主要是让同学们思考验证一下。

找出第二大的数

修改程序,使其能够找出第二大的数及其出现次数。

参考代码:

# 源文件保存为“SecondLargest.java”
import java.util.Scanner;

public class SecondLargest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入整数(输入0结束):");
        int firstNum = scanner.nextInt();
        
        if (firstNum == 0) {
            System.out.println("Only 0 is inputed");
            return;
        }
        
        int max = firstNum;
        int secondMax = Integer.MIN_VALUE;
        int maxCount = 1;
        int secondMaxCount = 0;
        
        while (true) {
            int num = scanner.nextInt();
            if (num == 0) break;
            
            if (num > max) {
                secondMax = max;
                secondMaxCount = maxCount;
                max = num;
                maxCount = 1;
            } else if (num == max) {
                maxCount++;
            } else if (num > secondMax) {
                secondMax = num;
                secondMaxCount = 1;
            } else if (num == secondMax) {
                secondMaxCount++;
            }
        }
        
        if (secondMaxCount == 0) {
            System.out.println("没有第二大的数");
        } else {
            System.out.println("第二大的数是: " + secondMax);
            System.out.println("它出现的次数是: " + secondMaxCount);
        }
    }
}

运行结果 直接输入数字0

请输入整数(输入0结束):0
Only 0 is inputed

输入一系列数字,以0结束

请输入整数(输入0结束):5
8
6
8
4
5
0
第二大的数是: 6
它出现的次数是: 1