首先输入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();
}
}
}
}
答案 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];
}
这将为您提供帮助。编码愉快:)