数据结构
文章平均质量分 66
happywq2009
这个作者很懒,什么都没留下…
展开
-
二叉搜索树(二叉排序数)的基本操作实现
本文实现了二叉搜索树的插入、查找、删除、求最大节点、最小节点以及直接前驱、直接后继节点的基本操作。二叉搜索树,二叉查找树,二叉排序树说的都是一个概念。这篇博文中我们称其为二叉搜索树。二叉搜索树指的是一棵空树,或者具有下列性质的二叉树:1)弱左字数不空,则左子树上所有节点的值均小于根节点的值;2)若右子树不空,则右子树上所有节点的值均大于根节点的值;3)左、右子树也分别为二叉搜索树;原创 2014-11-26 21:19:38 · 575 阅读 · 1 评论 -
排序算法之简单选择排序
基本思想:将初始序列(A[0]~A[n-1])作为待排序序列,第一趟在待排序序列(A[0]~A[n-1])中找最小值元素,与该序列中第一个元素A[0]交换,这样子序列(A[0])有序;下一趟排序在待排序子序列(A[1]~A[n-1])中进行。第 i 趟排序,A[i-1]~A[n-1] 中,找到最小元素,与该子序列中第一个元素 A[i-1] 交换。经过n-1趟排序后使得初始序列有序。原创 2015-05-05 15:29:38 · 661 阅读 · 0 评论 -
排序算法之冒泡排序
基本思想:冒泡排序是通过交换两个元素实现的,其思想是:第一趟将待排序序列(A[0]~A[n-1])从前往后,两两相邻元素进行比较,若后者小,则交换,比较n-1次;第一趟结束后,最大元素被交换到A[n-1]处(即沉底),下一趟排序只需要在(A[0]~A[n-2])中进行;若在某趟排序中,未交换元素,说明子序列已经有序,则不在进行下一趟排序。该方法最多进行n-1趟。冒泡排序原创 2015-05-05 17:41:34 · 733 阅读 · 0 评论 -
排序算法之堆排序
基本思想:基本思想主要就是两点:构建初始化堆和排序。以构建最大堆为例,可以分为以下几个步骤:1、将初始待排序序列(R0,R1,R2....Rn-1)构建成最大堆,此堆为初始的无序堆。2、将堆顶元素R0与最后一个元素Rn-1交换,此时得到一个新的无序序列(R0,R1,R2....Rn-2)和新的有序序列Rn-1,且满足R[0,2...n-2]3、由于交换后新的堆顶R0可能违反最大原创 2015-05-05 15:53:02 · 612 阅读 · 0 评论 -
排序算法之直接插入排序
基本思想:直接插入排序的思想非常简单,将序列中第一个元素作为一个有序序列,然后将剩下n-1个元素按关键字大小依次插入该有序序列,每插入一个元素后依然保持该序列有序,经过n-1趟排序后即成为有序序列。直接插入排序示例:由图可以看到,括号里面的都是有续表,而货号后面的灰色关键字是下一个将要插入的元素。代码:void InsertSort(int A[],in原创 2015-04-26 22:11:55 · 680 阅读 · 0 评论 -
字符串:最长回文子串
最长回文子串回文子串:即正着看和倒着看相同的子串,如:abcba、yyxyy。由于此类题目为面试笔试常考题目,所以现在就来整理一下啦。1、暴力求解法最直接的想法就是暴力求解,但是我们可以看到下面的代码时间复杂度是O(N^3)。string findLongestString(string str)//暴力求解算法{ int i,j; int len = str.l原创 2015-04-09 17:40:48 · 416 阅读 · 0 评论 -
设计包含min或max功能的栈
问题:对Stack(栈)数据结构进行改进,加一个min()或max()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。以下只对如何求min进行阐述,max类似处理。解题思路:用min数组记录当前最小值。当有新数值x进栈时,就前一次的最小值进行比较,如果小于就将min值进行替换,否则保留。、详见代码原创 2015-03-10 21:33:56 · 513 阅读 · 0 评论 -
字符串:翻转句子中单词的顺序
题目: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。 句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。思路: 翻转单词的题目和字符串的左移,其本质上是一个意思,都是基于字符串的翻转。例如:把字符串“abcde”左移成为”deabc”。那么我们可以分成三步字符串翻原创 2015-03-11 19:28:24 · 468 阅读 · 0 评论 -
栈的应用——Simplify Path
题目:Given an absolute path for a file (Unix-style), simplify it.For example,path = "/home/", => "/home"path = "/a/./b/../../c/", => "/c"Corner Cases:Did you consider the case wh原创 2015-03-11 13:00:31 · 412 阅读 · 0 评论 -
单链表的常用操作(二)
接上一篇单链表的基本操作,我又整理了一些链表常考的题目,并且不断更新中。。。 1.查找链表中倒数第k个节点以及删除倒数第k个节点//给两个指针p和q,让其中一个指针p领先q指针k步,//然后再同时移动p和q指针,当领先的指针p先到达链表尾部时,后面的指针q所指向的节点恰好为倒数第k个节点。Node* GetKthNode(int k){ Node *p=head; Node原创 2015-03-15 17:13:44 · 641 阅读 · 1 评论 -
字符串:查找字符串中首个出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。思路:我们可以依次遍历求出每个字符的次数,即每求一个字符的次数,就遍历一次字符串。但是这样时间复杂度为O(n*n)。这样考虑,每个字符对应一个ASCII值,我们可以设定一个数组长度为256,每一个字符的ASCII码值即数组的index值。遇到相同的就加一。最后遍历一次求第一个出现一次的字原创 2015-03-11 21:36:48 · 922 阅读 · 1 评论 -
环形链表相关题目解析
环形链表也是近年来面试笔试中常考问题,于是就在网上整理了相关的题目与解析。1.判断一个链表是不是环形链表思路:这里给定两个指针,fast和slow。两个指针同时从头结点开始出发,fast指针走两步,slow指针走一步;若链表有环,这两个指针肯定会在某点相遇;若链表无环,fast会直接先到达NULL。代码:bool Iscircle(Node *head)//判断是否有环{原创 2015-03-16 21:05:09 · 1681 阅读 · 1 评论 -
寻找数组中的最大值和最小值
对于一个有N个整数组成的数组,我们如何原创 2014-11-13 16:30:15 · 927 阅读 · 0 评论 -
两个栈实现队列+两个队列实现栈----C++
1. 两个栈实现队列思路: 我们先想象下队列有哪些功能?进队列(push)、出队列(pop)、队首元素(front)、队尾元素(back)。这里使用了两个栈stack1和stack2。进队列(push),直接进stack1。出队列(pop),若stack2非空,我们需要的恰好在栈顶,出栈;若stack2空,则所有stack1元素,并入stack2,再出栈。队首和队尾元素恰好就在两个栈的to原创 2015-03-10 21:38:08 · 644 阅读 · 0 评论 -
单链表的基本操作(一)
单链表在插入、删除时较为方便,平时做题或者面试也会遇到很多,下面对单链表的操作做一些介绍。本文参考了一些blog,不过只记得下面这个啦:http://blog.csdn.net/puqutogether/article/details/39990419定义一个结构体:struct Node{ int data; Node* next;};在 运算前先定义一个全局原创 2014-10-28 21:54:18 · 675 阅读 · 1 评论 -
K SUM问题
1. Two Sum题目:Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up原创 2015-05-12 14:22:06 · 552 阅读 · 0 评论