Java 将数组中的最大值替换为最小值
首先输入n个数字,然后是数字本身,然后找到最大值和最小值,最后用最小值替换最大值。但是这段代码在第一个测试用例51334中不起作用,它返回333。但是它在第二个测试用例8 5 4 2 2 5上工作。这个代码有什么问题?我已经检查了检查最大值和最小值的循环,没有问题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.
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的初始值。