在数组 java 中找到第三大数(包括重复项)
find third largest number in array java(including duplicates)
这个问题可能已经回答了,但我的问题是,如果我在给定数组中传递重复或重复的值,那么它会给出错误的输出。按照逻辑应该给出正确的值,但不确定我的代码有什么问题。下面是我的代码
import java.util.Scanner;
import java.util.Arrays;
class ThirdLargest{
static int thirdLar(int arr[],int arr_size)
{
int i, largest, secondLargest, thirdLargest;
thirdLargest = largest = secondLargest = Integer.MIN_VALUE;
for (i = 0; i < arr_size ; i ++)
{
/* If current element is smaller than
largest*/
if (arr[i] > largest)
{
thirdLargest = secondLargest;
secondLargest = largest;
largest = arr[i];
}
/* If arr[i] is in between largest and
secondLargest then update secondLargest */
else if (arr[i] > secondLargest)
{
thirdLargest = secondLargest;
secondLargest = arr[i];
}
else if (arr[i] > thirdLargest)
thirdLargest = arr[i];
}
return thirdLargest;
}
public static void main(String args[]){
//Scanner object for capturing the user input
Scanner scanner = new Scanner(System.in);
//Stored the entered value in variable
/*System.out.print("Enter 5 number of elements:");
int n = scanner.nextInt();*/
int n = 5;
int arr[] = new int[n];
System.out.println("Enter 5 numbers one by one:");
for(int i = 0; i < n; i++)
{
arr[i] = scanner.nextInt();
}
//Call thirdLar method to find largest number among given numbers
int thirdLarNum = thirdLar(arr,n);
System.out.println("The Third Largest Number is: "+thirdLarNum);
}
}
输出:如果我传递像 10 20 40 20 20 这样的值
正确的输出应该是 10 但它返回 20
要确保 largest
、secondLargest
和 thirdLargest
是唯一的,您应该添加更多检查:
...
else if (arr[i] > secondLargest && arr[i] != largest)
--------------------
{
thirdLargest = secondLargest;
secondLargest = arr[i];
}
else if (arr[i] > thirdLargest && arr[i] != largest && arr[i] != secondLargest)
-----------------------------------------------
thirdLargest = arr[i];
...
可以用Set
代替数组来剔除重复值转成数组
Set<int> set = new HashSet<>();
for(int i = 0; i < n; i++)
{
set.add(scanner.nextInt());
}
int thirdLarNum = thirdLar(set.toArray(), n);
或者在thirdLar
中使用set
代替数组
static int thirdLar(Set<int> set)
{
for (int number : set) {
if (number > largest) {
//...
}
}
}
我们可以使用下面的代码来实现。
int[] a = {1,10,33,55};
List<Integer> list=Arrays.asList(a);
int total = list.size;
Collections.sort(list);
int element=list.get(total-3);
您可以使用 Streams :
我在这里使用了一个 IntStream,它不支持排序中的比较器,它可以允许 Collections.reverseSort(),所以我必须在比较之前对每个 int 取反 – 而 return 取反的值;
import java.util.Arrays;
public class Main {
static int thirdLar(final int[] arr) {
final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(3).toArray();
return -array[Math.min(2, array.length - 1)];
}
public static void main(final String args[]) {
System.out.println(thirdLar(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }));
}
}
Edit :此代码可以轻松找到第 n 个最大的
import java.util.Arrays;
public class Main {
static int nthLargest(final int[] arr, final int rank) {
assert rank > 0;
final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(rank).toArray();
return -array[Math.min(rank - 1, array.length - 1)];
}
public static void main(final String args[]) {
System.out.println(nthLargest(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }), 3);
}
}
这个问题可能已经回答了,但我的问题是,如果我在给定数组中传递重复或重复的值,那么它会给出错误的输出。按照逻辑应该给出正确的值,但不确定我的代码有什么问题。下面是我的代码
import java.util.Scanner;
import java.util.Arrays;
class ThirdLargest{
static int thirdLar(int arr[],int arr_size)
{
int i, largest, secondLargest, thirdLargest;
thirdLargest = largest = secondLargest = Integer.MIN_VALUE;
for (i = 0; i < arr_size ; i ++)
{
/* If current element is smaller than
largest*/
if (arr[i] > largest)
{
thirdLargest = secondLargest;
secondLargest = largest;
largest = arr[i];
}
/* If arr[i] is in between largest and
secondLargest then update secondLargest */
else if (arr[i] > secondLargest)
{
thirdLargest = secondLargest;
secondLargest = arr[i];
}
else if (arr[i] > thirdLargest)
thirdLargest = arr[i];
}
return thirdLargest;
}
public static void main(String args[]){
//Scanner object for capturing the user input
Scanner scanner = new Scanner(System.in);
//Stored the entered value in variable
/*System.out.print("Enter 5 number of elements:");
int n = scanner.nextInt();*/
int n = 5;
int arr[] = new int[n];
System.out.println("Enter 5 numbers one by one:");
for(int i = 0; i < n; i++)
{
arr[i] = scanner.nextInt();
}
//Call thirdLar method to find largest number among given numbers
int thirdLarNum = thirdLar(arr,n);
System.out.println("The Third Largest Number is: "+thirdLarNum);
}
}
输出:如果我传递像 10 20 40 20 20 这样的值 正确的输出应该是 10 但它返回 20
要确保 largest
、secondLargest
和 thirdLargest
是唯一的,您应该添加更多检查:
...
else if (arr[i] > secondLargest && arr[i] != largest)
--------------------
{
thirdLargest = secondLargest;
secondLargest = arr[i];
}
else if (arr[i] > thirdLargest && arr[i] != largest && arr[i] != secondLargest)
-----------------------------------------------
thirdLargest = arr[i];
...
可以用Set
代替数组来剔除重复值转成数组
Set<int> set = new HashSet<>();
for(int i = 0; i < n; i++)
{
set.add(scanner.nextInt());
}
int thirdLarNum = thirdLar(set.toArray(), n);
或者在thirdLar
中使用set
代替数组
static int thirdLar(Set<int> set)
{
for (int number : set) {
if (number > largest) {
//...
}
}
}
我们可以使用下面的代码来实现。
int[] a = {1,10,33,55};
List<Integer> list=Arrays.asList(a);
int total = list.size;
Collections.sort(list);
int element=list.get(total-3);
您可以使用 Streams :
我在这里使用了一个 IntStream,它不支持排序中的比较器,它可以允许 Collections.reverseSort(),所以我必须在比较之前对每个 int 取反 – 而 return 取反的值;
import java.util.Arrays;
public class Main {
static int thirdLar(final int[] arr) {
final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(3).toArray();
return -array[Math.min(2, array.length - 1)];
}
public static void main(final String args[]) {
System.out.println(thirdLar(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }));
}
}
Edit :此代码可以轻松找到第 n 个最大的
import java.util.Arrays;
public class Main {
static int nthLargest(final int[] arr, final int rank) {
assert rank > 0;
final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(rank).toArray();
return -array[Math.min(rank - 1, array.length - 1)];
}
public static void main(final String args[]) {
System.out.println(nthLargest(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }), 3);
}
}