前后端开发, 面试(1)—— LYYL : C++/C#等的list问题、堆栈问题、字符串问题。

一、问题描述:

  1、c#中字符串连接,使用+和使用string.format格式化两种方式的区别?

    答:主要是内存分配问题。

      1)当待连接的字符串在6个以下时,可以使用"+"连接;

      2)当待连接的字符串在6个以上时,大多使用StringBuilder较为合适;

    详细说明:

      1)使用“+”最终会等价为使用String.Concat方法,一般是连接一次分配一次内存(这里需要查验),但当一次连接,连接多个时,只会分配一次内存。

      2)使用StringBuilder进行连接,只会分配一次内存。当内存不足时,会自动成倍扩展内存。毕竟分配内存的时间开销是很大的。
    

  2、c++中堆和栈的区别?

  3、简述c++中的list?

    list是一种序列式容器,完成的功能实际上与数据结构中的双向链表很相似。 

    1)   List是stl实现的双向链表,与向量(vectors)相比,它允许快速的插入和删除,但是随即访问却比较慢。使用时需要添加头文件:#include<list>

    2)c++/c中vector与list的区别?

      1'. vector:与数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随即存取,时间复杂度为o(1);但是因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n);另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。如果需要高效地随即存取,而不在乎插入和删除的效率,应当使用vector.

      2'. list:list是由双向链表实现的,因此内存空间是不连续的。只能通过指针访问数据,所以list的随即存取都非常没有效率,时间复杂度为o(n);但是由于链表的特点,因此能够高效地进行插入和删除。如果需要大量的插入和删除,而不关心随即存取,应当使用list。

      3'. list每次增加一个元素,不存在重新申请内存的情况,它的成本是恒定的。

        vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。在销毁旧内存的时候,会调用析构函数,存在析构成本。所以在存储复杂类型和大量元素的情况下,list比vector更有优势。

 

二、背景:

  工作内容要求:开发搬砖无技术(hr说的),要有可塑性。

  我也不知道怎么就变成开发了,投的图像处理,然后开发电话来了,开发都不记得了。很尴尬,要复习一下的。

 

三、参考:

  list参考:

  https://www.cnblogs.com/goahead--linux/p/11490342.html

  https://blog.csdn.net/yas12345678/article/details/52601578

  c#参考:

  https://www.cnblogs.com/dawenyang/p/6245471.html

  

posted @ 2021-01-17 15:52  张幼安  阅读(168)  评论(0编辑  收藏  举报