Java,无数组或循环的第二大数量

Java,无数组或循环的第二大数量,java,max,Java,Max,我正在尝试创建一个程序,它返回第二个最大值,而不使用数组或循环。这似乎是不可能的,我考虑过计算最大数,然后创建一个没有最大数的新方法,但我不知道怎么做 public class Program { public static double max10(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10) {

我正在尝试创建一个程序,它返回第二个最大值,而不使用数组或循环。这似乎是不可能的,我考虑过计算最大数,然后创建一个没有最大数的新方法,但我不知道怎么做

public class Program {

    public static double max10(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10) {

        double r1,r2,r3,r4,r5,r6,r7,r8,r9;

        r1= max2(n1,n2);
        r2= max2(n3,n4);
        r3= max2(n5,n6);
        r4= max2(n7,n8);
        r5= max2(n9,n10);

        r6= max2(r1, r2);
        r7= max2(r3, r4);

        r8= max2(r6, r7);
        r9= max2( r8, r5 );

        return max2( r9, r5 );
    }


    public static double max2 (double n1, double n2) {

        return n1>=n2 ? n1 : n2;
    }

    public static void main(String[] args) {

       System.out.println(max10(1,2,3,4,5,6,7,8,9,10)==10);
       System.out.println(max10(1,2,3,4,5,45,7,8,9,10)==45);
       System.out.println(max10(1,2,3,4,5,6,7,8,10,10)==10);
    }
}
有什么窍门吗

  • 使用上面使用的方法查找最大值
  • 然后调用一个新方法max9,将原始值中的所有数字减去最大值,而不是返回该最大值

    public static double getSecondMaxValue(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10){
    
        double maxValue = max10(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10)
    
        double secondMaxValue = 0.0;
    
        if(maxValue == n1)
            secondMaxValue = max9(double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        else if (maxValue == n2)
            secondMaxValue = max9(double n1, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        else if (maxValue == n3)
             secondMaxValue = max9(double n1, double n2, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        ...
        ...
        else if (maxValue == n10)
             secondMaxValue = max9(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9);
    
        return secondMaxValue;
    
    }
    
    
    public static double max9(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9) {
    
        double r1,r2,r3,r4,r5,r6,r7,r8,r9;
    
        r1= max2(n1,n2);
        r2= max2(n3,n4);
        r3= max2(n5,n6);
        r4= max2(n7,n8);
        r5= n9;
    
        r6= max2(r1, r2);
        r7= max2(r3, r4);
    
        r8= max2(r6, r7);
        r9= max2( r8, r5 );
    
        return max2( r9, r5 );
    }
    
  • 使用上面使用的方法查找最大值
  • 然后调用一个新方法max9,将原始值中的所有数字减去最大值,而不是返回该最大值

    public static double getSecondMaxValue(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10){
    
        double maxValue = max10(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10)
    
        double secondMaxValue = 0.0;
    
        if(maxValue == n1)
            secondMaxValue = max9(double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        else if (maxValue == n2)
            secondMaxValue = max9(double n1, double n3, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        else if (maxValue == n3)
             secondMaxValue = max9(double n1, double n2, double n4,double n5, double n6, double n7, double n8, double n9, double n10);
        ...
        ...
        else if (maxValue == n10)
             secondMaxValue = max9(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9);
    
        return secondMaxValue;
    
    }
    
    
    public static double max9(double n1, double n2, double n3, double n4,double n5, double n6, double n7, double n8, double n9) {
    
        double r1,r2,r3,r4,r5,r6,r7,r8,r9;
    
        r1= max2(n1,n2);
        r2= max2(n3,n4);
        r3= max2(n5,n6);
        r4= max2(n7,n8);
        r5= n9;
    
        r6= max2(r1, r2);
        r7= max2(r3, r4);
    
        r8= max2(r6, r7);
        r9= max2( r8, r5 );
    
        return max2( r9, r5 );
    }
    

  • 解决方案是将10个变量减少为最大值对。 10个值将得到5对最大值

    从5对最大值,我们将其减少到2对最大值+1值

    这只给出了3个值-最大值、第二大值和随机值

    对于3个值,为了得到第二大值,我们将所有3个值相加,并从中扣除最大值和最小值:

    public static double max10(double n1, double n2, double n3, double n4, double n5, double n6, double n7, double n8, double n9, double n10){
    
        double a = max( max(n1, n2), max(n3, n4));
        double b = max( max(n5, n6), max(n7, n8));
        double c = max(n9, n10);
        return (a + b + c) - max(max(a, b), c) - min(min(a, b), c); 
    }
    
    public static double min (double n1, double n2) {
    
        return n1<n2 ? n1 : n2;
    }
    
    public static double max10(双n1、双n2、双n3、双n4、双n5、双n6、双n7、双n8、双n9、双n10){
    双a=最大值(最大值(n1,n2),最大值(n3,n4));
    双b=最大值(最大值(n5,n6),最大值(n7,n8));
    双c=最大值(n9,n10);
    返回(a+b+c)-最大值(最大值(a,b),c)-最小值(最小值(a,b),c);
    }
    公共静态双分钟(双n1,双n2){
    
    return n1解决方案是将10个变量减少为一对最大值。 10个值将得到5对最大值

    从5对最大值,我们将其减少到2对最大值+1值

    这只给出了3个值-最大值、第二大值和随机值

    对于3个值,为了得到第二大值,我们将所有3个值相加,并从中扣除最大值和最小值:

    public static double max10(double n1, double n2, double n3, double n4, double n5, double n6, double n7, double n8, double n9, double n10){
    
        double a = max( max(n1, n2), max(n3, n4));
        double b = max( max(n5, n6), max(n7, n8));
        double c = max(n9, n10);
        return (a + b + c) - max(max(a, b), c) - min(min(a, b), c); 
    }
    
    public static double min (double n1, double n2) {
    
        return n1<n2 ? n1 : n2;
    }
    
    public static double max10(双n1、双n2、双n3、双n4、双n5、双n6、双n7、双n8、双n9、双n10){
    双a=最大值(最大值(n1,n2),最大值(n3,n4));
    双b=最大值(最大值(n5,n6),最大值(n7,n8));
    双c=最大值(n9,n10);
    返回(a+b+c)-最大值(最大值(a,b),c)-最小值(最小值(a,b),c);
    }
    公共静态双分钟(双n1,双n2){
    
    return n1这里有一点不同的方法。我不认为它更短,但我更容易说服自己它是正确的

    public class SecondMaxFinder {
    
        private double greatest;
        private double secondGreatest;
    
        public SecondMaxFinder(double n1, double n2, double n3, double n4,double n5, 
                double n6, double n7, double n8, double n9, double n10) {
            if (n1 > n2) {
                greatest = n1;
                secondGreatest = n2;
            } else {
                greatest = n2;
                secondGreatest = n1;
            }
            fitCandidateIn(n3);
            fitCandidateIn(n4);
            fitCandidateIn(n5);
            fitCandidateIn(n6);
            fitCandidateIn(n7);
            fitCandidateIn(n8);
            fitCandidateIn(n9);
            fitCandidateIn(n10);
        }
    
        private void fitCandidateIn(double n) {
            if (n > greatest) {
                secondGreatest = greatest;
                greatest = n;
            } else if (n > secondGreatest) {
                secondGreatest = n;
            }
        }
    
        public double getSecondMax() {
            return secondGreatest;
        }
    
    }
    
    这样称呼:

        double secondMax = new SecondMaxFinder(7.7, 2.1, 3.7, 8.6, 8.6, 9.2, 6.8, 9.6, 8.6, 8.6)
                .getSecondMax();
        System.out.println(secondMax);
    

    这张打印的是
    9.2

    这里有一点不同的方法。我不认为它更短,但我更容易说服自己它是正确的

    public class SecondMaxFinder {
    
        private double greatest;
        private double secondGreatest;
    
        public SecondMaxFinder(double n1, double n2, double n3, double n4,double n5, 
                double n6, double n7, double n8, double n9, double n10) {
            if (n1 > n2) {
                greatest = n1;
                secondGreatest = n2;
            } else {
                greatest = n2;
                secondGreatest = n1;
            }
            fitCandidateIn(n3);
            fitCandidateIn(n4);
            fitCandidateIn(n5);
            fitCandidateIn(n6);
            fitCandidateIn(n7);
            fitCandidateIn(n8);
            fitCandidateIn(n9);
            fitCandidateIn(n10);
        }
    
        private void fitCandidateIn(double n) {
            if (n > greatest) {
                secondGreatest = greatest;
                greatest = n;
            } else if (n > secondGreatest) {
                secondGreatest = n;
            }
        }
    
        public double getSecondMax() {
            return secondGreatest;
        }
    
    }
    
    这样称呼:

        double secondMax = new SecondMaxFinder(7.7, 2.1, 3.7, 8.6, 8.6, 9.2, 6.8, 9.6, 8.6, 8.6)
                .getSecondMax();
        System.out.println(secondMax);
    

    这将打印
    9.2

    程序以查找第二个最大值,而不使用数组

    import java.util.Scanner;
    class p17_second_max {
        public static void getSecondLargest(int total) {
            int b=0,c=0;
            int temp=0;
            Scanner sc = new Scanner(System.in);
            for (int i = 1; i <= total; i++) {
                System.out.print("Enter The "+ i +"value: ");
                int a = sc.nextInt();
                if (a>b){
                    temp = a;
                    a = b;
                    b= temp;
                    if(b>c){
                        temp = b;
                        b = c;
                        c = temp;
                    }
                }
            }
            System.out.print("Second max Value is: "+b);
            sc.close();
        }
    
        public static void main(String args[]) {
            Scanner sc = new Scanner(System.in);
            System.out.print("Enter The total No. of input");
            int total = sc.nextInt();
            getSecondLargest(total);
        }
    }
    

    不使用数组查找第二个最大值的程序

    import java.util.Scanner;
    class p17_second_max {
        public static void getSecondLargest(int total) {
            int b=0,c=0;
            int temp=0;
            Scanner sc = new Scanner(System.in);
            for (int i = 1; i <= total; i++) {
                System.out.print("Enter The "+ i +"value: ");
                int a = sc.nextInt();
                if (a>b){
                    temp = a;
                    a = b;
                    b= temp;
                    if(b>c){
                        temp = b;
                        b = c;
                        c = temp;
                    }
                }
            }
            System.out.print("Second max Value is: "+b);
            sc.close();
        }
    
        public static void main(String args[]) {
            Scanner sc = new Scanner(System.in);
            System.out.print("Enter The total No. of input");
            int total = sc.nextInt();
            getSecondLargest(total);
        }
    }
    


    好奇,但你为什么需要这样的东西?虐待狂面试官?你能使用集合吗?你想不使用数组就找到第二大数字。输入的方式是什么?从文件读取?扫描键盘?是不是给了你10个参数的方法签名?请说清楚..我想有一个最大值和第二个值这里的Max variable应该起作用了?反正OP过去没有接受任何解决方案,所以我会省下2美分。好奇,但为什么你需要这样的东西?虐待狂面试官?你能使用
    集合吗
    ?你想找到第二大数字而不使用数组。输入的方法是什么?从文件读取?扫描keyboard?有没有给你10个参数的方法签名?请澄清。我觉得这里有一个max和secondMax变量就可以了?反正OP过去没有接受任何解决方案,所以我会省下2美分。是的,非常优雅solution@dreamcrash谢谢;)如果我使用以下变量尝试您的代码:系统输出println(max10(10,9,8,7,6,5,4,3,2,1)),我知道第二个最大值是6。@Green_Sam,这并不难看出。在您的示例参数中,
    a
    b
    c
    分别变成10、6和2。第二个最大值是6。这反过来意味着答案中的逻辑被破坏。只有当第二个最大值不在t中时,此代码才有效他将“分组”与最大数相同。也就是说,如果max1和max2都在(n1、n2、n3、n4)或(n5、n6、n7、n8)中,那么逻辑将失败,非常优雅solution@dreamcrash谢谢;)如果我使用以下变量尝试您的代码:System.out.println(max10(10,9,8,7,6,5,4,3,2,1)),我知道第二个最大值是6。@Green_Sam,这并不难看出。在您的示例参数中,
    a
    b
    c
    分别变成10、6和2。第二个最大值是6。这反过来意味着答案中的逻辑被破坏。只有当第二个最大值不在t中时,此代码才有效如果max1和max2都在(n1,n2,n3,n4)或(n5,n6,n7,n8)中,那么逻辑就会失败。如果有人想看这个问题,这个问题就解决了:如果有人想看这个问题,这个问题就解决了:我猜最大的=第二大的=n1;以及FitCandidate(n2);而不是前7行应该起作用also@dreamcrash我认为不是。以args 10、9、8、7、6、5、4、3、2、1为例。您可以将
    secondmaxist
    设置为10,而真正的secondmaxist将被忽略。如果您愿意,可以将
    maxist
    secondmaxist
    设置为
    -Double.MAX\u值,然后
    fitCandidateIn(n1)
    等@dreamcrashYep,但你做的方式更干净。我猜最伟大的=第二伟大的=n1;和fitCandidateIn(n2);而不是前7行应该起作用also@dreamcrash我认为不是。以args 10、9、8、7、6、5、4、3、2、1为例。您可以设置
    secondgrest