C++笔试强训第十一天

Posted 不 良

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++笔试强训第十一天相关的知识,希望对你有一定的参考价值。

选择题

解析:内联函数是直接替换,没有函数栈帧的销毁,他往往使用在函数中没有循环和递归、代码较少的情况下,同时要求结构不能太复杂。

解析:重载函数的定义:在同一个作用域内,函数名相同,函数参数的类型或者函数参数个数不相同;函数重载和函数返回值没有关系。

解析:a构造了1次,b构造了一次,c构造了3次,AB *p[2]是一个指针数组,数组里面都是指针类型,并没有生成类。

解析:如果用户在类中没有显示定义赋值运算符重载时,编译器自动生成一份——按照浅拷贝方式实现的;

赋值运算符只能作为类的成员函数重载,如果重载成普通的成员函数编译器会报错,编译无法通过;

默认的赋值运算符是编译器自动生成的,按照浅拷贝实现;

重载的赋值构造只有一个形参,因为在参数中前面有一个隐藏的this;

拷贝构造和赋值运算符的重载是两个不同的函数;

解析:静态的成员不能在类的内部初始化,必须在全局进行初始化;

静态成员受访问限定符的限制;

静态成员为该类所有对象共有的,在访问限定符为public的情况下可以直接由类名直接访问,也可以由对象进行访问,一般更推荐类名+作用域访问。

解析:ad是一个数组指针,该指针指向一个PAT类型的数组,有3个连续的空间,并没有实例化出对象,所以不会调用构造函数。

解析:当我们没有自己实现析构函数的时候,系统会自动生成默认的析构函数,析构函数是没有参数的。

解析:该程序是没有错误的,myClass *a = new myClass();这里的小括号是用来初始化的,显然它用的是默认值,a->foo();这个也没有错误,会调用foo()进行释放动态开辟的空间。

delete this 代表把当前对象销毁掉

func里面为a new新空间,然后用a指向foo,然后将a对象销毁掉。

解析:构造函数可以有形参,但是析构函数没有形参,不管是析构还是构造函数都没有任何的函数类型。

解析:fun在实例化时,其传递的两个参数的类型必须要一致,如果不一致的话需要显示实例化。

对于模板,都是一个类型的T,当没有显示的实例化的时候,该函数的实参的类型必须相同,要不然模板在实例化的时候类型会错误,就不能进行模板的实例化。当显示的说明模板参数类型的时候,就已经实例化了,比如D选项。

编程题

1.最近公共祖先

本人思路:错误。

class LCA 
public:
 int getLCA(int a, int b) 
     // write code here
     int parent1 = a / 2;
     int parent2 = b / 2;
     if(parent1 == parent2)
         return parent1;
     return getLCA(parent1, parent2);
 
;

解析:当两个数都是子节点时,可以通过找父节点的方式去找公共祖先,但是要考虑当其中一个节点就是他们的公共祖先的情况。

下面代码的思路就是先找到较大节点,再找他的父节点,通过比较得到他们的公共祖先。

/*
满二叉树 parent = child / 2
		1
    2       3
 4    5   6   7
 较大的数找父节点,两个数相等时,就是公共祖先
*/
class LCA 
public:
    int getLCA(int a, int b) 
        while(a != b)
            if(a > b) // 让大的数除2就是parent
                a /= 2;
            else
                b /= 2;
        
        return a;
    
;

2.求最大连续bit数

解析:

方式一:连除法

思路:将十进制转换成二进制,每次取模得到的是二进制位中最后一个的位数值,如果取模为1,count++;取模为0的话说明当前二进制位上的数为0,要开始重新对count进行计算,和max_count进行比较,选出最大的。

复杂度分析:

  • 时间复杂度:O(log2^n),连除取余一共log2^n
  • 空间复杂度:O(1),无额外空间

max函数,是<algorithm>中的函数,用来比较大小。

#include <iostream>
#include <algorithm>
using namespace std;

int main() 
    int n;
    cin >> n;
    int max_count = 0;
    int count = 0;
    while (n) 
        if (n % 2 == 1)  //计算得到的是最后一位
            count++;
         else  //当最后一位不等于1时,和上次比较同时将count置0
            /*if (count > max) 
                max = count;
            */
            max_count = max(count,max_count);
            count = 0;
        
        n /= 2;
    
    /*if (count > max) 
        max = count;
    */
    max_count = max(count,max_count);
    cout << max_count;

方式二:

思路:这道题考察位运算

根据位运算,获取每一位的二进制值。获取第i位的值: (n >> i) & 1。如果1连续,则计数累加,如果不连续,则从0开始计数。

#include <algorithm>
#include <iostream>
using namespace std;

int main() 
    int n = 0;
    cin >> n;
    int count = 0;
    int max_count = 0;
    for(int i = 0; i < 32; i++)
    
        if(n & (1 << i))
        
            count++;
        
        else 
            max_count = max(count,max_count);
            count = 0; 
        
    
    cout << max_count;
    return 0;

方式三:

