码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 亲历面试题

时间:2019-07-29 22:58:58      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:左右   class   二叉树   root   两种   stc   bit   不同的   data   

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++ 亲历面试题

标签:左右   class   二叉树   root   两种   stc   bit   不同的   data   

原文地址:https://www.cnblogs.com/jiwen/p/11267045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!