【C/C++】刷题笔记

119 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

每天进步一点点,我们就能遇见更好的自己一起来打卡加油!

微信图片_20220620151051.jpg

我们都会在各自喜欢的事情里,变得可爱!

提示:以下是本篇文章正文内容,下面案例可供参考


一、选择题

1、下面程序段包含4个函数,其中具有隐含this指针的是()

int f1();

classT{

public:static int f2();

private:friend int f3();

protect:intf4();

A、f1

B、f3

C、f2

D、f4

答案:D。分析:

1、静态变量没有this指针

2、友元函数没有this指针

3、类外面的变量没有this指针

4、类里面的普通成员函数有指针

所以,f1, f2, f3都没有this指针。

2、 C++中关于堆和栈的说法,哪个是错误的()

A、堆的大小仅受操作系统的限制,栈的大小一般较小

B、堆和栈都可以静态分配

C、在堆上频繁的调用new/aelete容易产生内存碎片,栈没有这个问题

D、堆和栈都可以动态分配

答案:B。分析:

栈和堆都能动态分配地址,但是堆没有静态的堆

3、关于虚函数的描述正确的是()

A、派生类必须重新定义基类的虚函数

B、派生类的虚函数与基类的虚函数具有不同的参数个数和类型

C、内联函数不能是虚函数

D、虚函数可以是一个static型的函数

答案:A。分析:派生类必须重新定义基类的虚函数,完成重写才能调用。 虚函数不可以是一个static函数。

4、C++将父类的析构函数定义为虚函数,下列正确的是哪个()

A、这样做是错误的

B、释放父类指针时能正确释放子类对象

C、释放子类指针时能正确释放父类对象

D、以上全错

答案:D。分析: 在释放父类指针时,如果父类指针指向了一个子类对象,那么可以调用子类的析构继而调用父类的析构,删除这个对象,防止内存泄漏问题。

5、 当一个类对象的生命周期结束后,关于调用析构函数的描述正确的是:()

A.如果派生类没有定义析构函数,则只调用基类的析构函数

B.如果基类没有定义析构函数,则只调用派生类的析构函数

C.先调用派生类的析构函数,后调用基类的析构函数

D.先调用基类的析构函数,后调用派生类的析构函数

答案:C。分析:析构过程和构造相反, 先调用派生类的析构函数,后调用基类的析构函数。

6、下面叙述不正确的是(D)

A派生类一般都用公有派生

B对基类成员的访问必须是无二义性的

C赋值兼容规则也适用于多重继承的组合

D父类的公有成员在派生类中仍然是公有的

答案:选D。分析:子类通过公有继承,父类的公有成员在派生类中仍然是公有的,但是如果是私有继承,父类的公有成员在派生类中算私有的。

7、以下关于纯虚函数的说法,正确的是()

A、子类必须实现基类的

B、声明纯虚函数的类不能实例化

C、声明纯虚函数的类成虚基类

D、纯虚函数必须是空函数

答案: B。分析:B答案:抽象类不能声明对象,只是作为基类为派生类服务。

8、下列关于多态性说法不正确的是()

A、重载方式包含函数重载和运算符重载

B、多态性是指同名函数对应多种不同的实现

C、重载方式仅有函数重载

D、多态性表现为静态和动态两种方式

答案 C。分析:重载方式不仅有函数重载,运算符重载,但是运算符重载严格也是算函数重载。 9、下列哪种函数可以定义为虚函数()

A、析构函数

B、内联成员函数

C、静态成员函数

D、构造函数

答案: A。 分析:析构函数是可以被定义为虚函数。

10、现有一循环队列,其队头指针为front,队尾指针为rear,循环队列长度 为N,最多存储N-1个数据。其队内有效长度为()

A.(rear-front + N)% N+1

B.(rear-front +N)% N

C.(rear-front)%(N+1)

D.(rear-front+N)%(N-1)

答案: B。分析:有效长度一般是rear-front,但是循环队列中rear有可能小于front,所以需要+N,最大长度为N,所以有效长度不可能超过N,故需要%N。

二、编程题

1、参数解析

image.png

image.png

题目分析:首先是这题读入有空格,需要用getline解析出来的每一个参数用vector存。

代码分析:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
    string str;
    while (getline(cin, str)) {
        bool flag = false;
        vector<string> vec;
        string row;
        for (int i = 0; i < str.size(); i++) {
            if (flag) {//在括号内
                if (str[i] != '"') row += str[i];
                else flag = false;
            } else {
                if (str[i] == ' ') {
                    vec.push_back(row);
                    row = "";
                } else if (str[i] == '"') flag = true;
                else row += str[i];
            }
        }
        vec.push_back(row);
        cout << vec.size() << endl;
        for (auto i : vec) cout << i << endl;
    }
    return 0;
}

2、跳石板

image.png

image.png

贪心解法

#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
#include <algorithm>
using namespace std;

int main(){
    int N,M;
    while(cin>>N>>M){
        vector<int> steps(M+1,INT_MAX);
        steps[N] = 0;
        for(int i=N;i<=M;i++){
            if(steps[i] == INT_MAX){
                continue;
            }
            for(int j=2;(j*j)<=i;j++){
                if(i%j == 0){
                    if(i+j <= M){
                        steps[i+j] = min(steps[i]+1,steps[i+j]);
                    }
                    if(i+(i/j) <= M){
                        steps[i+(i/j)] = min(steps[i]+1,steps[i+(i/j)]);
                    }

                }

            }
        }
        if(steps[M] == INT_MAX){
            steps[M] = -1;
        }
        cout<<steps[M]<<endl;
    }
    return 0;
}

动态规划解法:

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
vector<int> v[N];
int f[N];
int n,m;

int main()
{
    cin>>n>>m;
    
    memset(f,0x3f,sizeof f);
    
    for(int i=n;i<=m;i++)
        for(int j=2;j<=i/j;j++)
            if(i%j==0)
            {
                v[i].push_back(j);
                if(i/j!=i) v[i].push_back(i/j);
            }
    
    f[n]=0;
    
    for(int i=n;i<=m;i++)
        for(auto x:v[i])
            if(i+x<=m) f[i+x]=min(f[i+x],f[i]+1);
    
    if(f[m]!=0x3f3f3f3f) cout<<f[m];
    else cout<<-1;
    
    return 0;
}

总结

本文总共讲了10题有关多态的选择题,以及两道牛客编程题,希望大家读后能够有所收获!