【笔试刷题训练】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<iostream>
#include<vector>
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;
}

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

改进

image-20221107085306135

#include<iostream> 
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;
}

2.

👉 题目链接

计算某字符出现次数

#include<iostream>
#include<string>
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021狮子歌歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值