![](https://img-blog.csdnimg.cn/20190908130732831.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Data Structures and Algorithm
文章平均质量分 74
Data Structures and Algorithm
zxucver
这个作者很懒,什么都没留下…
展开
-
C语言 一个例子说明结构体变量,结构体数组和结构体指针
输入三个学生的个人信息 包含学号 姓名和三门学科的成绩 输出平均成绩最高的学生的学号 姓名 各科成绩以及平均成绩 代码如下(谭浩强c程序设计的例子)#include<stdio.h>struct Student{int num;char name[20];float score[3];float aver;};int main(){ void input(struct Stu原创 2016-12-21 10:26:10 · 39513 阅读 · 6 评论 -
算法-寻找两个链表的第一个公共结点
题目: 输入两个链表,找到他们的第一个公共结点,链表结点定义如下:struct ListNode{ int value; ListNode *next;};解题思路: 首先我们需要想清楚的是,如果一个链表出现了公共结点,那么这两个链表是什么样子的,显然它的结构应该是一个“Y”型: 由于是单向链表,所以只有一个指向下一个结点的指针。这意味着如果出现了公共结点那么这个结点之后的结点也原创 2017-08-04 20:51:43 · 678 阅读 · 0 评论 -
算法-从尾到头打印链表
题目: 输入一个链表,要求从尾到头打印该链表,链表结点定义如下:struct ListNode{ int value; ListNode *next;};解题思路: 要求很好理解,比如一个链表是: 打印的结果是:6 5 4 3 2 1 1.相信大多数人看到这个要求后的第一反应是反转链表,再从头打印,但是这样一来,原始数据就改变了。 2.当然我们可以建立新的内存空间,然后拷原创 2017-08-06 01:27:05 · 548 阅读 · 0 评论 -
算法-O(1)时间删除链表的指定结点
题目:给定一个链表的头指针和一个结点的指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int value; ListNode *next;};void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);解题思路: 首先,乍一看这个名字而不看题目要求的话,这是功能是不可原创 2017-08-06 14:01:17 · 664 阅读 · 0 评论 -
数据结构-栈
栈栈的定义栈是一种特殊的线性表,仅允许在表的一端进行插入和删除运算。这一端被称为栈顶(top),相对地,把另一端称为栈底(bottom)。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。所以栈具有“后入先出”的特点(LIFO)。 顺序存储于链原创 2017-08-13 00:24:25 · 8924 阅读 · 0 评论 -
算法-斐波那契数列
题目: 写一个函数,输入为n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列定义如下: 解题思路: 斐波那契问题是个非常经典的递归问题,比如我们想要求得f(8),f(8)=f(7)+f(6),而f(7)=f(6)+f(5),……,直到n=1或n=0时递归结束,那么我们很容易就编出来下面的代码:#include "iostream" using namespace std;原创 2017-08-19 23:02:26 · 802 阅读 · 0 评论 -
数据结构-队列
队列的定义在很多资料中,队列与栈往往一同出现,因为它与栈有很多相似的地方。队列是只允许在一端插入另一端删除的线性表,即一种先入先出(FIFO)的结构,队列有顺序对列与循环队列,循环队列主要是为了弥补队列存储空间不足与“假溢出”的问题,所以在实际应用时,往往使用的是循环队列,下面我们从头说下为什么会有循环队列这个东西: 在栈中,我们把数组中的第一个元素作为栈底,因为栈是一种后入先出的顺序,也就是后再原创 2017-08-13 13:30:55 · 860 阅读 · 0 评论 -
算法-两个栈实现队列
题目: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T> class CQueue{public: CQueue(void); ~CQueue(void); // 在队列末尾添加一个结点 void appendTail原创 2017-08-13 17:50:31 · 559 阅读 · 0 评论 -
算法-反转字符串与反转单词
题目: 将字符串内容进行倒置,比如 I like beijing. 经过函数后变为:.gnijied ekil I。解题思路: 首先题目说的很明确,就是反转字符串,不是打印,也不是创建一个新的字符串,而是改变原数据,最简单的思路就是将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,函数可以返回一个标志位,也可以啥都不返回: 指针作为函数形参和数组作为函数形参是一样的,而且假设原创 2017-08-15 04:24:41 · 1184 阅读 · 0 评论 -
算法-从1,...,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值
题目: 从1,2,3,…..98,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值。 解题思路: 这是阿里巴巴的一道笔试题目,这并不是一道编程类的题目(虽然可以用编程来解决),这更像一道数理统计的题目,由于期望性质: 那么我们可以先考虑取到的若干个数的某一位: 由于异或的特性, 对任意一个二进制位,取奇数个1异或后会得到1,取偶数个1异或后会得到0,原创 2017-08-22 13:10:19 · 5242 阅读 · 1 评论 -
算法-删除字符串中的公共字符
题目: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入“They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”解题思路: 好未来那这道题做过笔试题目,首先最简单的思路就是两层循环遍历,下面将“They are students.”称为字符串1,将“aeiou”称为字符串2。每遍历到字符串2中的一个字符,就在字符串原创 2017-08-15 18:15:04 · 3702 阅读 · 1 评论 -
算法-1到n中所有和为m的组合
题目: 输入两个整数 n 和 m,从数列1,2,3…….n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。原创 2017-08-16 01:05:19 · 4578 阅读 · 0 评论 -
算法-排序算法总结
介绍冒泡排序,简单选择排序,插入排序,希尔排序,快速排序归并排序和堆排序。原创 2017-08-25 15:45:47 · 640 阅读 · 0 评论 -
算法-合并两个排序的链表
题目: 输入两个递增排序的链表,合并着两个链表并使新链表中的结点仍然是按照递增顺序的。例如输入的链表1和链表2如下,合并后的为链表3。链表的结点定义如下:struct ListNode{ int value; ListNode *next;};解题思路: 首先可以确定的是,链表1和链表2本身就是递增的,所以合并的过程可以从链表1,2的头结点开始,先比较1,2的头结点原创 2017-08-03 20:44:32 · 7050 阅读 · 3 评论 -
数据结构-静态链表及其插入删除操作
什么是静态链表我们平常提及的链表一般指的是动态链表,是使用指针将一个一个的结点连起来,除了动态链表之外,还有静态链表,这种链表用数组来描述,主要为了解决没有指针或者不用指针的情况下具备链表插入删除操作便捷的特性。 静态链表中有一些专属的概念,先贴上图: 这就是一个静态链表,首先他是一个数组(长度为8),数组的类型显然要根据需要定义,在上图中的类型为:typedef struct {原创 2017-08-02 02:51:34 · 10000 阅读 · 6 评论 -
时间复杂度的计算
如果我们想验证一段代码的效率,一个最直接的办法就是编出来之后运行一下,这个方法称为事后统计方法,但是这个方法存在着非常大的弊端,比如我们需要时间编写代码,而代码写完后如果不符合要求需要重新编写;测试的方法会受到硬件和内存占有率的影响等等。所以为了让代码的评估更加规范和科学,我们更多的使用事前分析估计方法,即计算一个代码的时间复杂度。 其实一段代码的时间复杂度计算很容易,它是一种对计算次数的统计,它原创 2017-06-02 11:15:26 · 3211 阅读 · 1 评论 -
建模-判断一列数是不是等差数列
题目: 如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。 小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两个位置的数值的操作,并且交换操作允许交换多次。但是有些数列通过交换还是不能变成等差数列,小易需要判别一个数列是否能通过交换操作变成等差数列。输入要求: 输入包括两原创 2017-08-16 17:28:20 · 3769 阅读 · 0 评论 -
数据结构-链表
链表是一种常见的重要的数据结构,他的特点是动态地进行存储分配。 1.链表有哪些优势? 举个栗子:如果事先不知道不知道要存放的数据的长度,就要把数组定的足够大。如果要用同一个数组存放不同长度的数据时,就要选择数据长度最长的那个作为数组的长度。链表能够比较好的解决这两种情况。 2.什么是链表? 链表有一个“头指针”,它指向一个元素,这个元素在链表中被称为“结点”,而每一个“结点”原创 2016-12-19 14:27:00 · 998 阅读 · 0 评论 -
算法-重建二叉树
题目: 输入某二叉树的前序遍历与中序遍历结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果均无重复数字,前序遍历序列为{},中序遍历序列为{},则重建出图2.6所示的二叉树并输出他的头结点。二叉树的结点定义如下:struct BiTNode{ int data; BiTNode* lchild; BiTNode* rchild; }; 解题思路:在原创 2017-08-11 18:18:18 · 617 阅读 · 0 评论 -
算法-字符串替换空格
题目: 实现一个函数,把字符串中的每一个空格替换成”%20”。例如输入”We are happy.”,则输出”We%20are%20happy.”。解题思路: 首先我们需要先想清楚一点,函数就要求输出替换后的结果,没有说是在原数据上替换,还是可以申请内存,创建一个新的字符串? 后者可以让问题变得简单,用比较直接的方式就可以实现一个时间复杂度为O(n)的代码,首先我们先遍历一遍字符串,找到到底有原创 2017-08-09 17:37:01 · 675 阅读 · 0 评论 -
算法-数字在排序数组中出现的次数
题目: 统计一个数字在排序数组中出现的次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现的次数就是3。解题思路: 1.首先,遍历数组肯定就能知道某个数字的个数,此时的时间复杂度O(n)。 2.除此之外,我们注意到,任务本质上是查找问题,而且是排序好的数组,可以尝试用二分查找算法,这样我们可以找到一个3,然后根据这个3向数组的两端遍历,找到所有的3,但是如果3是n个呢?这个算法本原创 2017-08-09 14:27:41 · 6755 阅读 · 3 评论 -
算法-链表反转操作
题目: 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点。链表定义如下:struct ListNode{ int value; ListNode *next;};解题思路:原本我们有一个这样的链表,并且知道他的头结点,即存放数值1的节点的地址。 链表反转后的效果:并返回新的链表的头结点,即原链表最后一个结点的地址。 为了现实上面的功能,需要调整原链表中的指针方向,原创 2017-07-31 19:04:11 · 885 阅读 · 2 评论 -
算法-获取链表中倒数第k个结点
题目: 输入一个链表,输出该链表中的倒数第k个结点。比如链表中的值为1,2,3,4,5,6。倒数第三个结点为值为4的结点。链表定义如下:struct ListNode{ int value; ListNode *next;};解题思路: 这个问题相对来说还是挺好理解的,要找到倒数第k个结点,最直接的思路肯定是倒着数k个结点不就好了,但是问题是链表不能从尾结点开始遍历,只能从头结点开始原创 2017-07-31 23:27:39 · 1150 阅读 · 0 评论 -
算法-旋转数组的最小数字
题目输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为数组{1,2,3,4,5}的一个旋转,该数组的最小值为1。旋转数组把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,这本身没什么,但是如果旋转前的数组是一个排序好的递增数组,旋转数组就会有一些比较有意思的特性。 上图中是一个原数组与旋转数组,我们可以发现,旋转数组有两个排序好的子序列{原创 2017-08-09 01:05:42 · 704 阅读 · 0 评论 -
算法-调整数组顺组使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,偶数位于数组的后半部分。解题思路: 比如我们有一个这样的数组: 数组的长度为10,最后能够实现前面4个数字是奇数,后面6个数字是偶数就好了,前面奇数的排序后后面偶数的排序没有要求,比如: 为啥数组里面有两个2呢?这是为了后面介绍是更方便的说明指针如何移动。为了实现这个任务,一个最简单、粗暴原创 2017-08-07 15:18:28 · 848 阅读 · 0 评论 -
算法-二维数组中的查找
问题: 在一个二维数组中,每一行元素都按照从左到右递增的顺序排序,每一列元素都按照从上到下递增的顺序排序。实现一个查找功能的函数,函数的输入为二维数组和一个整数,判断数组中是否含有该整数。 解题思路: 比如一个二维数组是这样: 要查找数组7在不在数组内,根据前人总结出来的规律,我们可以这样做: 选择从数组的右上角的点开始比较,此时该值为9,9>7,同时9还是第四列最小的数字,那么这意味原创 2017-08-07 00:48:50 · 5270 阅读 · 1 评论 -
数据结构-单链表的读取,插入与删除
链表定义:struct ListNode{ int value; ListNode *next;};单链表读取在顺序存储结构中,比如数组中,想要获取某一个位置的数据是非常容易的一件事,但是在链表中却要麻烦一些,因为链表的存储单元并不是连续的,而且我们只知道链表的头结点,也就是想知道第i个位置的数据,只能从头找下去,并没有什么其他的好方法。 需要注意的是,如果i大于链表的长度的话程序会异原创 2017-08-01 17:46:01 · 14358 阅读 · 1 评论 -
数据结构-二叉树遍历总结
二叉树结构二叉树是一种特殊的树,每个父结点最多只能用有两个子结点。 在树中,按照结点的“继承”关系可以分为父结点和子结点; 按照结点的位置关系可以分为根结点,中间结点和叶结点。 其中叶结点没有子结点。 我们用结点中的数字代表结点,那么在上图中:10为根结点;6、14为中间结点;4、8、12、16为叶节点。一段题外话: 而且在上图中,还是二叉树中的特殊结构——二叉搜索树,所有左子结点的数原创 2017-08-11 01:18:26 · 4178 阅读 · 0 评论