思路:当一个数和自己左移一位进行位与运算,相当于和自己错开一位进行的位与运算,如果有连续的1,经过错位位与之后会少一个1,如果没有连续的1,错位位与之后就是0。那么我们可以通过这种不断与自己的左移一位位与,直到为0,什么时候结束就说明最大有多少连续的1。

#include<iostream>
using namespace std;

int main()
    int n;
    while(cin >> n)
        int count = 0;
        for(; n != 0; count++) //统计能够运算多少次
            n &= n << 1; //与自己左移一位后比较
        cout << count << endl;
    
    return 0;

//
#include <iostream>
using namespace std;

int main() 
    int n;
    cin >> n;
    int count = 0;
    while(n)
    
        n = (n<<1)&n;
        count++;
    
    cout << count;

C++笔试强训第三十天

🎇C++笔试强训


  • 博客主页:一起去看日落吗
  • 分享博主的C++刷题日常,大家一起学习
  • 博主的能力有限,出现错误希望大家不吝赐教
  • 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。

💦🔥


选择题

💦第一题

下列关于线程的说法错误的是()

A 耗时的操作使用线程,提高程序响应

B 耗内存的操作使用线程,提高内存利用率

C 多CPU的系统使用线程,提高CPU利用率

D 并行操作使用线程,如c/s架构中服务端程序为每个客户端请求创建一个线程来响应

这道题的答案是B


💦第二题

如果将固定块大小的文件系统中的块大小设置大一些,会造成()。

A 更好的磁盘吞吐量和更差的磁盘空间利用率

B 更好的磁盘吞吐量和更好的磁盘空间利用率

C 更差的磁盘吞吐量和更好的磁盘空间利用率

D 更差的磁盘吞吐量和更差的磁盘空间利用率

这道题的答案是A


💦第三题

某系统中有11台打印机,N个进程共享打印机资源,每个进程要求3台,当N的取值不超过()时系统不会发生死锁。

A 4

B 5

C 6

D 7

这道题的答案是B


💦第四题

进程调度是从()选择一个进程投入运行。

A 就绪队列
B 等待队列
C 作业后备队列
D 提交队列

这道题的答案是A


💦第五题

下面有关Cache的说法哪一个是不正确的()

A 设置Cache的目的,是解决CPU和主存之间的速度匹配问题

B 设置Cache的理论基础,是程序访问的局部性原理

C Cache与主存统一编址,Cache的地址空间属于主存的一部分

D Cache的功能均由硬件实现,对程序员是透明的

这道题的答案是C


💦第六题

什么是内存抖动(Thrashing)( )

A 非常频繁的换页活动
B 非常高的CPU执行活动
C 一个极长的执行进程
D 一个极大的虚拟内存

这道题的答案是A


💦第七题

在所有非抢占CPU调度算法中,系统平均响应时间最优的是( )

A 实时调度算法
B 短任务优先算法
C 时间片轮转算法
D 先来先服务算法

这道题的答案是B


💦第八题

下面关于inode描述错误的是?

A inode和文件是一一对应的
B inode能描述文件占用的块数
C inode描述了文件大小和指向数据块的指针
D 通过inode实现文件的逻辑结构和物理结构的转换

这道题的答案是A


💦第九题

文件操作的唯一依据是?

A 文件名
B 文件句柄
C 物理地址

这道题的答案是B


💦第十题

十进制数-10的3进制4位补码是多少?

A 0010
B 1010
C 2122
D 2121

这道题的答案是C


编程题

🔥第一题

链接:最难的问题

  • 解题思路

密码 > ‘E’

  • 则:原文= 密码 - 5

  • 否则: 原文 = 密码 + 21

  • 代码演示

// write your code here cpp
#include<iostream>
#include <string>

using namespace std;

int main()

    string n;
    while(getline(cin,n))
    
        for(auto &e : n)
        
            if(e >= 'A' && e <= 'Z')
                e = (e >= 'F') ? (e - 5) : (e + 21);
        
        cout << n << endl;
    
    return 0;


🔥第二题

链接:因子个数

  • 解题思路

从最小因子2到数字的最大因子数(数字的平方根)开始判断是否能够取余
可以则循环取余直到取余不为0,因子个数+1;否则使用下一个因子计算;
最终整除了各个因子数之后剩余的数字不为1则本身也是一个因子,因此因子数+1

  • 代码演示
// write your code here cpp
#include <iostream>
#include <cmath>
using namespace std;

int main()

    int n;
    while(cin >> n)
    
        int count = 0;
        for(int i = 2;i <= sqrt(n);i++)
        
            if(n % i == 0)
            
                while(n % i == 0)
                    n /= i;
                count++;
            
        
        if(n != 1)
            count++;
        cout << count << endl;
    


以上是关于C++笔试强训第十一天的主要内容,如果未能解决你的问题,请参考以下文章

C++笔试强训第三十天

C++笔试强训第二天

C++笔试强训第五天

C++笔试强训第八天

C++笔试强训第六天

笔试强训每日一题