######################################## 题目 ######################################## 摘抄一些面试题或者其他题目 三七互娱 2018 笔试题 **************************************** 转载自 `三七互娱2018笔试题 `_ 三七互娱,一个小时,十个简答题,也许是想用时间先刷掉一批人吧。 一、指针和引用的区别? #. 指针可以不初始化,引用必须初始化。 #. 指针可以改变其指向,引用一经引用,无法改变。 #. 指针有二级指针,引用没有二级引用(C++11 标准除外)。 #. sizeof 一个指针,32 位机器下为 4 字节,sizeof 一个引用,求的是引用对象的字节数。 指针和引用在汇编上都是一样的,都是在栈上开辟一块内存,用于存放指向对象的地址。只不过是引用直接将引用对象的地址放入寄存器中,而指针则是先将自己的地址放进去,取得指向对象的地址。 二、单链表的逆置? .. code-block:: cpp typedef struct Node { int data; struct Node *next; }Node,*List; void ListRevers(List head) { assert(head!= NULL); if(head==NULL || head->next==NULL) { return ; } Node *p = head->next; Node *q; head->next = NULL; while(p != NULL) { q = p->next; p->next = head->next; head->next = p; p = q; } } 三、内存分配的方式有几种? 静态存储区 栈 堆 的内存分配 #. 从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,例如全局变量。 #. 在栈上创建。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数结束时这些存储单元自动被释放。处理器的指定集中有关于栈内存的分配运算,因此效率比较高,但是分配的内存容量有限。 #. 在堆上分配内存,亦称动态内存分配,程序在运行的时候用 malloc 函数或 new 运算符申请任意大小的内存,程序员要用 free 函数或 delete 运算符释放内存。动态内存使用非常灵活,但问题也很多。 四、STL 中的容器有哪些,他们的特征? 顺序容器:vector,list,deque 关联容器:set,multiset,map,multimap 容器适配器:queue,stack vector 的底层是一个动态开辟的可变长的数组,他的内存是连续的。定义一个 vector,在 32 位机器,VS 下,栈上的大小为 20 字节,五个指针。bool 类型的话为 24 字节。它所指向的堆上 vector 数组的初始大小为 0,每次呈二倍增长方式,VS 其实不为 2。他适合查找和以及尾插,尾删数据。 list 的底层是一个带头结点的双链表,他默认开辟一个头结点。可以使用 splice 方法,将一个链表上数据切下来链到另一个链表上。 deque 底层是一个动态开辟的二维数组,默认开辟的大小为,int size = 4096 > sizeof (Ty) ? 4096/sizoef (Ty) : 1。 五、20 个人轮流报数,数到 3 的人出局,求出局的序列? .. code-block:: cpp void fun() { vector ve(20, 0); int num = 0; while(num < 20) { for(int i = 0; i < 20; ++i) { if(ve[i] == 0) num++; if(num == 3) { ve[i] = 1; num = 0; cout << i << " "; } } } cout << endl; } 六、写出 String 类的构造,拷贝构造,赋值,析构函数? .. code-block:: cpp class String { public: String(const char *str) { if(str == NULL) { m_data = new char[1]; m_data = '\0'; } else { m_data = new char[strlen(str) + 1]; strcpy(m_data, str.m_data); } } String(const String &it) { m_data = new char[strlen(it.m_data) + 1]; strcpy(m_data, it.m_data); } ~String() { delete[] m_data; m_data = NULL; } String &operator=(const String &it) { if(this == &it) { return *this; } delete[] m_data; m_data = new char[strlen(it.m_data) + 1]; strcpy(m_data, it.m_data); return *this; } private: char *m_data; }; 其次还有一道数据库的题印象颇深,剩余的题就没有什么了。 2018 三七互娱春招 C++ 笔试题 **************************************** 转载自 `2018三七互娱春招c++笔试题 `_ 一共 10 道题,除了简答就是编程。 #. c++ 类的析构 #. delete 和 delete [] 的区别 #. ++ 的使用 #. 定义宏 ADD(a,b)为 a*b,放到运算中求值,题目要求输出这个值。 #. 指针和引用的区别 #. 代码定义了一个常量指针和一个指向常量的指针,问 2 个指针有什么区别 #. 写函数:已知单链表表头 head,求倒数第三个数的值 #. 写算法:20 个人围成一圈数数,数到 3 的人站出来,直到最后一个人站出来,输出站出来的人的序列 #. SQL 基本语句的使用 #. string 类的成员函数补全,包括 3 种构造函数和一种 = 的运算符重载。三种构造函数的分别为 string (),string (char \*),string (strint&) 三七互娱 2020 年秋招面试题 **************************************** 转自 `三七互娱面试题 `_ #. 自我介绍 #. 面向对象特点,然后引申,类与类之间的关系,什么场景用继承,什么场景用包含~(不会) #. 进程和线程区别 #. 线程状态,以及转换 #. 创建多线程方式 #. sleep wait #. mysql 优化方面 #. 写 sql #. 写单例,口述一遍 #. redis 位图。 #. redis 8 种数据结构 #. redis 中 set 详细介绍 判断一个 key 在不在一个 set 里面的时间复杂度 (O (1) ), 我猜的。看来我们也得看看 redis 的源码了 #. 持久化方式 - 磁盘怎么防止碎片 - vim 怎么整行删除 - CAS 底层通过什么实现 - 多个 Java 程序并发访问数据库,怎么实现数据库的线程事务安全 - 分布式怎么存储 Session - 为啥用 git 不用其他的 - CPU 为啥有多级缓存 - Socket 了解么 - ping 用到的协议 - Hashmap 在 1.8 以前怎么解决冲突的 - JDK 哪里用到享元模式、那里用到原型模式 - Springboot 为啥可以配置这么少就能用 - Spring 怎么解决循环依赖 - Mybatis 为什么实现接口就可以访问数据库 - linux 底层实现的 IO 模型,epoll 是什么 - 80486 变长还是定长 这个应该是 Java 的。