• 笔试强训48天——day24


    一. 单选

    1.请指出选择排序,冒泡排序,快速排序的时间复杂度分别是()

    A O(n2)、O(n2)、O(nlog2n)
    B O(n
    log2n)、、O(n^2)、O(nlog2n)
    C O(n)、O(n2)、O(n2)
    D O(n
    log2n)、O(n2)、O(n2)

    正确答案:A

    简单排序——平方间
    先进排序——对数间

     

    2. 在单链表中,增加头结点的目的是()

    A 标识表结点中首结点的位置
    B 算法实现上的方便
    C 使单链表至少有一个结点
    D 说明单链表是线性表的链式存储实现

    正确答案:B

    如果没有头结点,在插入或删除的时候需要特殊处理,有了头结点就需要修改头结点的next指针即可
     

    3.下列算法的功能是什么?

    /*L是无头节点单链表*/
    LinkList Demo(LinkList L){
    ListNode *Q,*P;
    if(L&&L->next){
    Q=L;
    L=L->next;
    P=L;
    while(P->next)
    P=P->next;
    p->next=Q;
    } 
    return L;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    A 遍历链表
    B 链表深拷贝
    C 链表反转
    D 单链表转变为循环链表

    正确答案:D

     

    4. 表达式3*2(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和运算符栈为(),其中为乘幂

    A 3,2,4,1,1;(^(+-
    B 3,2,8;(^-
    C 3,2,4,2,2;(
    ^(-
    D 3,2,8;*^(-

    正确答案:D

    表达式求值
    数据栈——遇到数据就入栈
    操作符栈——运算符优先级大于操作符栈中的才入栈,遇到优先级低的运算符就停止入栈,先进行对高的运算符求解——先将运算符出栈,然后从数据栈中出两个数,先出的为右数,后出的为左数——将结果重新入数据栈
    当出现优先级同样大的,先出现的优先级就高,先算

     

    5. 假设以数组A[60]存放循环队列的元素,其头指针是front=47,当前队列有50个元素,则队列的尾指针值为()

    A 3
    B 37
    C 97
    D 50

    正确答案:B

    从头指针到尾指针有13个元素位置(60-47),那么先存13个,再循环过来就是37到尾(50-13),是循环队列

     

    6. 一棵完全二叉树第六层有9个叶结点(根为第一层),则结点个数最多有()

    A 112
    B 111
    C 107
    D 109

    正确答案:D

    第六层的最多的叶子节点个数:2^(6-1) = 32
    比9大,证明还有第7层,如果全是32个叶子结点,那么没有第七层
    2^7-1 = 127(计算的是满七层的二叉树结点)
    127-9*2 = 109(需要减去第六层9个叶子结点的子树(叶子结点没有子树,所以这9个没有第七层,要减掉)

    性质1:在二叉树的第i成上至多有2^(i-1)个结点
    性质2:深度为k的二叉树至多有(2^k)-1个结点

     

    7. 有权值分别为11,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为()

    A 24
    B 71
    C 48
    D 53

    正确答案:B

    构造哈夫曼树——先选较小的两个值为叶子结点,他俩的和是根结点,往上构造
    带权求和值最小的数

    带权路径长度:用原先的这几个数来求11,8,6,2,5。
    叶子结点到根结点要走几次叶子结点,最后求和
    6
    2+23+53+82+112 = 71

     

    8.已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,最后的叶子节点为()

    A 34
    B 21
    C 16
    D 12

    正确答案:C

     

    9. 将10个元素散列到100000个单元的哈希表中,则()产生冲突

    A 一定会
    B 一定不会
    C 仍可能会

    正确答案:C

     

    10.下列排序算法中,元素的移动次数与关键字的初始排列次序无关的是 ()

    A 直接插入排序
    B 起泡排序
    C 基数排序
    D 快速排序
    正确答案:C

     
     

    二. 编程

    1. 年终奖

    链接

    小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个66的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始
    游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
    给定一个6
    6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。

    正确答案:

    class Bonus {
    public:
    int getMost(vector<vector<int> > board)
    {
    // write code here
    int row = board.size();
    int col = board[0].size();
    vector<vector<int>> allPrice(row, vector<int>(col, 0));
    allPrice[0][0] = board[0][0];
    for(int i=0; i<row; ++i)
    {
    for(int j=0; j<col; ++j)
    {
    //如果是起点坐标,不做任何处理。
    if(i==0 && j==0)
    continue;
    if(i == 0) //在第一行,只能往右走
    allPrice[i][j] = allPrice[i][j-1] + board[i][j];
    else if(j == 0) //在第一列,只能往下走
    allPrice[i][j] = allPrice[i-1][j] + board[i][j];
    else
    //除去两个临界边,剩下的就是既能向右走,也能向下走,
    //这时候就要考虑走到当前点的所有可能得情况,也就是走到当前点
    //各自路径的和是不是这些所有到达该点路径当中最大的了
    allPrice[i][j] = max(allPrice[i][j-1], allPrice[i-1][j]) + board[i][j];
    }
    }
     // 返回最后一个坐标点的值,它就表示从左上角走到右下角的最大奖励
    return allPrice[row-1][col-1];
    }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

     
     

    2. 迷宫问题

    链接

    定义一个二维数组 N*M ,如 5 × 5 数组下所示:
    maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    };
    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找
    出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。

    输入描述:
    输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的
    路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
    输出描述:
    左上角到右下角的最短路径,格式如样例所示。

    示例1:
    输入
    5 5
    0 1 0 0 0
    0 1 1 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0
    输出
    (0,0)
    (1,0)
    (2,0)
    (2,1)
    (2,2)
    (2,3)
    (2,4)
    (3,4)
    (4,4)

    示例2:
    输入
    5 5
    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 1
    0 1 1 1 0
    0 0 0 0 0
    输出
    (0,0)
    (1,0)
    (2,0)
    (3,0)
    (4,0)
    (4,1)
    (4,2)
    (4,3)
    (4,4)
    说明
    注意:不能斜着走!!

    正确答案:

    #include
    #include
    using namespace std;
    
    int ROW, COL;
    vector<vector<int>> maze;
    vector<vector<int>> path_tmp; //临时路劲
    vector<vector<int>> path_best; //最佳路劲
    
    void MazeTrack(int i, int j)
    {
        maze[i][j] = 1; //代表(i,j)已经走过
    path_tmp.push_back({i,j});
    //判断是否到达出口
      if(i==ROW-1 && j==COL-1)
      {
      //寻找最短路劲
      if(path_best.empty() || path_best.size()>path_tmp.size())
      path_best = path_tmp;
      } 
    //向右走
    if(j+1<COL && maze[i][j+1]==0)
    MazeTrack(i, j+1);
    //向左走
    if(j-1>=0 && maze[i][j-1]==0)
    MazeTrack(i, j-1);
    //向上走
    if(i-1>=0 && maze[i-1][j]==0)
    MazeTrack(i-1, j);
    //向下走
    if(i+1<ROW && maze[i+1][j]==0)
    MazeTrack(i+1, j);
    maze[i][j] = 0; //回溯 恢复路劲
    path_tmp.pop_back();
    } 
    int main()
    {
    while(cin >> ROW >> COL)
    {
    maze = vector<vector<int>>(ROW, vector<int>(COL, 0)); //开辟迷宫空间
    path_tmp.clear();
    path_best.clear();
    //首先输入迷宫
    for(int i=0; i<ROW; ++i)
    {
    for(int j=0; j<COL; ++j)
    cin>>maze[i][j];
    } 
    MazeTrack(0, 0); //从起始点(0,0)开始走
    //输出路径
    for(int i=0; i<path_best.size(); ++i)
    {
    cout<<"("<<path_best[i][0]<<","<<path_best[i][1]<<")"<<endl;
    }
    } 
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    网络损伤仪HoloWAN的使用背景
    视频降噪一些原理
    数字孪生3D可视化,人员定位系统助力企业数字化转型
    环形链表(LeetCode 141、142)
    助力网络安全攻防演练 | 中睿天下获国网蒙东电力数字化事业部感谢信
    RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得
    Django 删除单行数据
    人工智能: 一种现代方法 第五章 对抗搜索
    LeetCode 0236. 二叉树的最近公共祖先
    数字IC设计笔试题汇总(四):一些基础知识点
  • 原文地址:https://blog.csdn.net/Ll_R_lL/article/details/128212281