2022暑期复习-Day6

选择题

Q1 关于类模板的说法正确的是()

A: 类模板的主要作用是生成抽象类
B: 类模板实例化时,编译器根据给出的模板实参生成一个类
C: 在类模板中的数据成员具有同样类型
D: 类模板中的成员函数没有返回值

类模板在编译器对其实例化时会自动创建/隐式创建一个响应类型的类。

生成抽象类是继承中的一种应用,有时候,用不到

类模板中的成员,对于类型的实例化,并不一定只有一种类型

类模板的函数要实例化才能使用,而函数使用就需要返回值

答案:B

Q2 下列代码可以通过编译吗?( )选项修改使其通过编译

在这里插入图片描述
A: 编译通过
B: 应该去掉static关键字
C: 调用应该如下: sum<int>:: foo(1,3)
D: 调用应该如下: sum::<int>foo(1,3)

就算是静态成员函数,没有this指针,不需要通过对象来调用,但还是需要指定类域,且这是一个模板函数,也算需要实例化的

答案:C

Q3 以下关于 STL 的描述中,( )是错的。

A: STL容器是线程不安全的
B: 当容量不够时,vector内部按照倍数方式扩容的
C: std::sort是稳定排序
D: std::stack默认是用deque实现的

STL的容器并不是线程安全的,这点可以看看侯捷老师的书

STL实现vector容器扩容是以 1.5倍或2倍的容量进行扩容,这是经过计算和在插入与时间上的考量

std的sort底层就是快排,快排是不稳定的,会导致数据交换,时间复杂度最坏情况下可以到达O(N^2)。具体可以参考2022暑期复习-Day2-Q1

STL的stack和queue实际上都是一个容器适配器,就算再某个容器的基础上封装了一定的功能。
底层是deque,这个容器本来像解决解决链式结构和顺序结构的缺陷,结合顺序结构随机存取的特性和链式结构任意插入删除的特性,最和结合出来一个分段数组,每个数组里都是一个链式结构的东西。最后失败了

Q4 关于 stack 和 queue 的说法正确的是( )。

A: stack底层默认使用vector实现,queue底层默认使用list实现
B: 获取stack和queue中任意元素操作的时间复杂度为O(n)
C: stack 和 queue 都可以称为容器适配器,因为其底层就是将某个容器重新包装了,默认包装的是deque
D: stack 和 queue 中插入、删除时间复杂度为O(1),遍历时间复杂度为O(n)

栈和队列想要查找元素是需要一个个去遍历的,所以时间复杂度是O(N)
而插入和删除,这一点是可以直接操作,不需要遍历之类的。

答案:BCD

Q5 下面有关 vector 和 list 的区别,描述错误的是( )。

A: vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随即存取
B: list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list
C: vector<int>::iterator支持“+”、“+=”、“<”等操作符
D: list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符

vector和list,顺序结构和链式结构的特性
对于容器的迭代器而言,实际上可以看成是封装了的指针。
链表又不能随机存储,[]运算符重载是不具备的

答案:D

编程题

Q6

在这里插入图片描述

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int odd = 1;//负责找奇数下标中的偶数
        int even = 0;//负责找偶数下标中的奇数
        int len = nums.size();
        while(odd<len|| even<len)
        {
            while(odd<len && nums[odd]%2==1)
                odd+=2;
            while(even<len && nums[even]%2==0)
                even += 2;
            if(odd<len&&even<len)
            {
                int tmp = nums[odd];
                nums[odd] = nums[even];
                nums[even] = tmp;
            }
        }
        return nums;
    }
};

都加了判断,所以不用担心越界访问的问题。

Q7

在这里插入图片描述
像这个题目,使用动态规划比使用滑动窗口来的简单快。
滑动窗口 需要把握 窗口区间的左右移动,在本题中没有那么明显的边界判断,所不是很好用

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int Max=nums[0];
        int sum=0;
        for(auto num:nums)
        {
            sum=max(sum+num,num);
            if(Max<sum)
                Max=sum;
        }
        return Max;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值