• 【笔试刷题训练】day_17


    一、选择题

    在这里插入图片描述
    A:虚函数的作用是实现了多态,虚函数的实现利用了继承
    B:✔
    C:虚函数需要先去虚表中找到函数地址再进行调用,与编译期间就确定地址的静态函数相比,效率较低。✔
    D:必须借助父类指针 / 引用 ✔

    在这里插入图片描述
    A,B,C说法都没问题
    D:覆盖也叫重写,函数必须是相同函数名,并且参数个数和类型都相同,题目说法❌

    在这里插入图片描述
    多态的条件之一:父类的指针或引用去调用,所以引用可以作为产生多态效果的手段!
    子类对象 赋值给基类对象 / 基类引用 / 基类的指针是可以发生的,也叫做切片,即指向父类的那一部分。选项B说法是错误的
    但是基类对象如果要赋值给子类对象引用,可以通过强制类型转换来实现,但是通过强制类型转换是不安全的!只有父类的指针或引用是指向子类对象的时候,这时候再赋值给子类对象的指针或引用 才是安全的。

    在这里插入图片描述

    • 首先new B时候:
      先调用父类构造去构造父类的部分,在父类构造中调用p()函数,此时在构造函数中多态的机制还未实现,因为子类的虚表指针还没有指向自己的虚表!所以调用基类的p() ,输出A
    • 然后回来调用子类构造,调用子类构造掉用B的p()函数,输出B
    • delete a:先调用析构函数,因为析构实现了多态的条件,所以会调用子类的析构,子类析构中:调用子类的p()输出B,然后子类析构结束时会自动调用父类的析构函数,此时子类已经析构并释放了,在父类的析构中调用的p()只能是父类的p() 从而输出A

    所以最终答案为 ABBA

    二、编程题

    1. 杨辉三角的变形

    👉 题目链接

    直接思路

    image-20221107085157378

    代码:

    #include
    #include
    using namespace std;
    int findIndex(int n)
    {
        //初始化二维数组
        vector<vector<int>> vv(n,vector<int>(2*n-1,0));
        //设置第一列和最后一列有效数为1
        for(size_t i = 0;i<n;++i)
        {
            vv[i][0]=1;     //第一列
            vv[i][2*i]=1;   //最后一列
        }
        //遍历赋值每一个位置
        for(size_t i = 0;i<n;++i)
        {
            //第一列和最后一列不用赋值
            for(size_t j = 1;j<2*i;++j)
            {
               //如果是第二列,只需要加上一行的两个数
               if(j==2)
               {
                   vv[i][j] = vv[i-1][j]+vv[i-1][j-1];
               }
               else
               {
                   vv[i][j] = vv[i-1][j-2]+vv[i-1][j-1]+vv[i-1][j];
               }
            }
        }
        //遍历最后一行
        for(size_t i=0;i<2*n;++i)
        {
            if(vv[n-1][i]%2==0 && vv[n-1][i]!=0)
            {
                return i+1;
            }
        }
        return -1;
    }
    int main()
    {
        int n;
        while(cin>>n)
        {
            int odd = findIndex(n);
            cout << odd << 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

    但是这一提交,发现内存超额!说明程序还有其他的完善空间

    改进

    image-20221107085306135

    #include 
    using namespace std;
    
    int main()
    {
        int n;
        static int arr[] = {2,3,2,4};
        while(cin>>n){
            if(n<3){
                cout << -1 << endl;
            }
            else{
                cout << arr[(n-3)%4]<<endl;
            }
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.

    👉 题目链接

    计算某字符出现次数

    #include
    #include
    using namespace std;
    
    int main(){
        string str;    
        char ch;
        getline(cin,str);
        cin >> ch;
        int count=0;
        for(auto& i : str)
        {
            //如果ch不是字母:看ch和i是否相等
            //如果ch是字母,ch和i可能是大小写字母,或者同为大写或小写
            if(ch==i || (isalpha(ch) && isalpha(i)&&(ch==i || ch==i+32 || ch+32==i))){
                count ++;
            }
        }
        cout << count <<endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

  • 相关阅读:
    大学生计算机相关专业有什么血泪建议吗?
    体验不尽,进化不止,看视频云技术六大创新
    Apache Pulsar 系列 —— 深入理解 Bookie GC 回收机制
    3.24 OrCAD中移动元器件时怎么让连线不跟着元器件一起动? OrCAD中如何添加文本标注、图形标注?
    spring aop 初探
    【C++】MyString
    数据结构详解①——诸论
    高级IO函数
    现代循环神经网络 - 序列到序列学习
    【附源码】计算机毕业设计SSM税务综合信息平台
  • 原文地址:https://blog.csdn.net/K_04_10/article/details/127718766