
算法
文章平均质量分 68
sadsadsadsadsazcAS
这个作者很懒,什么都没留下…
展开
-
链表中倒数第K个结点
如果遍历的话,需要遍历两次,如果用两个指针的话,只需要一次,同时需要注意代码的鲁棒性,本例子很具有代表性。代码如下:(画图可以帮助理解)#include #include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext;};//创建链表ListNode *CreateListNo原创 2014-11-27 08:52:10 · 473 阅读 · 0 评论 -
字符串的排列
输入一个字符串,打印出该字符串的所有可能:比如输入abc,那么打印abc,acb,bac,bca,cab,cba.思路:1.将字符串分为两部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有的字符。2.拿第一个字符和它后面的字符逐个进行交换。#include #include using namespace std;void Permutation(char*原创 2015-01-04 15:54:56 · 647 阅读 · 0 评论 -
排序算法总结---交换排序之快速排序
快速排序是对起泡排序的改进,起泡排序中,记录的比较和移动是在相邻位置进行的,记录每次交换只能后移一个位置,因而总的比较次数和移动次数较多。快速排序中,记录的比较和移动是从两端向中间进行的。快速排序又称为分区交换排序,基本思想是:首先选择一个轴值,将带排序记录划分成独立的两部分,左侧记录的关键码均小于或者等于轴值,右侧记录的关键码均大于或者等于轴值,然后分别对这两部分重复上述的过程,直到整个原创 2014-12-09 09:10:18 · 680 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制有三种方法。第一种方法的时间复杂度为O(n*n)第二种用哈希表来用空间换取时间同样不可取。第三种使用分治法分而治之。#include #include using namespace std;//分治法struct ComplexListNode{ int m_nValue; ComplexListNode *m_pNext; ComplexList原创 2014-12-09 09:04:38 · 530 阅读 · 0 评论 -
排序算法总结---交换排序之起泡排序
交换排序的主要思想是:在待排序序列中选择两个记录,将他们的关键码进行比较,如果反序则交换他们的位置。起泡排序的思想是:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。起泡排序的问题是:1.在一趟起泡排序中,若有多个记录位于最终的位置,应如何记载?2.如何确定起泡排序的范围,使得已经位于最终位置的记录不参与下一趟排序?3.如何判别起泡排序的结束。排序的过原创 2014-12-08 09:22:02 · 1014 阅读 · 0 评论 -
二叉树中和为某一值得路径
画图可以帮助我们理解,举个简单的例子可以看出保存路径的数据结构实际就是栈,而递归调用的本质就是压栈和出栈的过程。#include #include #include #include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNod原创 2014-12-08 09:12:54 · 604 阅读 · 0 评论 -
排序算法总结---希尔排序
希尔排序是对直接插入排序算法的改进,改进的着眼点在于:①.若带排序记录按关键码基本有序,直接插入排序的效率很高;②.由于直接插入排序算法简单,则在待排序记录个数较少时效率也很高。希尔排序的基本思路是:先将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。要解决的问题:(1).应该如何分割待排序的记录,才能保证整原创 2014-12-06 09:09:57 · 626 阅读 · 0 评论 -
二叉搜索树的后序遍历
二叉搜索树的后序遍历序列中,最后一个值是根结点,前面比根节点小的是左结点,后面比根结点大的是右结点。#include #include bool VerifySquenceOfBST(int sequence[], int length){ if (sequence == NULL || length<=0) { return false; } int root = seq原创 2014-12-06 08:53:38 · 503 阅读 · 0 评论 -
排序算法总结---直接插入排序
直接插入排序 直接插入排序是最基本的插入排序方法,也是一种最简单的排序方法。其基本实现思想如下: 1、首先把第一个元素单独看做一个有序序列,依次将后面的元素插入到该有序序列中; 2、插入的时候,将该元素逐个与前面有序序列中的元素进行比较,找到合适的插入位置,形成新的有序序列; 3、当有序序列扩大为整个原始序列的大小时,排序结束。 第一种实现方法 按照该思想,原创 2014-12-04 11:08:39 · 639 阅读 · 0 评论 -
华为机试---字符串过滤
题一:题目描述(60分):通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。要求实现函数: void stringFilter(const char *pInputStr, long lInputLen, char *pOutput原创 2014-12-04 14:53:29 · 632 阅读 · 0 评论 -
从上往下打印二叉树
从上往下打印二叉树需要一个双端队列,STL提供了deque容器符合我们的要求,代码和测试代码如下:#include #include #include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};B原创 2014-12-05 09:10:25 · 753 阅读 · 0 评论 -
栈的压入、弹出序列
举个例子:比如:1,2,3,4,54,5,3,2,1就是而4,3,5,1,2就不是。#include #include #include using namespace std;bool IsPopOrder(const int *pPush,const int *pPop, int nLength){ bool bPossible = false; if (pP原创 2014-12-05 08:50:04 · 525 阅读 · 0 评论 -
包含min函数的栈
设计一个数据栈和辅助栈。画图可以帮助我们理解:#include #include #include #include using namespace std;template class StackWithMin{public: StackWithMin(void){} virtual ~StackWithMin(void){} T &top(void); cons原创 2014-12-04 08:57:34 · 492 阅读 · 0 评论 -
二叉树的镜像
画图可以帮助我们理解。递归和循环实现(栈)代码和测试代码如下:#include #include #include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};BinaryTreeNode*原创 2014-12-02 08:40:21 · 487 阅读 · 0 评论 -
Intersection of Two Linked Lists
题目:Write a program to find the node at which the intersection of two singly linked lists begins.For example, the following two linked lists:A: a1 → a2 ↘原创 2014-11-28 10:53:42 · 521 阅读 · 0 评论 -
反转链表
需要注意的地方:翻转后链表不能断开了:代码和测试代码如下:#include #include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext;};ListNode* ReverseList(ListNode* pHead){ ListNode* pReversedHead原创 2014-11-28 09:22:46 · 437 阅读 · 0 评论 -
判断一个单向链表是否形成了环状结构
定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另外一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环状结构;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上走得慢的指针,那么链表就不是环状结构。代码如下:我写了两个测试用例,一个带环的,一个不带环的,带环如果添加Destroy语句,程序运行会出现下面的错误:打断点发现destr原创 2014-11-27 10:04:56 · 969 阅读 · 0 评论 -
链表的中间结点
思路和求链表中倒数第K个结点的思路类似,采用双指针,一个走一步,一个走两步,需要注意代码的鲁棒性。(感觉算法处理边界条件花了很多时间)代码和测试用例如下:#include #include using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext;};//创建链表ListNode *Cre原创 2014-11-27 09:14:59 · 490 阅读 · 0 评论 -
数组中出现次数超过一半的数字
#include #include #include #include #include using namespace std;void Swap(int &elem1, int &elem2){ int temp; temp = elem1; elem1 = elem2; elem2 = temp;}void Swap(int *elem1,int *elem2)原创 2015-01-05 15:27:29 · 513 阅读 · 0 评论