Microsoft的考验??查找第二大的数
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; }