![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
番茄炒蛋蛋炒饭
这个作者很懒,什么都没留下…
展开
-
冒泡排序
冒泡排序:两两相邻两个元素进行比较,如果有n个元素需要比较n-1次,并且从下往上两两比较普通版类冒泡排序:#include <stdio.h>void BubbleSort(int k[], int n){ int temp; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j+...原创 2018-11-09 08:16:22 · 83 阅读 · 0 评论 -
斐波那契数列的应用
问题:一个人一次可以上一个台阶,也可以上两个台阶,那么上n个台阶有几种走法.解题思路:我们把n级台阶的跳法看成n的函数,记为f(n)。当n>2时,第一次上台阶有两种选择:一是第一次只上一级台阶,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);二是第一次上两级台阶,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。所以,n级台阶的不同跳法的总数f(n)...原创 2018-11-16 17:35:42 · 769 阅读 · 0 评论 -
在二维数组中查找一个整数
问题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:首先选取数组中右上角的数字,如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则去除该数字所在的列;如果该数字小于要查找的数字,则去除该数字所在的行。即如果要查找的数字不在数组的右上角,则每一...原创 2018-11-15 08:20:43 · 259 阅读 · 0 评论 -
对大数的处理
问题:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到999。解题思路:首先注意n没有规定范围,意味着n可以输入很大的值,那么这种情况下,无论时用整型还是长整型都会溢出。所以需要考虑大数问题。可以通过字符串来解决大数问题。因为数字最大是n位的,需要用一个n+1长度的字符串(字符串最后以为是结束符‘\0’),字符串中每个字符都是‘0’ ~ ‘9’之间的某一个...原创 2018-11-19 11:16:34 · 513 阅读 · 0 评论 -
替换字符串中空格
问题:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。解题思路:可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来字符串的长度加上2乘以空格数目。如“We are happy.”这个字符串长度是14(...原创 2018-11-15 10:18:00 · 149 阅读 · 0 评论 -
删除链表节点
问题一:在O(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext;};解题思路:在单向链表中删除一个节点,直观的做法是从链表的头节点开始,顺序遍历查找要删除的节点,并在链表中删除该节点。该方法的时...原创 2018-11-19 14:18:09 · 2843 阅读 · 0 评论 -
调整数组顺序
问题:输入一个数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。解题思路:最简单的思路是直接从头到尾扫描这个数组,没碰到一个偶数,取出这个偶数并把位于其后的所有数字往前挪动一位,挪完之后,将取出的偶数放到末尾的空位上,这种方法没碰到一个偶数就需要移动O(n)个数字,因此该方法的总的时间复杂度是O(n的平方)。换一种思路,维护两个指针,第一个...原创 2018-11-19 15:57:16 · 521 阅读 · 0 评论 -
查找算法
问题:把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.解题思路:最直观的方法,遍历一遍数组就能查找出最小的元素,但这种方法时间复杂度为O(n)。可以采用二分查找法(O(logn)),用两个指针分别指向数组的第一个元素和最后一个元素。旋转...原创 2018-11-17 10:57:43 · 84 阅读 · 0 评论 -
查找链表中倒数第k个节点
问题:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点,链表节点定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext;};解题...原创 2018-11-20 07:55:02 · 5160 阅读 · 0 评论 -
链表中环的问题
问题:如果一个链表中包含环,如何找出环的入口节点?如下图链表中,环的入口节点是节点3.解题思路:第一步是如何确定一个链表中是否包含一个环,也可以采用两个指针来解决,定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,如果走的快的指针追上了走的慢的指针,那么链表中就包含环,如果走的快的指针走到链表末尾了(m_pNext==nullptr)都没追上走的慢的指针,那么...原创 2018-11-20 08:37:23 · 113 阅读 · 0 评论 -
回溯法应用
问题:设计一个函数,来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径就不能再次进入该格。解题思路:这是一个回溯法的应用。首先,在矩阵中任选一个格子作为路径的起点,如果矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符。如果路径上的第i个字符不是ch,那...原创 2018-11-18 10:33:04 · 878 阅读 · 0 评论 -
链表反转
问题:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点,链表定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext;};解题思路:链表反转就是每个节点本来是指向后一个节点的现在指向了前一个节点,而反转链表的头节点就是反转前链表的尾节点。ListNode *ReverseList(...原创 2018-11-20 09:55:12 · 95 阅读 · 0 评论 -
链表的合并
问题:输入两个递增排序的链表,合并这两个链表并使新链表的节点仍然是递增排序的。链表节点定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext;};解题思路:这很像归并排序。同时要考虑鲁棒性ListNode *Merge(ListNode *pHead1, ListNode *pHead2){ ...原创 2018-11-20 10:21:43 · 94 阅读 · 0 评论 -
树的子结构
问题:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:struct BinaryTreeNode{ double m_dbValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};解题思路:可以分为两步,一,在树A中找到和树B的根节点的值一样的节点R,二,判断树A中以...原创 2018-11-20 11:11:35 · 103 阅读 · 0 评论 -
用两个栈实现一个队列
问题:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点。template<typename T> class CQueue{public: CQueue(void); ~CQueue(void); void appendTail(const T&...原创 2018-11-16 16:42:07 · 106 阅读 · 0 评论 -
动态规划和贪婪算法
如果是求一个问题的最优解(通常是求最大值或者最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以用动态规划来解决这个问题。在应用动态规划之前要分析能否把大问题分解成小问题,分解后的每个小问题也存在最优解。如果把小问题的最优解组合起来能够得到整个问题的最优解,那么就可以使用动态规划来解决这个问题。贪婪算法和动态规划不一样,当我们应用贪婪算法解决问题的时候,每一...原创 2018-11-18 17:16:18 · 970 阅读 · 0 评论 -
选择排序
选择排序:如果有n个元素会进行n-1次比较,每次比较会找到最小的元素与对应的元素进行互换#include <stdio.h>void SelectSort(in k[], int n){ int temp,min; for(int i=0;i<n-1;i++) { min=i; for(int j=i+1;j&...原创 2018-11-09 08:37:09 · 106 阅读 · 0 评论 -
斐波那契数列实现
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........。这个数列从第3项开始,每一项都等于前两项之和。方法一:迭代实现(打印前40个数列值)#include <stdio.h>#...原创 2018-11-04 09:43:29 · 214 阅读 · 0 评论 -
折半查找法实现
折半查找法的思想是:减少查找序列的长度,分而治之的进行关键字的查找。方法一:迭代实现#include <stdio.h>int bin_search(int str[],int size,int key){ int low,mid,high; low=0; high=size-1; while(low<=high) { ...原创 2018-11-04 11:21:04 · 3471 阅读 · 0 评论 -
汉诺塔问题
汉诺塔来源于印度的古老传说:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。这其实是一个经典的递归问题:抽象问题为将64个圆盘借助柱子Y从柱子X移动到柱子...原创 2018-11-04 16:51:29 · 130 阅读 · 0 评论 -
八皇后问题
八皇后问题是高斯提出的一个经典问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。这里用递归实现。#include <stdio.h>int count=0;int notDanger(int row,int j,int (*chess)[8]){ int i,k,flag1=0,fla...原创 2018-11-04 18:02:08 · 80 阅读 · 0 评论 -
字符匹配KMP算法
KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为T),如果它在一个主串(接下来称为S)中出现,就返回它的具体位置,否则返回-1.KMP算法的核心就是避免不必要的回...原创 2018-11-07 08:38:51 · 169 阅读 · 0 评论 -
直接插入排序
直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已经排好的有序表中,从而得到一个新的、记录数量增1的有序表。#include <stdio.h>void InsertSort(int k[], int n){ int temp; for(int i = 1; i < n; i++) { if(k[i] <...原创 2018-11-10 10:17:28 · 80 阅读 · 0 评论 -
希尔排序
希尔排序是插入排序的一种改进,是把记录按下标的一定增量分组,对每组使用直接插入排序算法进行排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。#include <stdio.h>void ShellSort(int k[], int n){ int temp, j; int step = n; do ...原创 2018-11-10 10:57:58 · 82 阅读 · 0 评论 -
堆排序
堆排序的基本思路:1、将待排序的序列构造成一个大顶堆。2、大顶堆的根节点就是序列的最大值,将它放在数组末尾就是最大值3、将剩余的n-1个序列重新构造一个大顶堆,得到n-1个中的最大值,放在数组倒数第二个位置4、反复进行#include <stdio.h>void swap(int k[], int i, int j){ int temp; tem...原创 2018-11-10 11:57:03 · 105 阅读 · 0 评论 -
归并排序
归并排序两种方法:递归实现---------#include <stdio.h>#define MAXSIZE 10void Mergelist(int *list1, int size1, int *list2, int size2){ int i, j, k, m; int temp[MAXSIZE]; i = j = k = m = ...原创 2018-11-10 13:58:53 · 94 阅读 · 0 评论 -
快速排序
快速排序是冒泡排序的改进版,也是最好的一种内排序。快速排序的思路:1、在待排序的元素任取一个元素作为基准(通常选第一个元素),称为基准元素;2、将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;3、对左右两个分区重复以上的步骤直到所有元素都是有序的。#include <stdio.h>int partition(int k[], i...原创 2018-11-10 17:08:49 · 125 阅读 · 0 评论 -
字符串匹配BF算法
BF算法是朴素的字符串匹配算法,说是朴素其实就是效率低下。#include <stdio.h>#include <string>using namespace std;int index(string S, string T, int pos){ int i = pos; int j = 0; while (i < S.size() &...原创 2018-11-05 08:40:03 · 821 阅读 · 0 评论 -
树的表示方法
树是n(n>=0)个结点的有限集。当n=0时称为空树,在任意一个非空树中,1、有且只有一个称为根的结点,2、当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,。。。Tm,其中每一个集合本身又是一个树,并且称为根的子树。如下图:该树的度为3,深度为3.树的表示方法一: data parent 0 A -1 1 ...原创 2018-11-08 08:42:37 · 1501 阅读 · 0 评论 -
二叉树算法
问题一:完成一个函数,输入一颗二叉树,该函数输出它的镜像。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};解题思路:二叉树的镜像过程可以理解为所有左右子节点交换的过程,先前序遍历这个树的每个...原创 2018-11-20 13:57:36 · 344 阅读 · 0 评论