Description
Microsoft是yy梦想的天堂,可要想进入Microsoft,得过面试关,且看:
主考官:请在O(n)时间内找出一个线性表内第二大的数。而且只能从左到右遍历一遍。
yy:啥叫O(n)时间?
主考官:........#(*&@#*(&%5E$*&@#*(&^$)*&(@*&#!!!,就是你只能遍历线性表一次,就把第二大的数给找出来...
Input
第一行为一个整数T,表示有T组数据。每组数据有两行:第一行是一个整数n ,表示线性表有n个元素;第2行有n个以空格隔开的整数,即线性表中每个元素的值。
N不大于1,000,000。
Output
共T行,输出对应的每组数据中第二大的数。如果第二大的数不存在,请输出None。
Sample Input
2
4
1 2 3 3
4
2 2 2 2
4
1 2 3 3
4
2 2 2 2
Sample Output
2
None
思路:开数组明显会爆的,所以我们就要去想办法不开数组的方式去解决掉它,因为是找第二大的数字,所以我们直接可以按照求范围一样的去对待。
代码如下:
#include<stdio.h>
int main()
{
int T,di,dj,n,x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(n==0 || n==1)
{
printf("None\n");
continue;
}
scanf("%d%d",&x,&y);
di = x>y?x:y;
dj = x+y - di;
if(n==2)
{
if(di==dj)
printf("None\n");
else
printf("%d\n",dj);
continue;
}
n-=2;
while(n--)
{
scanf("%d",&x);
if(di==dj)
{
if(di<x)
di = x;
}
else
{
if(di>x && dj<x)
dj = x;
else if(di<x)
{
dj = di;
di =x;
}
}
}
if(di==dj) printf("None\n");
else printf("%d\n",dj);
}
return 0;
}