用数组中的最小值替换最大值

时间:2018-07-01 06:38:18

标签: java arrays

首先输入n个数字,然后输入数字本身,然后找到最大值和最小值,最后用最小的1代替最大值。但是此代码在第一个测试用例(5 1 3 3 3 4)上不起作用,它返回3 3 3 33。但是在第二个测试用例(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();
        }
    }
}    

}

2 个答案:

答案 0 :(得分:0)

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

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);数组。至少对我来说,包括从扫描仪读取的所有内容都可以正常工作。

祝你好运!

答案 1 :(得分:0)

Bro,我刚刚对您的代码进行了交叉检查,发现 int[] marks = new int[sc.nextInt()] 它只需要一个整数,因此数组的大小将输入的第一个整数。因此,要克服这一点,您应该预先定义数组的大小 OR ,可以使用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];
}

这将为您提供帮助。编码愉快:)