随笔分类 - 数据结构与算法
笔记
摘要:一、递归实现 以上的cout<<root->data;是对结点的一种操作,这里可以对结点做任意想做的操作。 二、非递归实现
阅读全文
摘要:1 //在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字, 2 //而且只能往右走...不能向左...可上可下...求从起点到(m, n)处有 3 //几种不同的走法(函数的递归调用) 4 //要求打印出每一种走法 5 6 7 #include 8 #include 9 10 int counter = 0; 11 //一个点的结构 12 typedef struc...
阅读全文
摘要:(华中科技大学机试题)给定任意俩组字符串S1 和S2,请编程输出他们间的最大相同子串。例如:S1=12abc78,S2=7bc2,则输出为:bc
阅读全文
摘要:/*说明据说着名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直
阅读全文
摘要:用C语言写一个函数,去除字符串中的空格,并返回删除的空格的个数。不允许开辟新的空间,只能申请简单类型的自动变量。时间复杂度要求为O(n)。
比如:char str[]="dhkak df d fd fdjfkda dfd ff f fd da ";
处理之后: str[]="dhkakdfdfdfdjfkdadfdffffdda";
返回删除空格的个数为:12
算法思想:
先取字符串的长度,然后用前后各一个指针,分别为p,q,使前面一个指向空格,后面一个指向字符,然后用后面的值替换前面的空格,然后用空格替换;p指向下一个空格,q指向下一个值,直到p指向'\0'跳出循环,计算此时字符串的长度,再用处理之前的长度减去处理之后的长度,就可以得到删除的空格的个数。
代码如下:
阅读全文
摘要:const 与 static
阅读全文
摘要:对于二进制的加法运算,若不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0,通过对比异或,不难发现,此方法与异或运算类似。因而排出进位,加法可用异或来实现。然后考虑进位,0+0进位为0,1+0进位为1,0+1进位为0,1+1进位为1,该操作与位运算的&操作相似。那么加法运算可以这样实现:
1)先不考虑进位,按位计算各位累加(用异或实现),得到值a;
2)然后在考虑进位,并将进位的值左移,得值b,若b为0,则a就是加法运算的结果,若b不为0,则a+b即得结果(递归调用该函数)。
阅读全文
摘要:sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄,其中重点是struct的空间大小部分。关于sizeof的总结 1、sizeof的使用形式:s...
阅读全文
摘要:1、数组的声明要指出:存储类型,数组名,数组大小2、没有引用数组,因为引用已经初始化不能在改变,但是可以有数组引用,即数组的引用,可以用于函数实参传递。3、关于数组的初始化,若不显式提供元素,对于内置类型数组,在函数体外元素被初始化为0,而在函数体内则不被初始化。对于非内置类型,则不管在哪里定义,都...
阅读全文
摘要:数据结构部分:1、数组和链表的区别。(很简单,但是很常考,记得要回答全面)C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而...
阅读全文
摘要:1、建初始堆(以大顶堆为例),这一步骤把初始序列建成了一个满足大顶堆性质的序列,且每棵子树都满足。这个时候堆顶是本序列中最大的元素,因此将最后一个元素和堆顶元素调换,把最大值放到最终的位置上。建好了初始堆,就保留了排序时候的比较结果,后面的调整都可以再此基础上进行,加快排序效率。
2、由于每次讲堆顶元素和最后一个对调,破坏了堆的性质,因此要从新向下调整,建立大顶堆(这里在初始堆的基础上,只要将堆顶元素调到合适位置即可)。
3、调整完了之后,又将堆顶元素与未序区间的最后一个元素对调。
4、重复2,3直到堆中剩余一个元素。
阅读全文
摘要:假设我们已经知道快速排序的算法框架时,我们已经可以从宏观地去掌握快速排序算法的思想。但是快速排序算法的关键还是在于划分操纵,同时快速排序的性能主要取决于划分操作的好坏。快速排序分治partition过程有两种方法: 1)两个下标分别从首、尾向中间扫描的方法 2)两个指针索引一前一后逐步向后扫...
阅读全文
摘要:1、算法思想
快速排序是一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解: 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
阅读全文
摘要:
假设待排表长为n,从后往前两两比较相邻元素的值,若为逆序,则交换他们,知道序列比较完。我们称它为一趟冒泡排序,结果将最小的元素交换到待排序列的第一个位置。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟的结果把序列中的最小元素放到了序列的最终位置上,……,这样最多n-1趟冒泡就能把所有元素排序好。
阅读全文
假设待排表长为n,从后往前两两比较相邻元素的值,若为逆序,则交换他们,知道序列比较完。我们称它为一趟冒泡排序,结果将最小的元素交换到待排序列的第一个位置。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟的结果把序列中的最小元素放到了序列的最终位置上,……,这样最多n-1趟冒泡就能把所有元素排序好。
阅读全文
摘要:希尔排序基本思想 基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2=1;dk=dk/2)//控制步长变化,每次步长缩小为原来的1/2,直到1 5 { 6 ...
阅读全文
摘要:直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。1.简单方法 首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后...
阅读全文
摘要:方法一算法思想:用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树,只要在遍历每个结点的时候记录下它的高度,我们就可以一边遍历一边判断每个结点是不是平衡的。代码如下: 1 typedef struct BinaryTree 2 { 3 int data; ...
阅读全文
摘要:算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解。代码如下: 1 #include 2 using namespace std; 3 4 typedef struct BinaryTree 5 { 6 int data; 7 Binar...
阅读全文
摘要:知识:在先序遍历中,第一个结点就是二叉树的根节点;而在中序遍历中,根节点必然将中序序列分割成两个子序列,前一个子序列就是根节点的左子树的中序序列,后一个是根节点的右子树的中序序列。同样,给定后序序列和中序序列,按层次序列和中序序列可以也可以唯一确定一棵二叉树。但是,如果知道二叉树的先序序列和后序序列...
阅读全文
摘要:如果我们把二叉树视为一个图,父子几点之间的连线视为是双向的,我们可以把“距离”定义为来两结点之间边的个数。计算一个二叉树的最大距离有两种情况:情况A:路径经过左子树,通过根节点,再到右子树饿最深节点。情况B:路径不经过根节点,而是左子树或者右子树的最大距离路径,取其大者。只需要计算这两个情况的路径距...
阅读全文

浙公网安备 33010602011771号