C++程序员 / 软件开发 常见面试题(合集11-20)

11.深拷贝和浅拷贝的区别

  • 浅拷贝:简单的赋值拷贝操作
  • 深拷贝:在堆区重新申请空间,进行拷贝操作

对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。这是由于编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数,进行的是浅拷贝!浅拷贝可以理解为简单的复制粘贴,浅拷贝带来的问题是:可能会重复释放两次指向同一个位置的空间。

浅拷贝是让两个指针指向同一个位置。而深拷贝是让另一个指针自己再开辟空间,所以,在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存泄漏发生。

12.new和malloc的区别

(详情请看c++ new 与malloc有什么区别

特征new/deletemalloc/free
分配内存的位置自由存储区
内存分配成功返回类型需要强转,返回对象类型的指针返回void*
内存分配失败返回值分配失败抛出bac_alloc异常返回NULL
分配内存的大小由编译器根据类型计算得出必须显式指定所需内存大小
处理数组有处理数组的new版本new[]需要用户计算数组的大小后进行内存分配
已分配内存的扩充不可以重新分配内存不够可以重新分配,使用realloc简单完成
是否相互调用可以,看具体的operator new/delete实现不可调用new
分配内存时内存不足客户能够指定处理函数或重新制定分配器无法通过用户代码进行处理
函数重载允许不允许
构造函数与析构函数调用不调用
释放指针指向的内存delete p,数组delete[ ] pfree( p )

联系:new的底层实现需要调用malloc,并且可以实现重载。

13.队列和栈的区别

  • 队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;
  • 栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。

① 队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈。

② 栈是先进后出。队列是先进先出。

③ 栈只允许在一端进行插入和删除,队列则在表的一段插入另一端删除。

④ 在栈中遍历数据需要扫描全部数据,所以比较慢。而在队列中可以从两端进行所以速度比较快。

14.决策树过拟合原因和解决办法

原因:
① 建模样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;

② 样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;

③ 建模时使用了样本中太多无关的输入变量。

解决办法:
① 合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;

② 剪枝是决策树学习算法对付“过拟合”的主要手段

  • 预剪枝:在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶节点。
  • 后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若是该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

15.排序算法时间复杂度

时间复杂度

16.二分查找(折半查找)

前提:使用二分法(折半查找)必须数组是有序的,否则不能用此方法。动图展示
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size() - 1;
        while(low <= high){
            int mid = (high - low) / 2 + low;
            int num = nums[mid];
            if (num == target) {
                return mid;
            } else if (num > target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }
};

17.二叉树特性

① 深度为K的二叉树至多有 2 K 2^{K} 2K-1个结点( K ≥ \geq 1)。

② 二叉树第 i 层上至多有 2 i − 1 2^{i-1} 2i1个结点( i ≥ \geq 1)。

③ 对于任何一棵二叉树T,如果其叶子数为 n 0 n_0 n0 ,度为2的结点数为 n 2 n_2 n2 ,则 n 0 n_0 n0 = n 2 n_2 n2 + 1,总结点数为 n n n = n 0 n_0 n0 + n 1 n_1 n1 + n 2 n_2 n2

④ 具有 n 个结点的完全二叉树的深度为⌊ log ⁡ 2 n \log_2n log2n⌋+1(⌊x⌋表示不大于x的最大整数)

18.数据结构(概念理解非面试题)

数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系操作的学科。

  • 数据:能被输入计算机且能被计算机处理的各种符号集合。
  • 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行处理。(与数据关系:集合的个体)
  • 数据项:构成数据元素的不可分割的最小单位。
  • 数据对象:性质相同的数据元素的集合。(与数据关系:集合的子集)

19.算法与程序的区别(概念理解非面试题)

  • 算法:是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法
  • 程序:是用某种程序设计语言对算法的具体实现。
  • 程序=数据结构+算法,数据结构通过算法实现操作,算法根据数据结构设计程序。

20.三种参数传递方式

习惯上大家把参数传递分为三种方式,值传递、地址传递、引用传递。

总结

这是我在面试或笔试中遇到的问题,在这里做个简单的总结,欢迎大家的指正和批评,或者有补充的可以在底下留言。

推文预告
1、C++常见面试题(合集21-30)。
2、关于image_caption 的手把手实现。
3、C++复习日常。
4、深度学习其他内容的尝试。
以上会不定时更新,欢迎关注我。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值