面试题目
thinkingForJoy
这个作者很懒,什么都没留下…
展开
-
简单列表的实现(基于数组)
基于数组,实现一个简单的列表,支持如下功能: 下标末尾添加,中间插入末尾删除,中间删除空间不够时自动扩容清空所有元素简单的错误检测 下面是代码: #ifndef _ARRAYLIST_ #define _ARRAYLIST_ #include #include using namespace std; template class ArrayList { public:原创 2014-02-26 11:14:29 · 998 阅读 · 0 评论 -
简单列表的实现(基于双向链表)
实现一个简单的列表,基于双向链表,要求支持删除,插入,下标等操作。 #ifndef _DOUBLELINKEDLIST_ #define _DOUBLELINKEDLIST_ #include #include using namespace std; template class DoubleLinkedList { private: struct DoubleLinke原创 2014-03-05 11:10:06 · 756 阅读 · 0 评论 -
二叉查找树的实现
实现一个简单的二叉查找树,支持常规操作。 代码如下: #ifndef _BINARYSEARCHTREE_ #define _BINARYSEARCHTREE_ #include #include using namespace std; template class BinarySearchTree { private: struct BinarySearchTreeNode原创 2014-03-12 22:31:34 · 480 阅读 · 0 评论 -
归并排序
归并排序利用分治法,每次将原序列分为大小基本相等的两个子序列,将两个子序列分别排好序后,再将两个子序列合并为排好序的原序列,而长度大于一的子序列可以递归地分解成更小的子序列,从而递归的用归并排序来解决。因此,递归排序的关键在于如何合并。 简单的归并排序的合并过程是需要借助临时数组的,因此还是比较费空间的。所以如果用对链表组成的序列的排序,归并排序可以不需要额外的空间,这样会更好。 如下是基于数原创 2014-03-07 13:49:48 · 571 阅读 · 0 评论 -
优先级队列的实现
优先级队列是基于最大堆或者最小堆的,有很多的应用,比如任务调度,事件模拟之类的,下面我们来实现最大优先级队列(基于最大堆)和最小优先级队列(基于最小堆)。 最大优先级队列代码如下。在实际使用中,一般可以只保存一个用于比较的key和一个指向实际数据的指针在优先级队列中,下面的代码忽略了实际的数据,只考虑Key。 #ifndef _LARGESTPRIORITYQUEUE_ #define原创 2014-03-11 20:53:53 · 786 阅读 · 0 评论 -
插入排序,选择排序,Shell排序
实现基于数组的插入排序,选择排序,Shell排序。 插入排序,特点是移动次数多。 void InsertSort(int* start, int size) { int temp=0; for(int i=1;i<size;++i) { temp = start[i]; int position = i; for( ; position > 0; --position)原创 2014-03-07 13:17:51 · 665 阅读 · 0 评论 -
简单二叉树的实现和遍历
在这里讨论下,最简单的二叉树的实现和它的各种遍历的实现。一般的这种无规则的二叉树,实际用途一般,远不如什么二叉查找树等等用途广,所以这里主要是实现一个带有插入方法的二叉树,然后方便我们来用各种方式遍历它,包括递归的和非递归的。 为了简化插入操作(在插入的时候不需要指定插入的位置),我将每个节点的高度也保存在了节点中,然后在插入的时候,我会先看节点是否有左右子树,如果有的话,就比较左右子树的高度,原创 2014-03-12 14:25:55 · 724 阅读 · 0 评论 -
快速排序
快速排序也是一种基于分治法的排序方法,简单的说,就是每次从序列中找出一个关键字,然后利用Partition的过程,将这个关键字放置到它在最终排好序的序列中的最终位置,并且保证在该位置左边的元素都小于它,右边的元素都大于等于它。然后递归的使用快速排序对左右两个子序列继续排序,直到子序列大小为1或者为空。 快速排序的速度取决于每次选出的那个关键字(pivot),简单的做法是取第一个元素,麻烦点的做法原创 2014-03-07 14:00:53 · 578 阅读 · 0 评论 -
堆排序
堆排序是一种将二叉树的结构运用于数组的效率很好的排序方法。 第一步,数组除了0号元素不满足最大堆的条件,其他位置都已经满足,那么需要调整整个数组到满足最大堆的状态。前提条件是除了0号元素,其他的元素都已经满足了最大堆的要求,也就是说0号元素的左右子树都是最大堆,那么只需要比较0号元素和它的左右孩子结点的大小,如果已经大于等于它的左右子节点,那么已经是最大堆了,如果0号元素小于它的左或者右子节点,原创 2014-03-10 10:03:47 · 565 阅读 · 0 评论 -
简单栈的实现(基于数组)
用C++实现一个简单的栈,基于数组来实现。 #ifndef _ARRAYSTACK_ #define _ARRAYSTACK_ #include #include using namespace std; template class ArrayStack { public: explicit ArrayStack(int maxSize=100) : _size(0),_maxSi原创 2014-03-03 18:04:28 · 612 阅读 · 0 评论 -
简单栈的实现(基于链表)
用C++实现一个简单栈,基于链表: #ifndef _LINKEDSTACK_ #define _LINKEDSTACK_ #include #include using namespace std; template class LinkedStack { public: LinkedStack() : _size(0), _head(NULL) {} ~LinkedStack原创 2014-03-04 15:22:33 · 538 阅读 · 0 评论 -
简单队列的实现(基于数组)
用C++实现一个简单的队列,基于数组来实现。 #ifndef _ARRAYQUEUE_ #define _ARRAYQUEUE_ #include #include using namespace std; template class ArrayQueue { public: explicit ArrayQueue(int maxSize = 100) : _size(0),_ma原创 2014-03-03 18:08:14 · 559 阅读 · 0 评论 -
递归方法计算数N的二进制表示中1的个数
利用一个现成的结论:如果N是奇数,那么它等于N/2的二进制表示中的1的个数加1. 剩下的问题就是解决当N是偶数时,如何往基本情况递归了,简单分析一下任何一个偶数的二进制表示的最低位绝对等于0,,那么我们可以推导出一个简单结论:当N是偶数的时候,它二进制包含1的个数应该等于N+1包含的1的个数和减1。因为,N为偶数时,最低位是0,那么N+1的二进制的前面和N的二进制一模一样,只是最低位是1。原创 2013-12-24 15:27:30 · 1807 阅读 · 0 评论 -
最大子序列和问题
最大子序列和问题(Max subsequence sum problem),简单描述如下: 含有N个整数的数列,找出其中所有子序列的最大和,子序列定义为 连续的一个子集,子序列和为该子序列所有数字之和。如何序列全部都是负数,则定义子序列最大和等于0。 这个问题有很多方法来解决,最简单的就是穷举所有子序列,然后对每个子序列求和,保留最大的那个和,作为结果。这种方法就是效率非常低下,随着序列所含整原创 2013-02-02 08:44:52 · 825 阅读 · 0 评论 -
计算斐波那契数列
斐波那契数列的详细定义可以查看斐波那契数列 看一些算法书,提到递归,经常会拿斐波那契数列来举例,所以今天就写点程序,简单讨论一下。 这里包括了两个方法,一个是递归计算,效率极其低下;另一种,就是直接利用循环计算,效率是就好很多,下面是代码: using System; using System.Collections.Generic; using System.Linq; using S原创 2013-01-31 19:27:14 · 778 阅读 · 0 评论 -
两个面试常见的智力题
1. 有N台电脑,其中有大于一半的电脑是好电脑,其他的是坏电脑。用一台好电脑检测另一台电脑,结果肯定是正确的。用一台坏电脑检测另一台电脑,结果则可能是正确的,也可能是错误的。请写出一个策略,找出一台好电脑。 这个是同事发邮件问的一道题目,挺有意思的,我想了半天,只相出了一个O(n2)的解法,但是随后有一个Intern给出了一个O(N)就可以找出一台好电脑的解法,真是强人啊。 具体做法如下:原创 2008-09-28 13:53:00 · 557 阅读 · 0 评论 -
计算2的100次方模5的结果
直接求肯定挺痛苦的,利用一个求模的简单性质然后结合递归可以很快算出。 A*B mod 5 = ( (A mod 5) * (B mod 5) ) mod 5 这个性质可以简单证明如下: 假设A mod 5 = K1, B mod 5 = K2. 那么设 A = 5a+K1, B = 5b + K2。那么A*B = (5a+K1)*(5b+K2)= 25ab + 5a*K2 + 5b*K1 +原创 2013-12-24 15:56:34 · 3501 阅读 · 1 评论 -
简单队列的实现(基于链表)
实现一个简单的队列,基于链表。 #ifndef _LINKEDQUEUE_ #define _LINKEDQUEUE_ #include #include using namespace std; template class LinkedQueue { public: LinkedQueue() : _size(0),_head(NULL),_tail(NULL) {} ~Lin原创 2014-03-04 17:04:57 · 581 阅读 · 0 评论 -
简单列表的实现(基于链表)
实现一个列表,基于链表,支持插入,删除,下标等操作。 #ifndef _LINKEDLIST_ #define _LINKEDLIST_ #include #include using namespace std; template class LinkedList { private: struct LinkedListNode { T data; LinkedListN原创 2014-03-04 20:18:46 · 592 阅读 · 0 评论 -
实现有序列表(基于数组,二分查找)
实现一个简单的有序列表,保证插入新数据时,列表依然有序,并且带有查找,删除功能。 查找功能使用了如下不同的方法: 顺序查找二分查找(使用了两种不同的二分查找写法) #ifndef _ORDERLIST_ #define _ORDERLIST_ #include #include using namespace std; template class OrderList原创 2014-03-05 14:13:35 · 1082 阅读 · 0 评论 -
AVL树的实现
AVL树是平衡二叉树中的一种,下面讨论讨论它的实现。一个AVL树满足基本的二叉查找树的要求,另外,每个AVL树的节点,它的左子树和右子树的高度差不超过1。 AVL树应为这个条件,从而保证了二叉查找树的高度是受控的,不会出现一般的二叉查找树那样可能随着不断的插入和删除操作,最后退化成一个链表。也是因为这个额外的要求,导致了AVL树的插入和删除操作和一般的二叉查找树不同,每次插入和删除的时候都需要检原创 2014-03-19 19:00:32 · 790 阅读 · 0 评论