java - 用数组中的最小值替换最大值
问题描述
第一个输入是 n 个数字,然后是数字本身,然后找到最大值和最小值,最后用最小值替换最大值。但是此代码不适用于第一个测试用例( 5 1 3 3 3 4 ),它返回 3 3 3 3 3。但它适用于第二个测试用例( 8 5 4 2 2 4 2 2 5 )。这段代码有什么问题?我检查了检查最大值和最小值的循环,没有错。
import java.util.Scanner;
class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int[] marks = new int[sc.nextInt()];
int max = 0;
int min = 100;
for(int i=0;i<marks.length;i++){
marks[i] = sc.nextInt();
}
for(int i=0;i<marks.length;i++){
if(min>marks[i]){
min = marks[i];
}
}
for(int i=0;i<marks.length;i++){
if(max<marks[i]){
max = marks[i];
}
}
for(int i=0;i<marks.length;i++){
if(marks[i]==max){
marks[i]=min;
}
}
for(int i=0;i<marks.length;i++){
if(i!=marks.length-1){
System.out.print(marks[i]+" ");
}else{
System.out.println(marks[i]);
System.out.println();
}
}
}
}
解决方案
我认为您的代码应该可以正常工作。我对其进行了重构,使其更健壮、更易读,并更容易以可重现的方式触发测试用例:
public static void main(String[] args) {
int[] first = new int[]{1, 3, 3, 3, 4};
replaceMaxWithMin(first);
System.out.println("******************************************");
int[] second = new int[]{5, 4, 2, 2, 4, 2, 2, 5};
replaceMaxWithMin(second);
System.out.println("******************************************");
int[] fromScanner = readFromScanner();
System.out.println("From scanner: " + Arrays.toString(fromScanner));
replaceMaxWithMin(fromScanner);
}
private static void replaceMaxWithMin(int[] marks) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int mark : marks) {
min = Math.min(min, mark);
max = Math.max(max, mark);
}
for (int i = 0; i < marks.length; i++) {
if (marks[i] == max) {
marks[i] = min;
}
}
for (int i = 0; i < marks.length; i++) {
if (i != marks.length - 1) {
System.out.print(marks[i] + " ");
} else {
System.out.println(marks[i]);
System.out.println();
}
}
}
private static int[] readFromScanner() {
Scanner sc = new Scanner(System.in);
int[] marks = new int[sc.nextInt()];
for(int i=0;i<marks.length;i++){
marks[i] = sc.nextInt();
}
return marks;
}
在我的 Java 8 JVM 上运行的输出:
1 3 3 3 1
******************************************
2 4 2 2 4 2 2 2
******************************************
5 1 3 3 3 4 <--- what I typed into the console
From scanner: [1, 3, 3, 3, 4]
1 3 3 3 1
所以替换代码 itelf 工作正常。您输入的数据可能存在一些奇怪的问题。您也可以println
在运行算法之前使用Arrays.toString(marks);
. 至少对我来说,包括从扫描仪读取在内的一切都可以正常工作。
祝你好运!
推荐阅读
- android - 来自模块的注释依赖不起作用
- reactjs - 如何更改数组中对象中的数组?
- c# - 如何将json对象反序列化为c#
- laravel - 如何在 Laravel 中使用 Getter Setter 方法?以及如何使用 Eloquent 模型添加字段?
- yii2 - 如何在表单中传递用户 ID
- angular - 在 onIdleStart 内部不调用 ajax
- c# - 如何在 ASP.NET Identity 中使用 OnModelCreating 添加管理员用户?
- c++ - 无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI)
- hyperledger - 用于移动应用创建钱包和离线签名的 Hyperledger Fabric
- c# - Microsoft Teams 会议中的交互级别检查