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

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值