[英]Finding the third largest element of an array by sorting it through TreeSet in a decreasing order
我試圖通過按降序對樹集進行排序來找到數組的第三大元素,但是某些測試用例對於某些輸入值失敗,並且大多數測試用例對於某些輸入值都通過。
我的代碼:
// { 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;
}
}
請解釋為什么這段代碼未能通過給定的測試用例。
您可以直接向TreeSet
添加元素並使用stream獲得第三大數字,
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--;
}
試試這個
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;
}
}
問題指出:
function thirdLargest...需要兩個參數。 第一個參數是數組 a[],第二個參數是數組的大小 (n)。
盡管問題表明數組是...
一組不同的元素
測試用例表明我們正在處理一個整數數組。
就我個人而言,我認為不需要第二個方法參數,因為在 java 中,一個數組是 object 並且有一個length
成員。 所以我下面的實現只需要一個參數,即一個int
數組。 也許geeksforgeeks.org的人只是簡單地將一個原本針對C 語言的問題轉換為java,因為在C 中,很難確定任何數組的大小。
TreeSet
中的每個元素必須是一個 object,因此我們需要將int
數組中的元素轉換為Integer
對象。 自動裝箱會自動執行此操作,盡管我下面的代碼包含顯式轉換。 所以在方法中我創建了一個TreeSet
。 由於 class Integer
實現接口Comparable ,默認的TreeSet
構造函數就足夠了。 我將int
數組的所有元素添加到TreeSet
中,然后獲取一個降序迭代器,然后迭代到迭代器返回的第三個元素,這就是該方法需要返回的值。
int thirdLargest(int[] arr) {
int third = -1;
if (arr != null && arr.length > 2) {
TreeSet<Integer> set = new TreeSet<Integer>();
for (int elem : arr) {
set.add(Integer.valueOf(elem));
}
Iterator<Integer> iter = set.descendingIterator();
if (iter.hasNext()) {
iter.next();
if (iter.hasNext()) {
iter.next();
if (iter.hasNext()) {
third = iter.next().intValue();
}
}
}
}
return third;
}
當然,如果你想忽略原題強加的條件,你可以使用stream API得到第三大元素
IntStream.of(2, 4, 1, 3, 5)
.boxed()
.sorted(Collections.reverseOrder())
.collect(Collectors.toList()).get(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.