C++ 亲历面试题

Posted jiwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 亲历面试题相关的知识,希望对你有一定的参考价值。

1   二叉树中两个节点的最近公共父节点

思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最近公共父节点;
二是两个节点在同一侧,则 root->left 或者 root->right 为 NULL,另一边返回a或者b。那么另一边返回的就是他们的最小公共父节点。
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回。

// 二叉树结点的描述  
typedef struct BiTNode  
  
    char data;  
    struct BiTNode *lchild, *rchild;      // 左右孩子  
BinaryTreeNode; 
 
// 节点只有左指针、右指针,没有parent指针,root已知
BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)

    if(root == NULL)
        return NULL;
    if(root == a || root == b)
        return root;
    BinaryTreeNode* left = findLowestCommonAncestor(root->lchild , a , b);
    BinaryTreeNode* right = findLowestCommonAncestor(root->rchild , a , b);
    if(left && right)
        return root;
    return left ? left : right;

 

2 最少硬币找零问题为:给予不同面值的硬币若干种种(每种硬币个数无限多),用若干种硬币组合为某种面额的钱,使硬币的的个数最少。

 

假设有几种硬币,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。例如几种硬币为[1, 3, 5], 面值2的最少硬币数为2(1, 1), 面值4的最少硬币数为2(1, 3), 面值11的最少硬币数为3(5, 5, 1或者5, 3, 3).

问题分析:

假设不同的几组硬币为数组coin[0, ..., n-1]. 则求面值k的最少硬币数count(k), 那么count函数和硬币数组coin满足这样一个条件:

  • count(k) = min(count(k - coin[0]), ..., count(k - coin[n - 1])) + 1; 
  • 并且在符合条件k - coin[i] >= 0 && k - coin[i] < k的情况下, 前面的公式才成立.

 

以上是关于C++ 亲历面试题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 面试题 面试题复盘

C++面试题

C++面试题某初创公司的面试题

C++面试题某初创公司的面试题

c++面试题转

C++面试题一