通过按降序在TreeSet中进行排序来查找数组的第三大元素

问题描述 投票:0回答:1

我试图通过按降序对树集进行排序来找到数组的第三大元素,但是某些测试用例对某些输入值失败,而大多数测试用例对某些输入值通过。

我的代码:

// { Driver Code Starts
import java.util.Scanner;
import java.util.*;
import java.io.*;

class ThirdLargestElement
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while(t>0)
        {
            long n =sc.nextLong();
            Long arr[] = new Long[(int)n];
            for(long i=0;i<n;i++)
                arr[(int)i] = sc.nextLong();
            GfG g = new GfG();
            System.out.println(g.thirdLargest(arr));
        t--;
        }
    }
}// } Driver Code Ends
class GfG
{
    long thirdLargest(Long a[])
    {
    // Your code here
        if(a.length<3)
            return -1;
        else{
            TreeSet<Long> ts=new TreeSet<Long>(new myComparator());
            for(long i:a)
                ts.add(i);
            ArrayList<Long> al=new ArrayList<Long>(ts);
            return al.get(2);
        }
    }
}
class myComparator implements Comparator{
    public int compare(Object obj1,Object obj2){
        Long a=(Long) obj1;
        Long b=(Long) obj2;
        if(a<b)
            return 1;
        else if(a>b)
            return -1;
        else 
            return 0;
    }
}

失败的测试用例:enter image description here

Link to the question where you can run the code

请更正此代码。

java arraylist comparator testcase treeset
1个回答
0
投票
您可以将元素直接添加到TreeSet并使用流获得第三大数字,

while(t>0) { long n =sc.nextLong(); TreeSet<Long> ts=new TreeSet<>(Comparator.comparingLong(Long::longValue).reversed()); for(long i=0;i<n;i++) ts.add(sc.nextLong()); long thirdLast = ts.stream() .limit(3) .skip(2) .mapToLong(e->e) .findAny().orElse(0l); System.out.println(thirdLast); t--; }


0
投票

尝试此一个

class GfG { long thirdLargest(Long a[]) { Arrays.sort(a); List<Long> numbers = Arrays.asList(a); Collections.reverse(numbers); return numbers.size() >= 3 ? numbers.get(2) : -1; } }
© www.soinside.com 2019 - 2024. All rights reserved.