没有合适的资源?快使用搜索试试~ 我知道了~
首页程序员面试宝典:100道精选技术题助你脱颖而出
程序员面试宝典:100道精选技术题助你脱颖而出
需积分: 15 3 下载量 171 浏览量
更新于2024-07-23
收藏 467KB DOC 举报
"程序员面试题精选100题"是一份针对计算机相关专业应届毕业生设计的面试题集,旨在帮助学生有效准备求职过程中的面试环节。在这个竞争激烈的就业市场中,面试的重要性不言而喻,因为它能让公司直接评估学生的实际技能和能力。本文档涵盖了技术类面试题的讨论,特别是将二元查找树转化为排序的双向链表的问题。 问题描述的挑战性在于,要求仅通过调整树中节点的指针指向,而不是创建新节点,实现二叉查找树到有序双向链表的转换。这种题目考察的是对数据结构和算法的理解,以及递归或迭代思维的应用。这里有两种解决方案: 1. 思路一:采用递归方法,从根节点开始,首先处理左子树,将其转换为有序链表,然后处理右子树。关键在于找到左子链表的最右节点和右子链表的最左节点,然后将它们连接起来,形成连续的有序序列。 2. 思路二:通过中序遍历的方式,确保按照从小到大的顺序访问节点。每次访问节点后,将其链接到已排序链表的末尾。遍历完成后,整个二叉查找树即被转换为有序链表。 作者提供了二叉查找树结点的简单数据结构定义,包括节点值和指向左右子节点的指针。虽然作者表示可能存在错误,鼓励读者提出反馈和分享更多的面试题,但这份资料为应届毕业生提供了宝贵的实战准备素材,有助于提升面试技巧和增加就业竞争力。
资源详情
资源推荐
std::cout<<*iter<<'\t';
std::cout<<std::endl;
}
// if the node is not a leaf, goto its children
if(pTreeNode->m_pLeft)
FindPath(pTreeNode->m_pLeft, expectedSum, path, currentSum);
if(pTreeNode->m_pRight)
FindPath(pTreeNode->m_pRight, expectedSum, path, currentSum);
// when we finish visiting a node and return to its parent node,
// we should delete this node from the path and
// minus the node's value from the current sum
currentSum -= pTreeNode->m_nValue; //!!I think here is no use
path.pop_back();
}
(05)查找最小的 k 个元素
题目:输入 n 个整数,输出其中最小的 k 个。
例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4。
分析:这道题最简单的思路莫过于把输入的 n 个整数排序,这样排在最前面的 k 个数就是
最小的 k 个数。只是这种思路的时间复杂度为 O(nlogn)。我们试着寻找更快的解决思路。
我们可以开辟一个长度为 k 的数组。每次从输入的 n 个整数中读入一个数。如果数组中已
经插入的元素少于 k 个,则将读入的整数直接放到数组中。否则长度为 k 的数组已经满了,
不能再往数组里插入元素,只能替换了。如果读入的这个整数比数组中已有 k 个整数的最
大值要小,则用读入的这个整数替换这个最大值;如果读入的整数比数组中已有 k 个整数
的最大值还要大,则读入的这个整数不可能是最小的 k 个整数之一,抛弃这个整数。这种
思路相当于只要排序 k 个整数,因此时间复杂可以降到 O(n+nlogk)。通常情况下 k 要远小
于 n,所以这种办法要优于前面的思路。
这是我能够想出来的最快的解决方案。不过从给面试官留下更好印象的角度出发,我们可
以进一步把代码写得更漂亮一些。从上面的分析,当长度为 k 的数组已经满了之后,如果
需要替换,每次替换的都是数组中的最大值。在常用的数据结构中,能够在 O(1)时间里得
到最大值的数据结构为最大堆。因此我们可以用堆(heap)来代替数组。
另外,自己重头开始写一个最大堆需要一定量的代码。我们现在不需要重新去发明车轮,
因为前人早就发明出来了。同样,STL 中的 set 和 multiset 为我们做了很好的堆的实现,
我们可以拿过来用。既偷了懒,又给面试官留下熟悉 STL 的好印象,何乐而不为之?
参考代码:
#include <set>
#include <vector>
#include <iostream>
11
using namespace std;
typedef multiset<int, greater<int> > IntHeap;
/////////////////////////////////////////////////////////////////////
//
// find k least numbers in a vector
/////////////////////////////////////////////////////////////////////
//
void FindKLeastNumbers
(
const vector<int>& data, // a vector of data
IntHeap& leastNumbers, // k least numbers, output
unsigned int k
)
{
leastNumbers.clear();
if(k == 0 || data.size() < k)
return;
vector<int>::const_iterator iter = data.begin();
for(; iter != data.end(); ++ iter)
{
// if less than k numbers was inserted into leastNumbers
if((leastNumbers.size()) < k)
leastNumbers.insert(*iter);
// leastNumbers contains k numbers and it's full now
else
{
// first number in leastNumbers is the greatest one
IntHeap::iterator iterFirst = leastNumbers.begin();
// if is less than the previous greatest number
if(*iter < *(leastNumbers.begin()))
{
// replace the previous greatest number
leastNumbers.erase(iterFirst);
leastNumbers.insert(*iter);
}
}
}
12
}
(06)判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返
回 true,否则返回 false。
例如输入 5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回 true。
如果输入 7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false。
分析:这是一道 trilogy 的笔试题,主要考查对二元查找树的理解。
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结
点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元
素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的
划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查
找树。
参考代码:
using namespace std;
/////////////////////////////////////////////////////////////////////
//
// Verify whether a squence of integers are the post order traversal
// of a binary search tree (BST)
// Input: squence - the squence of integers
// length - the length of squence
// Return: return ture if the squence is traversal result of a BST,
// otherwise, return false
/////////////////////////////////////////////////////////////////////
//
bool verifySquenceOfBST(int squence[], int length)
{
if(squence == NULL || length <= 0)
return false;
// root of a BST is at the end of post order traversal squence
int root = squence[length - 1];
13
剩余63页未读,继续阅读
hero_wx
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AirKiss技术详解:无线传递信息与智能家居连接
- Hibernate主键生成策略详解
- 操作系统实验:位示图法管理磁盘空闲空间
- JSON详解:数据交换的主流格式
- Win7安装Ubuntu双系统详细指南
- FPGA内部结构与工作原理探索
- 信用评分模型解析:WOE、IV与ROC
- 使用LVS+Keepalived构建高可用负载均衡集群
- 微信小程序驱动餐饮与服装业创新转型:便捷管理与低成本优势
- 机器学习入门指南:从基础到进阶
- 解决Win7 IIS配置错误500.22与0x80070032
- SQL-DFS:优化HDFS小文件存储的解决方案
- Hadoop、Hbase、Spark环境部署与主机配置详解
- Kisso:加密会话Cookie实现的单点登录SSO
- OpenCV读取与拼接多幅图像教程
- QT实战:轻松生成与解析JSON数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功