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

摘要:给定一个数组, 有一个数是重复的,找到这个数,要求时间复杂度是O(N),空间复杂度不能超过O(N) 很简单,自己当时老往排序上面想了.. 阅读全文
posted @ 2017-07-27 22:59 xshang 阅读(236) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std; void seSort(int arr[], int n) { int min, temp; for(int i = 0; i < n - 1; i++) { min = i; for(int j = i + 1; j < n; j++) { ... 阅读全文
posted @ 2017-07-18 20:17 xshang 阅读(170) 评论(0) 推荐(0) 编辑
摘要:重写单链表逆置,熟能生巧~ 阅读全文
posted @ 2017-07-14 22:40 xshang 阅读(134) 评论(0) 推荐(0) 编辑
摘要:重视思想和理解原理 阅读全文
posted @ 2017-07-14 19:51 xshang 阅读(269) 评论(0) 推荐(0) 编辑
摘要:字符串常量不可更改 阅读全文
posted @ 2017-07-14 19:49 xshang 阅读(227) 评论(0) 推荐(0) 编辑
摘要:#include #include #include using namespace std; void print(int elem) { cout &vec, int left, int right) { if(left key) { high--; } ... 阅读全文
posted @ 2017-01-14 20:45 xshang 阅读(173) 评论(0) 推荐(0) 编辑
摘要:这两天又重新看了一下二叉查找树,下面把自己的理解总结一下: 二叉查找树又叫二叉排序树,简称BST BST 满足如下性质: 每个节点的左孩子节点小于双亲节点,右孩子节点大于双亲节点。 在二叉查找树的基础上进行改进,就有了二叉平衡树(AVL树)和红黑树(RBT) 今天主要看了一下平衡树的旋转操作,有四种 阅读全文
posted @ 2016-09-25 11:05 xshang 阅读(224) 评论(0) 推荐(0) 编辑
摘要:问题描述:八皇后不能相互攻击,即,八个皇后不能同行,同列,不同在同一条对角线上, 对角线又可以分为左对角线和右对角线 左对角线上满足:i-j+7都相等(i,j分别是一维和二维的坐标) 右对角线满足:i+j 都相等 代码如下: 阅读全文
posted @ 2016-06-06 21:31 xshang 阅读(277) 评论(0) 推荐(0) 编辑
摘要:刚开始,我想到的是一种笨方法,先遍历单链表,计算出单链表的长度len,然后再从头遍历单链表到第len-k个节点,那么这个节点既是单链表的倒数第k个节点。 不过这种算法时间复杂度挺高的,还有一种更简单的方法,就是设置两个指针,分别指向单链表的头节点,然后让其中一个指针,先走k步,之后... 阅读全文
posted @ 2014-05-16 11:06 xshang 阅读(482) 评论(0) 推荐(0) 编辑
摘要:基数排序思想:分配桶,把待排序的数字按照从低到高的顺序排列。主要有两个过程,分配和收集。 分配时,根据数字的位数,从小到大存放到桶中。 收集时,按照顺序,再覆盖原数组。 重复分配和收集的过程,直到到数字的最高位。 好长时间不写C++代码了。。。 代码如下: #include #inc... 阅读全文
posted @ 2014-05-13 22:09 xshang 阅读(317) 评论(0) 推荐(0) 编辑
摘要:算法思想:在建立循环链表时设置两个指针,头指针和尾指针,head和tail,使tail->next=head,即让尾节点指向头节点,建立的时候采用尾插入法,每次让新节点先指向尾节点的下一个节点,然后让头节点的下一个节点指向新节点,然后让新节点赋值给头节点和尾节点。 判断是否是循环链表时,也设置两个指针,慢指针和快指针,让快指针比慢指针每次移动快两次。如果快指针追赶上慢指针,则为循环链表,否则不是循环链表,如果快指针或者慢指针指向NULL,则不是循环链表。include #include using namespace std;typedef struct list{ int data; 阅读全文
posted @ 2014-03-10 20:07 xshang 阅读(7952) 评论(0) 推荐(0) 编辑
摘要:这个需要注意的是字符串的结尾最后一个字符为'\0',并不是空字符,复制时要一块复制,算法思想就是先计算出字符串中总的空格数,然后重新计算字符串的长度,由于"%20"为3个字符,比原来多2个,所以,字符串长度是原来字符串长度加上空格字符总数×2,就是新的字符串的长度。代码如下:#include #include using namespace std;void strReplace(char str[],int length) { if(str==NULL||length=0;j--) { if(str[j]!=' ... 阅读全文
posted @ 2014-03-04 20:57 xshang 阅读(3145) 评论(0) 推荐(1) 编辑
摘要:旋转数组的概念:把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转。例如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。解法用到了二分查找法。有一种特殊情况下如果二分法所指向的三个元素都相等,就不能用二分查找法了,就要用顺序查找。#include #include using namespace std;int Min(int numbers[],int length){ if(length=numbers[index2]) { if(index2-index1==1) { ... 阅读全文
posted @ 2014-02-19 15:53 xshang 阅读(716) 评论(0) 推荐(0) 编辑
摘要:方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分。代码:#include #include using namespace std;typedef struct list{ int data; struct list *next;}*listNode;void initList(listNode &list) //初始化程序{ list=(struct list*)malloc(sizeof(struct li... 阅读全文
posted @ 2014-01-08 17:46 xshang 阅读(214) 评论(0) 推荐(0) 编辑
摘要:今天又重新写了一次快排,发现之前写的有问题#include using namespace std;static int count=0;int find(int arr[],int left,int right){ int i=left,j=right-1; int temp=i; int t=arr[temp]; while(i=t) { j--; } if(it) { arr[temp]=arr[i]; arr[i]=t; ... 阅读全文
posted @ 2013-11-02 21:55 xshang 阅读(227) 评论(0) 推荐(0) 编辑
摘要:把"00:90:8A:1D:30:51"转换成"00-90-8A-1D-30-51",如何格式错误,显示出格式错误的种类,有些不规范的转换成规范的格式,例如,"1234:8F:90-D1:76",为不规范格式转换成标准格式。#include #include #include using namespace std;void getStandardMac(char str[],char s[]){ int count=0; int temp=0; int pre=1; char c; for(int i=0;i='0' 阅读全文
posted @ 2013-10-15 16:31 xshang 阅读(6816) 评论(0) 推荐(0) 编辑
摘要:算法思想:定义栈,从右向左扫描字符串,遇到运算符,则栈顶和次栈顶的元素出栈,计算结果入栈,重复上面的步骤,知道字符串扫描完毕。#include #include #define MAXSIZE 256using namespace std;typedef struct stack{ int top; char stack[MAXSIZE];}Stack;void initStack(Stack *s){ s->top=0;}int getPrefixValue(Stack *s1,char s[]){ int i=strlen(s); int temp1,t... 阅读全文
posted @ 2013-10-14 15:20 xshang 阅读(541) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std;#define MAXSIZE 256typedef struct stack{ int top; int stack[MAXSIZE];}Stack;void initStack(Stack *s){ s->top=0;}void push(Stack *s,int elem){ if(s->top>MAXSIZE) couttop++; s->stack[s->top]=elem;}void pop(Stack *s){ if(s->toptop--;}int max(Stac... 阅读全文
posted @ 2013-10-11 21:37 xshang 阅读(1215) 评论(0) 推荐(0) 编辑
摘要:栈是先进后出的原理,即FILO,队列是先进先出的原理,即FIFO#include using namespace std;#define MAXSIZE 256typedef struct stack{ int top; int stack[MAXSIZE];}Stack;void initQueue(Stack *s) //初始化队列{ s->top=0;}void enQueue(Stack *s,int elem) //入队{ if(s->toptop++; //队首元素从以1开... 阅读全文
posted @ 2013-10-10 14:47 xshang 阅读(734) 评论(0) 推荐(0) 编辑
摘要:看到笔试和面试里很多这样的题目,于是就练习一下,温故知新。#include #include using namespace std;typedef struct List{ int data; struct List *next;}listNode,*pList;void createList(pList & list) //头插入法建立单链表{ pList head=NULL; int data; cout>data; list=(struct List *)malloc(sizeof(listNode)); ... 阅读全文
posted @ 2013-10-08 17:13 xshang 阅读(926) 评论(0) 推荐(0) 编辑