随笔分类 -  算法&&数据结构

摘要:特点栈——先进后出队列——后进先出思路1. 快速得到最大值的栈结构需要两个数组:一个数组stackItem保存栈的元素,另一个数组link2NextMaxValueIndex保存下一个最大值的位置两个指针:一个为stackTop指向栈顶,另一个为maxValueIndex指向最大值的下标操作插入时:比较插入元素与最大值的大小,如果比最大值还大呢,link2NextMaxValueIndex指向原来最大值的位置(即maxValueIndex),而maxValueIndex变为现在插入元素的位置;否则link2NextMaxValueIndex指向-1删除时:删除元素的位置出,如果maxValue 阅读全文
posted @ 2014-01-22 16:07 jihite 阅读(4868) 评论(2) 推荐(2) 编辑
摘要:问题思路cur = pre->next;post = cur=>next;cur->next = pre;cur = post;代码ListNode* reverseList(ListNode *root){ if (root == NULL) return root; L... 阅读全文
posted @ 2014-01-18 10:41 jihite 阅读(1369) 评论(0) 推荐(0) 编辑
摘要:线性表有序数组中绝对值最小值队列链表逆转单链表解决单链表中的环问链表中倒数第k个结点树二叉树遍历二叉树距离二叉树还原图图遍历查找图的遍历二分查找排序冒泡排序直接插入排序简单选择排序希尔排序快速排序堆排序归并排序动态规划最长连续序列最大上升序列编辑距离最长公共子序列 阅读全文
posted @ 2014-01-16 10:18 jihite 阅读(887) 评论(0) 推荐(0) 编辑
摘要:行文结构递归方法(前中后)非递归方法(前中后层)微软面试题二叉树遍历根据“根节点”遍历时相对的次序分为前序、中序、后序。图示为相对于根节点的次序,左右子树也是一样的规则。 前序遍历 中序遍历 ... 阅读全文
posted @ 2013-11-19 21:04 jihite 阅读(1539) 评论(0) 推荐(3) 编辑
摘要:二叉查找树(Binery Search Tree),要么是一颗空树,要么是具有以下性质的二叉树:(1) 要是结点的左子树不为空,则左子树的所有结点的值小于该结点的值(2) 要是结点的右子树不为空,则右子树的所有结点的值大于该结点的值(3) 该结点的左右子树也是二叉查找树二叉查找树通常用二叉链表存储结点。中序遍历二叉查找树可以得到关键字有序的序列,一个无序的序列可以通过构造一棵二叉查找树,再中序遍历得到一棵有序的链表。每次插入的位置都是叶子结点,插入时不用移动其他结点。搜索、插入、删除结点的复杂度为树高,即O(logn)(数列有序,退化成线性表,此时的复杂度为O(n))。查找二叉查找树T查找关键 阅读全文
posted @ 2013-11-17 20:58 jihite 阅读(1857) 评论(0) 推荐(0) 编辑
摘要:给定一个单链表,只给出头指针h:如何判断是否存在环?如何知道环的长度?如何找出环的连接点在哪里?带环链表的长度是多少?问题1 如何判断是否有环使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。slow fast问题2 如何判断环的长度在相遇点出同时出发,fast指针和slow指针再次相遇时,slow指针走过的点的个数就是环的长度。试问会不会slow在不到一圈的地方两者相遇呢?不会,因为假设slow走s,则fast走2s。二者相遇则二者距离必相差圈数的倍数,即:2s-s = k*圈距离=s。此时k=1 阅读全文
posted @ 2013-10-29 21:58 jihite 阅读(1696) 评论(0) 推荐(0) 编辑
摘要:尾递归 - Tail Recursion尾递归是针对传统的递归算法而言的, 传统的递归算法在很多时候被视为洪水猛兽。 它的名声狼籍, 好像永远和低效联系在一起.尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去.以n!为例介绍,后面例子n=5.代码线性递归int Rescuvie(int n){ return(n == 1) ? 1 : n * Rescuvie(n - 1); } 尾递归int T... 阅读全文
posted @ 2013-08-14 11:32 jihite 阅读(1784) 评论(0) 推荐(2) 编辑
摘要:问题描述一堆数(例如6, 2, 2, 6, 3, 4, 6, 6, 6, 6),总共10个,其中”6“的个数超过总数的一半5,找出这个个数超过过半的那个数。思路从头到尾遍历,两个数相同接着往后遍历;否则删掉这两个数,接着往后遍历。因为所找的那个数过半,所以不同的数相抵,抵消掉最后还会至少剩下一个那个要找的数。图示代码#include using namespace std;typedef struct node{ int num; node *before; node *next;}node;int main(){ node *p_now, *p_next; no... 阅读全文
posted @ 2013-07-17 22:39 jihite 阅读(1399) 评论(0) 推荐(0) 编辑
摘要:问题描述5, 5,-7, 5, 9, -1, 5, 1, 9, 4, 6 这堆数中两个数的和为10的组合有:5+5, 9+1, 4+6,如何快速的找出这样的组合?假定数组a[]存放元素,数组大小为len_a指定和为aim思路一先排序,low=0(最低位置),up=len_a(最高位置)当a[low]+a[up]>aim时,hig=high-1当a[low]+a[up] #include using namespace std; void printPairSums(int data[], int size, int sum); int main(int argc, char* a... 阅读全文
posted @ 2013-07-04 17:16 jihite 阅读(1363) 评论(0) 推荐(0) 编辑
摘要:在32位系统中,存储一位整型(int)数需要4个字节(4B),如果开辟一个空间,把其中的某个位1,就从原来的32b减少到1b,大大节省了空间。原理字符数组entry是存储位的数组,我们把数字N存到entry中,则把第N位置1:entry[nBits/8] = entry[nBits/8] | (1 << (nBits%8) )检验第N位是否为1:entry[nBits/8] & (1 << (nBits%8)图示函数void setBit(char entry[], int nBits){ entry[nBits/8] = entry[nBits/8] | (1 阅读全文
posted @ 2013-07-03 15:20 jihite 阅读(1378) 评论(0) 推荐(0) 编辑
摘要:问题假设:一个反应器中有两类粒子α和β,设每秒钟一个α粒子分裂成3个β粒子,而每秒钟一个β粒子分裂成一个α粒子和两个β粒子。假如在t=0时:反应器中有一个α粒子,求t秒时反应器中α粒子和β粒子的数目。根据关系列出递归关系a(t) = b(t-1)b(t) = 3*a(t-1) + 2*b(t-1)参考程序#include #include #define A_size 5 int aa(int size) //aa(t)表示t时刻α的个数{ if (size == 0) return 1; else return bb(size-1);}int bb... 阅读全文
posted @ 2013-06-25 22:59 jihite 阅读(5441) 评论(0) 推荐(2) 编辑
摘要:1.KMP算法2.(lhy)怎么切分最省 阅读全文
posted @ 2013-06-22 20:55 jihite 阅读(300) 评论(0) 推荐(0) 编辑
摘要:假设点可以均匀的扔到正方形中。如果一共扔N次,其中M次扔进内切圆内,则可以推导出计算π的公式:随机计算π大体思路:获得随机数(x,y),判断x*x + y*y是否在单位圆内,可以得到M的个数。程序:#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 1000int main(){ int i, M=0; double x, y, pi; srand((int)time(NULL)); for (i=0; i<N; i++) { x = rand() / (double)RAN. 阅读全文
posted @ 2013-06-20 11:11 jihite 阅读(3636) 评论(1) 推荐(0) 编辑
摘要:问题描述:给出点及点间的关系,指定点为根节点,把有向图转化为树。其中,有向图中的环,只是两个节点之间。比如经过去掉环得到其中图的表示为:1->22->42->51->35->2解决之道先用字典node_dic把整个图表示出来;列表has_kid存放不是叶子的节点;列表node_list是个队列,存放本节点和它的孩子;列表have_exist表示已经存在的节点,对于node_list如果不是孩子节点,又不在have_exist中,当被遍历是存于have_exist,同时在node_lst删除该节点。之后遍历node_list,如果之前已经存在于have_exist中 阅读全文
posted @ 2013-06-17 22:20 jihite 阅读(3988) 评论(0) 推荐(0) 编辑
摘要:问题描述给定两个字符串s1和s2,要求判定s2是否能被s1循环移位(rotate)得到的字符串包含。例如,给定字符串s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD返回false。对问题的两种分析,详见:http://www.cnblogs.com/bigwangdi/archive/2013/05/23/3095507.html思路一 是暴力算法,穷举所有最后还不一定找到。思路二 使用空间换取时间,是一种很好的思路。下面给出另外两个思路:思路三 思路二的优化。增加和源字串产度相同的空间,其实在大部分情况下造成浪费,可以根据待查字串动态分配指定的空间。如图:代 阅读全文
posted @ 2013-06-01 12:43 jihite 阅读(949) 评论(0) 推荐(0) 编辑
摘要:1.最长连续序列。比如 abccccfa,最长连续序列为cccc,长度为4思路:另开一个数组记录到目前位置最长连续序列长度。每个位置的字符(除第一个)和前一个比较,相同+1,不同标为1图示:代码:#include #include int main(){ char s[10] = "abccccfa"; int num[10] = {0}; char tmp; int maxpos, maxval, i; num [0] = 1; maxpos = 0; tmp = s[0]; for(i = 1; i num[maxpos]) ... 阅读全文
posted @ 2013-05-15 23:54 jihite 阅读(3546) 评论(0) 推荐(0) 编辑
摘要:题目:实现一个函数,要求吧字符串中的所有空格替换成“%20”。例如“hello world " ——> ”hello%20world%20"实际背景:在网络编程中,如果URL参数中含有特殊的字符,如空格、'#'等,导致服务器端无法识别时,就把这些特殊的字符转换成可以识别的字符。规则:%加上十六进制的ascii码,例如‘#’的ascii码是0x23(16进制),就替换成%23,看下图地址栏中,输入“hello#hao" 分析:注意:在c语言中存字符串最后一位是认为”\0“的,例如a[] = "12",那么a的长度为3,a[0 阅读全文
posted @ 2013-04-21 23:12 jihite 阅读(7945) 评论(3) 推荐(2) 编辑
摘要:问题:在一个二维数组中,每行的元素从左到右是递增的,每列元素从上到下是递增的。写一个函数,查找一给定的元素是否在此数组中输入:一个二维数组,和一个待查找的数输出:待查找的数在数组中输出“YES",否则输出”NO"原始思路:最简单思路就是暴力搜索,遍历一遍数组中的元素时间复杂度为O(n2)。但是这样就没有用问题的已知条件(从左到右、从上到下递增),因此不是个好的解法改进1:从第一行开始找,找到待查元素大的,如果还没找到,接着从第二行开始找,直到找到或到最后一个元素为止(如图),但是如果带查找的元素在最后,还得遍历到最后,时间复杂度还是O(n2) 改进2:上来在随机在里面挑一个 阅读全文
posted @ 2013-04-21 00:28 jihite 阅读(2407) 评论(0) 推荐(4) 编辑
摘要:解法一早在公元前300年,欧几里德就在《几何原本》中给出了高效的辗转相除法。欧几里得辗转相除法是现在算法的鼻祖。算法思路(伪代码)function gcd (a, b) while b ≠ 0 t = b b = a mod b //取余 a = t return a算法证明1. 两个数a、b,用a除以b,得 a = bq + r(q是商 r是余数)。若 r等于0,则b为最大公约数,否则,接着往下走2. 证明一点:任何a和b的公约数都是r的公约数。 证明:假设d为a、b的公约数,则a = md b = nd.r= a - bq = ... 阅读全文
posted @ 2013-04-14 23:45 jihite 阅读(951) 评论(0) 推荐(1) 编辑
摘要:上篇谈到了用异或来解决,确实是个好方法,时间复杂度为o(n),比例一遍ok,空间复杂度为o(1),只占用一个空间足矣。现在把这个问题升级下:(1)给出n个数,其中有且仅有一个出现了奇数次,其余的都出现了偶数次。用线性时间常数空间找出这个出现奇数次的数(2)给定n个数,其中有且仅有两个出现了奇数次,其余的都出现了偶数次。用线性时间常数空间找出这两个出现奇数次的数原理(原理不是很懂的,先看看上篇)任何数和自己异或为0任何数和0异或为自己异或具有交换律思路(1)一个出现奇数次出现偶数次的一异或为0了,对剩下的奇数次数不造成干扰奇数次(2n+1)的前2n次一异或为0了,对剩下那个数不造成干扰剩下的那个 阅读全文
posted @ 2013-04-04 23:38 jihite 阅读(2302) 评论(8) 推荐(1) 编辑