笔试题整理

题1:

如果x=2014,下面函数的返回值是()

int fun(unsigned int x)
{
     int n=0;
     while((x+1))
     {
         n++;
         x=x|(x+1);
     }
     return n;
}

A.20  B.21  C.23 D.25

答案: C


题2:

以下代码的输出是()

int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));

  • 1,2
  • 2,5
  • 2,1
  • 1,5
    答案: B

    解析: 

    题关键就在于第二个点,*(ptr-1)输出为多少?

    解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以int *ptr=(int *)(&a+1);其实ptr实际是&(a[5]),也就是a+5.

    原因为何呢?

    &a是数组指针,其类型为int(*)[5];


    题3:

    函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数()

    • int a[4][4];
    • int **a;
    • int **a[4]
    • int (*a)[4];


    答案: B


    题4

    下面说法正确的是()

    • C++已有的任何运算符都可以重载
    • const对象只能调用const类型成员函数
    • 构造函数和析构函数都可以是虚函数
    • 函数重载返回值类型必须相同

    答案: B


    题5

    典型的创建Windows窗口过程的流程为()

    • 注册窗口类->创建窗口->显示窗口->更新窗口->消息循环
    • 注册窗口类->创建窗口->更新窗口->显示窗口->消息循环
    • 创建窗口->注册窗口类->更新窗口->显示窗口->消息循环
    • 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环
    答案:A
    在屏幕上显示一个窗口的过程一般有以下步骤,这就是主程序的结构流程:
    (1)得到应用程序的句柄(GetModuleHandle)。
    (2)注册窗口类(RegisterClassEx)。在注册之前,要先填写RegisterClassEx的参数WNDCLASSEX结构。
    (3)建立窗口(CreateWindowEx)。
    (4)显示窗口(ShowWindows)。
    (5)刷新窗口客户区(UpdateWindow)。
    (6)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),如果有消息到达,则将消息分派到回调函数处理(DispatchMessage),如果消息是WM_QUIT,则退出循环。


    题6

    下面哪个API返回的不属于windows内核对象()

    • CreateFile
    • CreateSemaphore
    • CreateDC
    • CeateEvent
    答案: C

    内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。 除了内核对象外,也可以使用其他类型的对象,如菜单、窗口、鼠标光标、刷子和字体等。这些对象属于用户对象或图形设备接口(GDI)对象,而不是内核对象。

    ABD选项是内核对象:事件对象HANDLE CreateEvent();文件对象HANDLE CreateFile();信号量对象HANDLE CreateSemaphore();
    C选项是GDI对象。设备上下文(HDC)  CreateDC

    题7

    用户双击鼠标时产生的消息序列,下面正确的是()

    • WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP
    • WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONUP,WM_LBUTTONDBLCLK
    • WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONDBLCLK
    • WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP
    答案: D


    题8

    以下关于线程以下描述正确的是()
    1.windows线程创建时,默认绑定在1个特定的CPU上
    2.可采用SetThreadAffinityMask接口设置线程与某个cpu绑定
    3._beginthreadex比CreateThread创建线程安全是因为使用_beginthreadex会创建一个_tiddata,在调用一些诸如strtok函数时会将需要保护的数据存入_tiddata
    4.使用_beginthread创建线程时,线程执行函数必须为_cdecl约束规范,而_beginthreadex指定的线程执行函数必须为_stdcall
    • 1,2
    • 1,3
    • 1
    • 以上都不正确
    答案: D


    题9

    以下哪些线程同步锁可以为递归锁
    1.信号量  2.读写锁   3.互斥量   4.事件   5.临界区(Critical Section)

    • 1,3,4,5
    • 5
    • 3,5
    • 1,3,5

    答案:C

    进程/线程同步方法

    常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。

    在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。

    递归锁/非递归锁

    Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。

    二者唯一的区别是:

    同一个线程可以多次获取同一个递归锁,不会产生死锁。

    如果一个线程多次获取同一个非递归锁,则会产生死锁。

    Windows下的Mutex和Critical Section是可递归的。

    Linux下的pthread_mutex_t锁是默认是非递归的可以通过设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递归锁。


    题10

    关于sendmessage和postmessage的区别,下面的说法错误的是()
    • postmessage发出消息后,将消息放到消息队列中,马上返回
    • sendmessage发出消息后,一直等到该消息执行完毕,才返回
    • 用sendmessage给其他线程创建的窗口发送消息时,消息也会进消息队列
    • 用2个函数只能给当前进程的窗口发送消息
      答案:D

      A:PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。
      B:SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。
      C:当某线程调用sendmessage给别的线程创建的窗口时,发送的消息首先追加到接收线程的发送消息队列,发送线程处于空闲状态,等待接收线程处理完他的消息返回给发送线程的应答队列,等到后发送线程被唤醒取得应答队列的消息 (就是处理完消息的返回值),继续执行。
      D:sendmessage和postmessage都可以给其他线程发送消息


      题11

      关于WM_COPYDATA消息的处理,下面描述错误的是()

      • 可以在不同进程之间传递少量只读数据
      • 只能通过sendmessage方式来发送该消息
      • 只能在窗口过程函数中处理该消息
      • 可以在消息队列或窗口过程函数中处理该消息

      答案:C

      A:WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。
      B;该消息只能由SendMessage()来发送,而不能使用PostMessage()。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之前,就被系统清除和回收。
      D:可以在消息队列或窗口过程函数中处理该消息

      题12

      堆排序的空间复杂度是(),堆排序中构建堆的时间复杂度是()。

      • O(logn),O(n)
      • O(logn),O(nlogn)
      • O(1),O(n)
      • O(1),O(nlogn)
      答案:C


      题13

      基于统计的分词方法为()
      • 正向最大匹配法
      • 逆向最大匹配法
      • 最少切分
      • 条件随机场
        解析:

        目前的分词方法归纳起来有3 类:

        第一类是基于语法和规则的分词法。其基本思想就是在分词的同时进行句法、语义分析, 利用句法信息和语义信息来进行词性标注, 以解决分词歧义现象。因为现有的语法知识、句法规则十分笼统、复杂, 基于语法和规则的分词法所能达到的精确度远远还不能令人满意, 目前这种分词系统还处在试验阶段。

        第二类是机械式分词法(即基于词典)。机械分词的原理是将文档中的字符串与词典中的词条进行逐一匹配, 如果词典中找到某个字符串, 则匹配成功, 可以切分, 否则不予切分。基于词典的机械分词法, 实现简单, 实用性强, 但机械分词法的最大的缺点就是词典的完备性不能得到保证。据统计, 用一个含有70 000 个词的词典去切分含有15 000 个词的语料库, 仍然有30% 以上的词条没有被分出来, 也就是说有4500 个词没有在词典中登录。

        第三类是基于统计的方法。基于统计的分词法的基本原理是根据字符串在语料库中出现的统计频率来决定其是否构成词。词是字的组合, 相邻的字同时出现的次数越多, 就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映它们成为词的可信度。

        最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描,这是基于词典分词的方法
        1.正向最大匹配法 
        2.逆向最大匹配法
        3.最少切分法:使每一句中切出的词数最小,这也是基于词典分词的方法
        条件随机场是一个基于统计的序列标记和分割的方法,属于基于统计的分词方法范畴。它定义了整个标签序列的联合概率,各状态是非独立的,彼此之间可以交互,因此可以更好地模拟现实世界的数据.

        1)正向最大匹配法(由左到右的方向); 
        2)逆向最大匹配法(由右到左的方向); 
        3)最少切分(使每一句中切出的词数最小)。 
        以上三种是机械分词方法:
        条件随机域(场)(conditional random fields,简称 CRF,或CRFs),是一种判别式概率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列。
        条件随机场(CRF)由Lafferty等人于2001年提出,结合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,基于统计学,可以作为一种分词方法


        题14

        下列哪个不属于CRF模型对于HMM和MEMM模型的优势()
        • 0
          点赞
        • 6
          收藏
          觉得还不错? 一键收藏
        • 0
          评论

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值