zoukankan      html  css  js  c++  java
  • 今年的笔试试题有点坑爹啊(记13年企鹅开发试题)!!

    今年的企鹅程序开发的题目有点坑爹,没有算法编程,坑得俺各种惨啊!一直对自己的编程能力不是很自信,所以在开学之初就一直狂撸算法、POJ上的题目。结果今年……嘛都不说了,都是泪啊!!更坑爹的是今年的题目就只有选择、填空两大题目类型(不加附加题),选择题却出人意料的变成了不定项选择题!

    2.有如下定义:

    int i;

    char a[10];

    string f();

    string g(string &str);

    则下列语句中,不会产生编译错误的是()

    A.if ( !! i){f();}   B.g(f())   C.a = a + 1   D.g("abc")

    C、D两项毫无疑问的排除了,对于B项,一直很不确定,所以最后果断给补上的!!现在看来是悲剧了!因为在f()返回string对象后,是生产的一个临时对象,将这个临时对象作为g()的参数传递,然而g中的形参是作为引用声明的,而引用是不能对一个临时变量进行引用的!!

    14.在有n个整数的序列中找出最大值和最小值,最少需要的比较次数是()

    A.  2n - 2    B.  3n/2    C.   n - 1    D.  4n/3

    其实,我是没理解这个题目的意思,对于这个题目我自己的理解是求最少的比较次数,而最小的比较次数就是该组数为有序的。所以其比较次数为n - 1;但听同学说是编程之美的一题目,答案为3n/2;这是又悲剧了么??

    个人的算法如下:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    void findMaxMin(int arr[],int length,int &min,int &max )
    {
        min = arr[0];
        max = arr[0];
        
        int i;
        
        int cnt = 0;
        
        //当前值若小于min,则一定会小于max,就不用再与max比较了。 
        for (i = 1; i < length; i++)
        {
            if ( cnt++ && min > arr[i])
            {
                min = arr[i];
            }
            else if ( cnt++ && max < arr[i] )
            {
                max = arr[i];
            }
        }
        cout << "cnt = " << cnt << endl;
        
    }
    
    
    int main()
    {
        int arr[] = {
            10,9,8,7,6,5,4,3,2,1
        };
        
        int len;
        len = sizeof(arr) / sizeof(arr[0]);
        int max,min;
        
        findMaxMin(arr,len,min,max);
        
        
        cout << "min = " << min << endl;
        cout << "max = " << max << endl;
        
        return 0;
    }

    其运行结果为:

     

    最好的情况就是降序的有序数组,所比较的次数为n - 1最相近。
     
    选择题的18.19.20都是我拿不定的题,主要是这方面的知识点好久没看过了。
    18、以下定时器有哪些属于TCP协议栈定时器()
    A.重传定时器   B.time_wait定时器   C.syn-ack定时器  D.零窗口探测定时器
    网上找了些相关的资料,解释如下:
    解析:
    定时器在TCP可靠传输的过程中起着举足轻重的作用。TCP在建立连接之后可能(保活
    keep-alive定时器是可选的)会 启动四个定时器,分别是:
    重传定时器:为了防止报文丢失或者损坏,TCP在发送一个报文以后启动重传定时器,
    如果定时器溢出之前该报文的ACK还未到达,则重传该报文。重传定时器超时时间
    (Retransmision Timeout)依赖于往返时间RTT,而RTT在传输的过程中是动态变化的,
    而且变化范围较大,精准的计算RTT较困难,TCP有时间戳选项,为准确的计算RTT提供
    了方便
    坚持定时器:TCP报文段可能是不携带任何数据的ACK分节,接收端对此分节无确认必要。
    假设有如下场景,A是发送端,B为接收端,B的通告窗口win大小为100字节,这时A发送
    100字节到B,由于A的ACK告知B A.win=0,所以,A暂停发送数据等待A.win变大,稍后A的
    接受缓存中的数据被上层应用处理,于是A.win增大,接着A发送ACK窗口更新通知B,如果这
    个不携带任何数据的分节丢失,则A,B就会处于一种死锁状态(A等待B通知窗口更新,B等待A
    发送数据)。为了解决这一问题,TCP发送方使用一个坚持定时器来周期性的向接收方查询,
    以便发现窗口是否已经增大。这些从发送方发出的报文段称为窗口探查(window probe)
     
    2MSL定时器:MSL是报文段做大生存时间(Maximum Segment Lifetime),设置这个定时器
    有两个目的其一是为了测量连接处于TIME_WAIT状态的时间.这样可以让TCP再次发送最后
    的ACK以防止这个ACK丢失(如果丢失,另一端会重传FIN)。
    其二,为允许老的重复分节在网络中消逝。具体可以解释为,如果一个TCP连接在断开之前
    有迷途分节尚未消逝,在断开该TCP连接之后立刻重启一个同样的连接(双方的IP地址和端口
    port相同),这时之前的迷途的老分节可能对新的新的TCP连接接收,从而造成未定义的错误。
    为了避免这种情况,TCP规定在TIME_WAIT状态,不能启动一个连接的化身。既然TIME_WAIT
    状态维持2MSL,这就保证了一个连接上的分组及其应该在2MSL内都会消失。
     
    保活定时器:这个定时器在选项中设置,默认是关闭的。如果开启这个选项,那么如果一个连
    接闲置了一定时间以后,服务端会发送探寻分节给客户端判断客户端是否有响应。这个时间在
    TCP的各种实现中不尽相同,但通常都在一小时以上。由于这个保活时间间隔太长,所以很多
    需要频繁检测对端是否存活的应用都是在应用层自行开发心跳机制。
     
    其他很多选择题各种没把握,今年考操作系统的知识点过多了,企鹅你妹的!!!
  • 相关阅读:
    < java.util >-- Set接口
    Codeforces 627 A. XOR Equation (数学)
    Codeforces 161 B. Discounts (贪心)
    Codeforces 161 D. Distance in Tree (树dp)
    HDU 5534 Partial Tree (完全背包变形)
    HDU 5927 Auxiliary Set (dfs)
    Codeforces 27E. Number With The Given Amount Of Divisors (暴力)
    lght oj 1257
    Codeforces 219D. Choosing Capital for Treeland (树dp)
    Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
  • 原文地址:https://www.cnblogs.com/wickedboy237/p/3018532.html
Copyright © 2011-2022 走看看