秋招中,C/C++相关面试的问题总结

基本情况:秋招中,一些面试中,C/C++问题总结

重要问题说三次,面试前,一定一定一定要注意准备:
数据结构和算法!
数据结构和算法!
数据结构和算法!

1、结构体对齐
答:结构体字节对齐的细节和编译器实现相关,但一般需要满足三个基本原则:
1)结构体变量的首地址能够被最宽基本类型的成员的大小所整除
2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节
3)结构体的总大小为结构体最宽基本类型成员的整数倍。

2、结构体复制
答:C++里面的话,将结构体视为类来处理。采用修改拷贝构造函数来实现深拷贝达到复制目的。

C的话,只能写一个单独的函数来实现,开辟内存,释放内存,两者赋值函数。

3、strcpy有什么缺陷
答:strcpy(出参,入参(原始参数)),该函数就是把入参拷贝到出参,如果出参所指的内存空间不够大,会导致缓冲溢出的错误情况。

4、说出所有排序、快速排序思路、堆排思路
答:选择排序、冒泡排序、插入排序、快速排序、希尔排序、桶排序

选择排序:
这种排序方式比较容易理解,利用循环,每次找一个元素放在它最终的位置上,比如先找到最小的元素,放在首位,然后再剩下的元素中找到最小的,依此类推,最终从小到大排好。

冒泡排序:
这是另一种常见的排序方式,通过对违反顺序的相邻元素进行调整以达成目标,假设需要从小到大进行排序,那么每次循环都会从头开始比较相邻两个元素的大小,小的放在前面,大的放在后面,一轮结束后,最大的元素(泡)便被“冒”到了最后。每次循环都是如此。在循环中可以加一个终止条件:如果一轮下来后没有过调整次序,那么说明已经排序完毕,跳出循环即可。

插入排序:
顾名思义,是将新的元素插入到原来已经排列好的一组数中。在具体实现时,可以将数组分为两部分。第一部分是除最后一位的其它所有元素,并且给出一个空间,使得可以让第二部分中的待插入元素有位置;第二部分是待插入的元素。第一部分排完序后,操作第二部分。虽然插入排序和选择排序的时间复杂度一样,但是插入排序的第二重循环可以提前结束,不需要遍历到开始位置。尤其是对于已经快要排列好的数组。

快速排序:
快速排序是一种相当高效的算法,主要采用的分治的思想方法。一次排序过后,确立一个枢轴,放在某个位置,让左边的数都小于它,右边的数都大于它。主要是搞清一轮探测到底要达成什么目的,上下的只需要递归即可。取一左一右向中间慢慢移动,一旦发现有前大于后,就交换,知道两者相碰,设置第一个数作为枢轴,开始递归。

希尔排序:
希尔排序是在不相邻的元素之间进行交换等操作。

桶排序:
顾名思义,我们需要放置桶,对于简单的例子,可以按自然数依次放置,对于难以处理的大型数据,可以考虑“加大”桶放置的种类,使得一个区间内的都可以放进来,再对其中的各个元素进行排序。

堆排思路:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆; 将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端; 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

5、数组和链表区别
不同点:链表是链式的存储结构,通过指针连接元素与元素;数组是连续的存储结构,元素按照次序依次存储,查询比较简单,插入删除比较复杂。

相同点:两种结构均可以实现数据的顺序存储,构造出来的模型呈线性结构。

6、什么是哈希冲突以及解决方式;哈希表长度为什么是质数
答:
1)哈希冲突原因,哈希是通过对数据进行再压缩,提高效率的一种方法。但是由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致通过哈希函数处理后仍然有不同的数据对应相同的值,这时候就产生了哈希冲突。(数据量大,而哈希函数产生的哈希值有限,导致多对一冲突)

2)解决哈希冲突方式(做到一对一而不是多对一):开发地址法、链式地址法、建立功能溢出法、再哈希法。

3)原因实在hash函数中,你要用这些质数做模运算(%),而分析发现,如果不是用质数来做模运算的话,会导致许多数据分布会集中在某些点上面,所以会选择质数来做模的除数。正因为质数做模的除数,模完之后,数据会在0到所选质数之间,自然导致长度也为质数了。

7、malloc最大申请多少内存,底层实现原理是什么
答:malloc中文名称是动态内存分配,最大可以申请的内存为,除去系统内核使用的以外的内存,但一般稍微小一些。比如Windows32位系统,4g内存,系统用了2g,那么可以申请到的内存就是1.9g左右了。

实现原理是,Linux的话,系统调用brk()函数或者mmap()函数来开辟内存空间的。

8、反转字符串中单词顺序
答:第一步,反转所有的字母顺序;第二部,根据空格或者,号为界,反转单词。最后,达到目的。

9、两个字符串找最大公共子串
答:简单的思路就是循环查找,先找出较短的字符串并求出其长度,根据长度进行相应的循环,从大到小的方式来查找。

10、n*n的格子,放了m个地雷,如何让每个格子放的雷概率相等
答:需要一个生成1-n的随机数生成器,然后每次调用两次生成x,y,作为地雷放置的位置,如果位置重复则舍弃,重复执行直到获得m个位置。

11、强行转换指针类型会导致什么问题?
答:有可能内存类型解析不正确。比如16位系统中,int类型2字节,float类型4字节,int类型指针,会读到2个字节的内存空间内容;强行转为float类型,会读到4个字节内容,而后面的两字节是什么内容,我们不清楚,导致可能的问题发生。

12、printf有可能会存在什么的弊端?
答:printf()函数维持一个要打印的变量栈,参数从右到左入栈,连续的。当打印时候,printf根据字符转换的说明如要求输出%f类型就提取8字节的数据,%d就提取4字节数据,从低地址开始提取数据,直到所有参数打印完成;当然,它并不知道里面放了多少个参数的。这过程,可以发现,printf()输出时候,它并没有进行边界检测的,只是根据输出类型要求,强行读取内存中的数据当作正常数据输出,从而导致了堆溢出问题。

13、如何快速查找数组中第k个元素?
答:可以考虑选择排序,冒泡排序,快速排序。

14、大顶堆、小顶堆区别是什么?
答:大顶堆、小顶堆来自堆排序里面的,堆属于一种二叉树维护的一维数组结构,根据特点,可以把堆分为大顶堆和小顶堆。
大顶堆:每个结点的值都是大于或等于其左右孩子结点的值
小顶堆:每个结点的值都是小于或等于其左右孩子结点的值

15、结构体里面,强行将4字节类型,分配8字节,会导致对齐出现什么问题?
答:
题外知识:为了提高CPU访问内存的效率,CPU可能会在读取数据时会一次性读取4个字节、或者2个字节、或者8字节等大小的数据,所以编译器在把数据存放于内存时,会自动对齐。
而,结构体中,一般字节对齐原则是以最大的成员占据的空间大小对齐,也会遵循变量的占据的空间大小依次对齐。
例如:一个结构体,依次 char char int 根据最大的4字节对齐,共占据8字节(对应前半句说明);
另一个结构体,依次是,double short int short,先是8字节对齐,然后是4字节对齐,一共字节数为20字节(对应后半句说明)。

参考:https://www.cnblogs.com/starboy/p/11693675.html以及其他网页

######################
通过秋招这次历练,发现,只是刷C/C++的基本语法这些题目是不行的(笔试阶段很有用处),但也要十分注意数据结构和算法的练习!
算是自己一个教训吧,自己方针出了问题,导致基本上一面过后就没有下文了。

猜你喜欢

转载自blog.csdn.net/qq_45701501/article/details/109317931