题目:写一个函数找出一个整数数组中,第二大的数。【
Mirosoft】
解答:
int FindSecondMaxValue(int src[], int count)
{
int max = 0;
int secondMax = 0;
if (count==0) return secondMax;
if (count==1)
{
return src[0];
}
else if (src[0] > src[1])
{
max = src[0];
secondMax = src[1];
}
else
{
max = src[1];
secondMax = src[0];
}
for (int i=2; i<count; ++i)
{
if (src[i] >= max)
{
secondMax = max;
max = src[i];
}
else
{
if (src[i]>secondMax)
{
secondMax = src[i];
}
}
}
return secondMax;
}
算法本身是简单的,但是一些边界条件需要注意:
1.数组的元素数量为1,0个;
2.数组所有元素的数值相等;
3.数组元素只有2个不同的数值。
以上代码还不是很健壮,不过基本逻辑应该是OK的,以下是测试代码,测试了相关的边界条件。
void testFindSecondMaxValue()
{
const int array_size = 10;
// 一般情况
int arr1[array_size]={0, -1, 1, 87, 3354, 24, -56, 355, 687, -100};
std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr1, array_size ) << std::endl;
// 数组元素只有2个不同的数值
int arr2[array_size]={0, 1, 0, 0, 0, 0, 0, 0, 0, 0};
std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr2, array_size ) << std::endl;
// 数组所有元素的数值相等
int arr3[array_size]={1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr3, array_size ) << std::endl;
// 只有0个元素的数组
//int arr4[0];
//std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr4, 0 ) << std::endl;
// 只有1个元素的数组
int arr5[1]={1};
std::cout << "数组中第二大数为:" << FindSecondMaxValue(arr5, 1 ) << std::endl;
}
不过0数组在VS2005里面已经被禁止掉了,所以arr4编译是会要报错的。
附送一个求数组第二小的元素的查找算法:
int FindSecondMinValue(int src[], int count)
{
int min = 0;
int secondMin = 0;
if (count==0) return secondMin;
if (count==1)
{
return src[0];
}
else if (src[0] < src[1])
{
min = src[0];
secondMin = src[1];
}
else
{
min = src[1];
secondMin = src[0];
}
for (int i=2; i<count; ++i)
{
if ( src[i]<=min )
{
secondMin = min;
min = src[i];
}
else
{
if ( src[i] < secondMin)
secondMin = src[i];
}
}
return secondMin;
}
其实就是反了一下,也没啥特别的。。。。
=。=