Find the second highest number in an array
Core Java Coding Questions and Answers for beginner to intermediate level
Q1 | Q2 | Q3 | Q4 | Q5 - Q8 | Q9 | Q10 | Q11 | Q12 - Q14 | Q15 |
Q. Can you find the second highest number in a given number?
For example:
Input: { 3, 5, 9, 7, 6, 8 };
Result: 8
A. A naive approach is to sort the array in descending order and then get the second element from the array. Sorting impacts performance, and a better approach would be to
1) Have two variables to store highest & second highest numbers, and initialize them to minimum value.
2) Loop through each number in the array
3) If the "current number" > highest, make the current highest to second highest, and make the current value the highest.
4) else If the "current number < highest", but greater than the second highest then make "current number" the second highest.
public class SecondHighestNumber { public static void main(String[] args) { int[] numberArray = {3, 5, 9, 7, 6, 8}; System.out.println(findSecondHighest(numberArray)); } static int findSecondHighest(int[] numbers) { // initialize to the smallest value possible int highest = Integer.MIN_VALUE; int secondHighest = Integer.MIN_VALUE; for (int i = 0; i < numbers.length; i++) { //if highest number is found if (numbers[i] > highest) { secondHighest = highest; //make current highest to 2nd highest highest = numbers[i]; //make current value to highest } else if (numbers[i] > secondHighest) // replace the second highest secondHighest = numbers[i]; } return secondHighest; } }
Output:
8
Q. Is there anything wrong with the above code? What if you have duplicate numbers?
For example: int[] numberArray = {3, 5, 9, 7, 9, 8}; out put will be 9. If that is the expected behavior then it is fine. What if you want it to return 8 instead of 9?
A. Here is the slight revised solution that Ignores the equally highest numbers.
public class SecondHighestNumber { public static void main(String[] args) { int[] numberArray = {3, 5, 9, 7, 9, 8}; System.out.println(findSecondHighest(numberArray)); } static int findSecondHighest(int[] numbers) { // initialize to the smallest value possible int highest = Integer.MIN_VALUE; int secondHighest = Integer.MIN_VALUE; for (int i = 0; i < numbers.length; i++) { //if highest or equally highest number is found //ignore the equally highest if (numbers[i] >= highest) { if(numbers[i] > highest) { secondHighest = highest; //make current highest to 2nd highest highest = numbers[i]; //make current value to highest } } else if (numbers[i] > secondHighest) // replace the second highest secondHighest = numbers[i]; } return secondHighest; } }
Output:
8
2 Comments:
Instead of updating the if condition, you could update the else condition to : else if (numbers[i] > secondHighest && numbers[i]!=highest)
Good point Aafreen.
Post a Comment
Subscribe to Post Comments [Atom]
<< Home