C++面试题目整理

lc#xxx表示在LeetCode上有该问题,序号为xxx。
(长期更新中。。。)

编码题

  1. 单链表逆置(lc#206)
C++面试题目整理_第1张图片
单链表反转01
struct ListNode {
  int val;
  ListNode* next;
}

ListNode * reverseList(ListNode * head)
{
  ListNode* pre = NULL;
  ListNode* curr = head;
  while(curr != NULL)
  {
    ListNode* next = curr->next;  //临时保存下一个元素的指针
    curr->next = pre;  //反向
    pre = curr;        //元素前移
    curr = next;
  }
  return pre;
}

延伸:

  • lc#92:指定特定元素反转。
  1. memcpy的实现
  2. 将输入字符串大写转换为小写,去掉空格。

选择题/问答题/修改题

  1. 二叉树前序遍历/中序遍历/后序遍历
    根据代码更容易理解,示例代码如下:
//前序遍历
void PreOrderTraverse(BiTree T)
{
    if(T==NULL)
        return;
    printf("%c", T->data);  //先打印数据,再遍历左、右子树
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

//中序遍历
void InOrderTraverse(BiTree T)
{
    if(T==NULL)
        return; 
    InOrderTraverse(T->lchild);
    printf("%c", T->data);  //中间打印数据
    InOrderTraverse(T->rchild);
}

//后序遍历
void PostOrderTraverse(BiTree T)
{
    if(T==NULL)
        return; 
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c", T->data);  //最后打印数据
}

两个二叉树遍历的性质:
1、已知前序遍历和中序遍历,可以唯一的确定一个二叉树;
2、已知后序遍历和中序遍历,可以唯一的确定一个二叉树;

但是,已知前序遍历和后序遍历,是不能唯一的确定一棵二叉树的。比如,前序遍历ABC,后续遍历CBA,我们可以确定A是根节点,但是无法确定那个是左子树,哪个是右子树。

参考链接:
二叉树的四种遍历方法笔记
图解二叉树几二叉树的遍历

  1. 排序算法对比

  2. 动态链接库和静态链接库

  3. 线程和进程的区别

  4. virtual函数是如何实现的?

  1. sizeof struct对齐

  2. 迭代器被修改的情况如何处理?

  3. map必须要使用make_pair吗?能否直接用_map[0]这种形式。

  4. const char* func()能用来创建string类型变量吗。

你可能感兴趣的:(C++面试题目整理)