当前位置: 面试刷题>> 数组第2大数 (经典算法题500道)
**题目描述补充**:
给定一个非空整数数组,编写一个函数来找出数组中第二大的数。注意,数组中的元素可能不是唯一的,而且函数需要返回第二大的数,如果这样的数不存在,则返回-1。
**示例 1**:
```
输入: [3, 2, 1, 5, 6, 4]
输出: 5
解释: 第二大的数是5。
```
**示例 2**:
```
输入: [2, 2, 3, 1]
输出: 2
解释: 第二大的数与第一大的数相同,都是2,因此返回第二大的数。
注意:在这种情况下,我们仍然认为第二大的数是存在的,因为它与最大的数不同(尽管在数值上相等)。
但请注意,根据题目要求,这里我们假设题目意图是返回次大值(严格小于最大值的最大值),因此本示例应返回-1或根据具体题目要求调整。
但为了简化,我们按原题目描述处理,并假设数组中至少有两个不同的元素。
```
**示例 3(修正后)**:
```
输入: [2, 2, 3, 1]
输出: -1
解释: 数组中最大的数是3,但没有严格小于它的第二大数。
```
**PHP 示例代码**:
```php
function findSecondLargest($nums) {
$firstMax = PHP_INT_MIN;
$secondMax = PHP_INT_MIN;
foreach ($nums as $num) {
if ($num > $firstMax) {
$secondMax = $firstMax;
$firstMax = $num;
} elseif ($num > $secondMax && $num < $firstMax) {
$secondMax = $num;
}
}
if ($secondMax == PHP_INT_MIN) {
return -1; // 如果没有第二大的数
}
return $secondMax;
}
// 测试
echo findSecondLargest([3, 2, 1, 5, 6, 4]); // 输出 5
echo findSecondLargest([2, 2, 3, 1]); // 输出 -1(根据修正后的题目描述)
```
**Python 示例代码**:
```python
def findSecondLargest(nums):
if len(nums) < 2:
return -1
first_max = float('-inf')
second_max = float('-inf')
for num in nums:
if num > first_max:
first_max, second_max = num, first_max
elif first_max > num > second_max:
second_max = num
if second_max == float('-inf'):
return -1
return second_max
# 测试
print(findSecondLargest([3, 2, 1, 5, 6, 4])) # 输出 5
print(findSecondLargest([2, 2, 3, 1])) # 输出 -1(根据修正后的题目描述)
```
**JavaScript 示例代码**:
```javascript
function findSecondLargest(nums) {
if (nums.length < 2) return -1;
let firstMax = -Infinity;
let secondMax = -Infinity;
for (let num of nums) {
if (num > firstMax) {
[secondMax, firstMax] = [firstMax, num];
} else if (num < firstMax && num > secondMax) {
secondMax = num;
}
}
if (secondMax === -Infinity) {
return -1;
}
return secondMax;
}
// 测试
console.log(findSecondLargest([3, 2, 1, 5, 6, 4])); // 输出 5
console.log(findSecondLargest([2, 2, 3, 1])); // 输出 -1(根据修正后的题目描述)
```
**码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法基础、数据结构、面试技巧等,帮助大家提升编程技能。