Java 将数组中的最大值替换为最小值

Java 将数组中的最大值替换为最小值,java,arrays,Java,Arrays,首先输入n个数字,然后是数字本身,然后找到最大值和最小值,最后用最小值替换最大值。但是这段代码在第一个测试用例51334中不起作用,它返回333。但是它在第二个测试用例8 5 4 2 2 5上工作。这个代码有什么问题?我已经检查了检查最大值和最小值的循环,没有问题 import java.util.Scanner; class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.

首先输入n个数字,然后是数字本身,然后找到最大值和最小值,最后用最小值替换最大值。但是这段代码在第一个测试用例51334中不起作用,它返回333。但是它在第二个测试用例8 5 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工作正常。您输入的数据可能有一些奇怪的问题。您还可以在使用Arrays.toStringmarks;运行算法之前在数组中打印;。至少对我来说,一切都很好,包括从扫描仪上读取数据


祝你好运

兄弟,我刚刚核对了你的代码,在 int[]标记=新int[sc.nextInt] 它只需要一个整数,因此数组的大小将是输入的第一个整数。因此,为了克服这个问题,您应该预定义数组的大小,或者为了更方便,可以使用ArrayList

我这边的一点建议是,当你想从数组元素中找到最大值或最小值时,你可以将最小值和最大值变量设置为

min = arr[0];
max = arr[0];
for(int i=0;i<n;i++){
if(min>arr[i])
  min = arr[i];
if(max<arr[i])
  max = arr[i];
}

这对你有帮助。快乐编码:

您的第一个测试用例在我的机器上运行时返回1 3 1。嘿,这对我来说很好。代码很好。好吧,这是我的机器出的问题。顺便说一下,我用的是崇高的文字。非常感谢你!对不起,你的第一句话错了。它读取第一个输入的5或8,并用该大小初始化数组。更好。但是仍然没有必要预先定义数组的大小,或者因为这正是提问者所做的;-是的,我也希望有一个数组列表,这样你就不需要输入数字作为第一个输入:-好的,但我已经提到,为了更方便用户,因为用户不必在代码中反复更改数组:OP的代码中没有定义n,您的代码将失败,如果用户输入的元素数为0。最好分别使用Integer.MAX_值和Integer.MIN_值作为MIN和MAX的初始值。