面试题答案
一键面试Function FindSecondLargest(arr() As Integer) As Integer
Dim largest As Integer
Dim secondLargest As Integer
Dim i As Integer
'假设第一个元素是最大和第二大的初始值
largest = arr(0)
secondLargest = arr(0)
For i = 1 To UBound(arr)
If arr(i) > largest Then
secondLargest = largest
largest = arr(i)
ElseIf arr(i) > secondLargest And arr(i) < largest Then
secondLargest = arr(i)
End If
Next i
FindSecondLargest = secondLargest
End Function
优化思路
- 初始化:直接将数组的第一个元素设为最大和第二大的初始值,这样可以减少不必要的比较。因为数组不为空时,第一个元素必然是数组中的一个值,以此为基础开始比较更高效。
- 单次遍历:通过一次遍历数组,在遍历过程中实时更新最大和第二大的值。当遇到比当前最大元素更大的元素时,更新最大元素,并将原来的最大元素赋值给第二大元素;当遇到介于最大和第二大元素之间的值时,更新第二大元素。这种方式避免了多次遍历数组,降低了时间复杂度。时间复杂度为O(n),n为数组元素个数,相比于排序后取第二大元素(时间复杂度通常为O(n log n))更为高效。