备战秋招 | 笔试强训19

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

1、二分查找的时间复杂度()

A. O(N*log(N))

B. O(N)

C. O(log(N))

D. O(N^2)

2、有一个单向链表中有一个A、B两个相邻元素,有一个指针p指向元素A,现将一个指针r指向的S元素要插入到A和B之间,该进行操作()

A. p->next=p->next->next

B. r-next=p;p->next=r->next

C. r->next=p->next;p->next=r

D. r=p->next;->next=r->next

E. r->next=p;p->next=r

F. p=p->next->next

3、双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是()(链中结点数大于2,p不是第一个结点)

A. p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink; dispose(p);

B. dispose(p); p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink;

C. p->link->rlink:=p->llink; dispose(p); p->llink->rlink:=p->rlink;

D. 以上A,B,C都不对

4、一个栈的入栈序列是A,B,C,D,E,则栈的不可能输出序列是()

A. EDCBA

B. DECBA

C. DCEAB

D. ABCDE

5、循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初 始时为空,下列判断队空和队满的条件中,正确的是()

A. 队空:end1==end2;队满:end1==(end2+1) mod M

B. 队空:end1==end2;队满:end2==(end1+1) mod (M-1)

C. 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M

D. 队空:end1==(end2+1) mod M;队满:end2==(end1+1) mod (M-1)

6、已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是()

A. abcdefg

B. abdcefg

C. adbcfeg

D. abecdfg

7、某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为()

A. 不存在这样的二叉树

B. 200

C. 198

D. 199

8、设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造哈希表,哈希函数为H(key)=key MOD 13,哈希地址为1的链中有()个记录

A. 1

B. 2

C. 3

D. 4

9、以下哪种排序是不稳定排序()

A. 冒泡

B. 插入排序

C. 归并排序

D. 快速排序

二、编程题

1、汽水瓶  题目链接

2、查找两个字符串a,b中的最长公共子串  题目链接

三、选择题题解

1、二分查找的时间复杂度()

A. O(N*log(N))

B. O(N)

C. O(log(N))

D. O(N^2)

正确答案:C

题解:

         基本概念题;

2、有一个单向链表中有一个A、B两个相邻元素,有一个指针p指向元素A,现将一个指针r指向的S元素要插入到A和B之间,该进行操作()

A. p->next=p->next->next

B. r-next=p;p->next=r->next

C. r->next=p->next;p->next=r

D. r=p->next;->next=r->next

E. r->next=p;p->next=r

F. p=p->next->next

正确答案: C

题解:

         如下图所示,我们要插入一个新的结点;

3、双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是()(链中结点数大于2,p不是第一个结点)

A. p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink; dispose(p);

B. dispose(p); p->llink->rlink:=p->llink; p->llink->rlink:=p->rlink;

C. p->link->rlink:=p->llink; dispose(p); p->llink->rlink:=p->rlink;

D. 以上A,B,C都不对

正确答案;D

题解:

         正确代码我们可以结合下图来看;

4、一个栈的入栈序列是A,B,C,D,E,则栈的不可能输出序列是()

A. EDCBA

B. DECBA

C. DCEAB

D. ABCDE

正确答案:C

题解:

         C选项,当我们第一个出D时,代表ABC已经入栈,此时我们出一个C,栈中还有AB,我们再入一个E,然后再出一个E,接着栈顶的元素应该是B而不是A,故C错误;

5、循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初 始时为空,下列判断队空和队满的条件中,正确的是()

A. 队空:end1==end2;队满:end1==(end2+1) mod M

B. 队空:end1==end2;队满:end2==(end1+1) mod (M-1)

C. 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M

D. 队空:end1==(end2+1) mod M;队满:end2==(end1+1) mod (M-1)

正确答案:A

题解:

         两个下标在相同位置时为空,队尾+1模上空间大小等于队头等于满;故选A;

6、已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是()

A. abcdefg

B. abdcefg

C. adbcfeg

D. abecdfg

正确答案:B

题解:

         我们每次可通过后序确定一个根,并在中序中分割左右子树;具体分析如下;

7、某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为()

A. 不存在这样的二叉树

B. 200

C. 198

D. 199

正确答案:A

题解:

         公式,n0 = n2 + 1;计算得出200;

8、设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造哈希表,哈希函数为H(key)=key MOD 13,哈希地址为1的链中有()个记录

A. 1

B. 2

C. 3

D. 4
正确答案:D

题解:       

         题目即让我们求得上述哪些数据模13等于1;分别为1,14,27,79;故选D;

9、以下哪种排序是不稳定排序()

A. 冒泡

B. 插入排序

C. 归并排序

D. 快速排序

正确答案:D

题解:

         快排无法保证排序的稳定性;

四、编程题题解

1、汽水瓶

思路:我们模拟喝汽水的过程,我们创建一个变量记录当前瓶子个数,一个变量记录总共喝了多少瓶;然后模拟喝汽水过程求解;

#include <iostream>
using namespace std;

int main() 
{
    int n;
    while(cin >> n)
    {
        if(n == 0)
            break;
        // 记录当前瓶子个数
        int botton = n;
        int water = 0;
        while(botton >= 3)
        {
            // 可以兑换汽水数
            water += botton / 3;
            // 求得喝完以后的瓶子数
            botton = botton % 3 + botton / 3;
        }
        // 处理特殊情况,借瓶子
        if(botton == 2)
            water += 1;
        cout << water << endl;
    }
    return 0;
}

2、查找两个字符串a,b中的最长公共子串

思路:此题建议使用动态规划来做,找到以i-1结尾的str1与str2最大连续字符的个数; 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string LComSub(string& str1, string& str2)
{
    int len1 = str1.size();
    int len2 = str2.size();
    // 多开一个位置
    vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));

    int start = 0;
    int max = 0;
    for(int i = 1; i <= len1; i++)
    {
        for(int j = 1; j <= len2; j++)
        {
            if(str1[i - 1] == str2[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            if(dp[i][j] > max)
            {
                max = dp[i][j];
                start = i - max;
            }
        }
    }
    return str1.substr(start, max);
}

int main() 
{
    string str1, str2;
    cin >> str1 >> str2;
    // 最短字符串放在str1中
    if(str1.size() > str2.size())
        str1.swap(str2);
    cout << LComSub(str1, str2) << endl;
}

猜你喜欢

转载自blog.csdn.net/Nice_W/article/details/132023923