描述
Microsoft是yy梦想的天堂,可要想进入Microsoft,得过面试关,且看:
主考官:请在O(n)时间内找出一个线性表内第二大的数。而且只能从左到右遍历一遍。
yy:啥叫O(n)时间?
主考官:........#(*&@#*(&%5E$*&@#*(&^$)*&(@*!!!,就是你只能遍历线性表一次,就把第二大的数给找出来...
输入
第一行为一个整数T,表示有T组数据。每组数据有两行:第一行是一个整数n ,表示线性表有n个元素;第2行有n个以空格隔开的整数,即线性表中每个元素的值。
n不大于1,000,000。
输出
共T行,输出对应的每组数据中第二大的数。如果第二大的数不存在,请输出None。
样例输入
2
4
1 2 3 3
4
2 2 2 2
样例输出
2
None
提示
测试数据较大,且时间较严,请考虑只扫描一遍的算法
#include<stdio.h>
int main()
{
int n,m,t,max,max1;
scanf("%d",&n);
while(n--)
{
max=-100000;
max1=-100000;
scanf("%d",&m);
while(m--)
{
scanf("%d",&t);
if(t==max || t==max1) continue;
if(t>max)
{
max1=max;
max=t;
}
else
{
if(t>max1)
{
max1=t;
}
}
}
if(max1!=-100000 && max!=max1)
printf("%d\n",max1);
else
printf("None\n");
}
}