C++面试总结
程序员文章站
2022-03-07 22:49:37
...
2021 C++面试题
1、虚函数的底层实现原理
2、sizeof结构体对齐
3、static静态变量
4、CretateThread和_beginthreadex区别
5、new和malloc区别,什么样情况选择new?什么情况下选择malloc
6、VS中编译器MT /MD的区别?
7、动态库和静态库的区别?
8、文件系统概念知识
9、VS远程调试代码
10、数据库优化
11、线程同步
12、进程同步
13、互斥锁和临界区的区别?
14、为什么文件映射比传统的write、Read速度快?
15、windebug使用情况
16、map unordered_map的底层实现原理
17、应用程序调用dll的时候,为什么遵循内存谁申请、谁释放的原则?
18、C++ 11新属性,右值引用、转换、完美语义
19、vector 和list的区别使用场景
(1-100万的数据只遍历使用 选用list)
20、Qt中 QGraphicsView框架选中原因?
(图元操作的基本事件都有,能支持单层图元的刷新(widget整个界面都要刷新))
21、model\View的用法使用场景
算法题
1、链表反转
template <typename T>
typedef struct ListNode
{
T data;
struct ListNode* next;
}
void Reverse(ListNode** pList)
{
ListNode* pre = *pList;
ListNode* pcur = nullptr;
ListNode* pTemp = nullptr;
while(pre){
pTemp = pre->next;
pre->next = pcur;
pcur = pre;
pre = pTemp;
}
(*pList)->next = nullptr;
*pList = cur;
}
2、删除链表中重复的节点
ListNode* RemoveDupNode(ListNode* L)
{
ListNode* p = nullptr;
ListNode* q = nullptr;
ListNode* r = nullptr;
p = L->next;
while(p){ //遍历链表
q = p;
while(q->next){ //q遍历p后面的节点,并与p数值比较
if(q->next->data == p->data){
r = q->next; //r保存需要删掉的节点
q->next = r->next; //需要删掉的节点的前后节点相连
}
else
{
q = q->next;
}
}
p = p->next;
}
return L;
}
3、二叉树反转
template <typename T>
typedef struct TreeNode
{
T data;
struct TreeNode* left;
struct TreeNode* right;
};
//方式1 递归实现
TreeNode* InvertTree(TreeNode* root)
{
if(root){
InvertTree(root->left);
InvertTree(root->right);
std::swap(root->left, root->right);
}
return root;
}
//方法2 借助数据结构栈实现
TreeNode* InvertTree(TreeNode* root)
{
std::stack<TreeNode*>stk;
stk.push(root);
while(!stk.empty()){
TreeNode* p = stk.top();
stk.pop();
if(p){
stk.push(p->left);
stk.push(p->right);
std::swap(p->left, p->right);
}
}
return root;
}