整理的面试题

栈和堆的区别

首先结构上的区别:栈是一种线性结构,而堆是一种树形结构。

其次存储角度的区别:

栈区,连续的内存区域,速度快,但空间小。存储值类型(函数参数,局部变量)、结构体。

堆区,不连续的内存区域,存储引用类型,new、malloc出来的对象。

交换两个数不需要第三个变量

加减法or位运算(异或)

https://blog.csdn.net/kangkermit/article/details/21371159

递归程序和非递归程序怎么转换

栈的思维!!!

几个题

有 1-100 的所有数 无序排列 怎么找出缺的那个?

1.求和做差2.标记法。

从 1-100 的选择数 其中99个数出现了偶数次,其中一个出现了奇数次,请问如何找到这个奇数次的数?

异或

从 1-100 的选择数 其中98个数出现了偶数次,其中两个个出现了奇数次,请问如何找到这两个奇数次的数?

先整体异或,分组找到某一位为1的异或,没有1的异或。

C、C++、Java的区别?

Java是面向对象的,c是面向过程的,c++中还留有一些面向过程的。

C和C++中有指针,而Java没有。

C和C++速度比Java快。

C++开发中需要自己去管理内存,但是Java中有自己的机制。

Const和define的区别?

const是在编译运行阶段处理,define宏是在预处理阶段进行。

const具有具体类型,在编译阶段进行类型检测;define宏没有类型,只是简单的字符替换,不做任何类型检测。

在C中,define可以用来防止头文件重复引用。

C 里面的栈的定义,栈空间由谁分配,栈会不会产生泄漏。

定义:栈是一种运算受限的线性表,仅允许在表的一端进行插入和删除运算。

是一块连续的内存区域,由系统分配,大小一般固定为1M。

系统栈一般是不会产生泄露的,因为系统会自动收回,但如果是我自己实现的一个栈,用到了new或malloc等,未能及时使用delete或free方法就极其产生隐蔽的内存泄漏。

简述 C 从源文件到生成可执行文件的步骤,讲一下编译器优化。

预处理、编译生成.o文件、连接成可执行文件

编译器优化:常量传播、常量折叠、复写传播、公共子表式消除...

https://blog.csdn.net/dd864140130/article/details/49495259

new 和 malloc 的差别

malloc配套free,new配套delete。

malloc在堆上分配内存,new在自由存储区分配内存,自由存储区可以是堆,还可以是静态存储区。

malloc内存分配成功返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

new内存分配成功时返回对象类型的指针,无需转换。

malloc内存分配失败返回NULL,new分配失败时抛出异常,通常用try/catch来捕捉,不会返回NULL

malloc是标准库函数,而new是运算符,new/delete既能完成动态内存分配和初始化工作,又能完成清理与释放内存工作。

class和struct的区别

class中变量默认为private,struct中默认为public,C++中存在struct关键字是为了兼容以前用C开发的项目。

c++的多态

静态多态(编译时多态):函数模板、类模板、函数重载、运算符重载

动态多态(运行时多态):虚函数

图和树的区别

树是没有环的,树是特殊的图。

c++模板和继承

模板:模板是实现代码重用的一种机制,可分为函数模板和类模板,使用模板是为了让程序员编写与类型无关的代码。

继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称派生类。

虚基类

虚基类的申明只在类的派生过程中使用了virtual关键字,使得菱形继承,从不同路径继承过来的同名数据成员在内存中就只有一个副本。

怎么找中位数以及复杂度

O(n)求第n/2大的树,快排思想。

哈希索引和B+树索引有啥区别?

B+树上的常规检索,从根节点到叶子结点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。因此B+树索引被广泛应用于数据库,文件系统等场景。

哈希索引就是采用一定的哈希算法,把键值换成新的哈希值,检索时只需一次哈希算法就可以定位到相应的位置。

两者的区别:

如果是等值查询且键值是唯一的,那么哈希索引就有绝对优势。

如果是范围查询,这时哈希就无用武之地了,因为原先有序的键值经过哈希可以变得不连续,就没办法完成范围查询,像like这种模糊查找就很难实现了。

B+树索引的关键字检索效率比较平均,不想B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也极低,因为有重复碰撞。

 

DP和分治区别

DP:通过把原问题分解为相对简单的子问题,一般有递推式,动态规划常常适用于有重叠的子问题。

分治:是把原问题分解为若干个子问题,自顶向下求解子问题,合并子问题的解,从而得到原问题的解。

不同点:分治将分解后的子问题看成相互独立的,通过用递归来实现,而动态规划将分解后的子问题看成相互有联系的,有重叠部分,需要记忆,通常用迭代来实现。

排序最好的是什么

快速排序的综合性能最好。若输入已经是有序的,则插入排序最快。

堆排序所用的辅助空间少于快速排序。

若所要排序的文件很大,不能一次性排完,则可使用归并排序。

解决hash冲突的三个方法

开放定址法:线性探测再散列、二次探测再散列

再哈希法

链地址法

C里面静态数据是分配在什么里面啊?

好像是静态变量区存储的吧?

C语言的指针、数组指针与指针数组的区别

指针即地址。

数组指针就是数组的指针,是一个指向一维数组的指针。

指针数组就是指针的数组,数组中每个元素都是指针。

给一个数组q,一个关键字k,在尽可能短的时间里找出数组里是否有两个数的和相加为k。

可以用空间换时间,两次循环O(n)

static作用

在C中,static用于不同文件之间的隐藏。Static变量只能一次初始化,默认值为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值