首页 > 解决方案 > 用数组中的最小值替换最大值

问题描述

第一个输入是 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();
        }
    }
}    

}

标签: javaarrays

解决方案


我认为您的代码应该可以正常工作。我对其进行了重构,使其更健壮、更易读,并更容易以可重现的方式触发测试用例:

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);. 至少对我来说,包括从扫描仪读取在内的一切都可以正常工作。

祝你好运!


推荐阅读