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++ 亲历面试题的主要内容,如果未能解决你的问题,请参考以下文章