数据结构与算法
tianyi1991
这个作者很懒,什么都没留下…
展开
-
删除字串中指定的字符
今天看到同学在做题,要求是:把一个字符串中的所有空格去掉,合并所有字符。例如输入:abc 123 abc输出:abc123abc很简单吧!!总结了一下,想到三种简单的处理方法:第一种:时间复杂度为n^2,空间复杂度为nvoid delete_3(char* str){ int i=0,j=0; while (str[i]) { if (str[原创 2015-03-21 21:29:52 · 588 阅读 · 0 评论 -
数据结构与算法 题集
转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html由于这些题,实在太火了。所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来。此也算是前80题第一次集体亮相。 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之转载 2015-09-02 11:30:20 · 800 阅读 · 0 评论 -
链表的快慢指针:查找中点
一直做题都是数组中点,直接算n/2,但是链表的中点怎么求出来,我还真没见过,只能说自己做题太少了。今天做leetcode上的题就遇到了,虽然说简单,但对我来说这是个新的知识点,我得记录一下,代码如下:ListNode* findMidNode(ListNode* head){ ListNode *slow, *fast; slow = head; fas原创 2015-07-23 19:08:52 · 1934 阅读 · 3 评论 -
字串的循环旋转
《算法导论》P594 第32.4-7题解题:写出一个线性时间的算法,以确定文本 T 是否是另一个字符串 T‘ 的循环旋转。例如 arc 和 car 是彼此的循环旋转。思路很简单:分两步走:1.先确定匹配起点。如果T是T'的循环旋转,那么在T中一定会找到T'[0]的匹配起点。 2.找到匹配起点后,分别指向T与T'的遍历指针同时移动并比较其对应的字符是原创 2015-08-02 19:27:22 · 1537 阅读 · 2 评论 -
字符串匹配算法KMP实现
具体原理参照《算法导论》,这里做了一点小修改。获取模式值的函数:void getNextVal(int next[], int n, const char *str){ int k = 0; int p = 1; next[0] = 0; while (str[p]) { while (k > 0 && str[k] != str[p]) k = next[k-1原创 2015-08-02 14:54:13 · 519 阅读 · 1 评论 -
按层次方式打印二叉树
给定一个二叉树,以层次方式打印各层元素,如下。用到广度优先遍历。以广度优先,就是说一层层地打印,这样,先入的就先打印,所以用到的数据据结构是队列。而深度优先,则是先遍历完一个分支才进行第二个分支,用的是栈结构。Given a binary tree, return the level order traversal of its nodes' values. (ie, from left原创 2015-07-28 10:58:31 · 2293 阅读 · 0 评论 -
最长回文字串的提取
#include #include using namespace std;class Solution {public: string longestPalindrome(string s) { if (s.empty() || s.size() == 1) return s; int minStart = 0; int maxlength = 0; in原创 2015-06-30 16:07:36 · 488 阅读 · 1 评论 -
C++ STL中哈希表 hash_map介绍
0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信转载 2015-06-01 17:08:53 · 335 阅读 · 0 评论 -
三次乘法完成复数相乘的实现
设计算法,仅使用三次实数乘法即可完成复数 a+bi 和c+di 相乘。算法需要接收a,b,c,d为输入,分别生成实部ac-bd 与虚部 ad+bc;如下:A=(a+b)cB=(c+d)bC=(b-a)d(A-B)+(B-C)i原创 2015-04-17 19:48:25 · 2787 阅读 · 0 评论 -
各种排序算法的稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳转载 2015-04-22 16:40:58 · 397 阅读 · 0 评论 -
堆排序的实现
堆排序是一种很优秀的算法,还可以利用堆实现优先队列!特点: 1.最坏情况的时间复杂度: 上限 nlgn;(比插入排序快) 2.原址排序 (不同于归并排序)步骤: 1.最大堆维护 2.建堆 3.堆排序(不断地从根取出元素,再调用维护函数保持堆性质)//数组的第一个元素是指示堆中元素的数量,不包括a[0],所以数组总大小为 a[0]+1,就是元素个数n+1;//原创 2015-04-22 10:15:28 · 338 阅读 · 0 评论 -
插入排序的实现
1.时间复杂度 n^2,但是少量数据的情况下比归并排序要好,因为归并排序的常数因子很大!2.原址排序void insert_sort(int date[], int n){ int key;//待插入的值 int i; int j; for (j = 0; j < n; ++j) { key = date[j];//待插入的值 i = j - 1;//当前原创 2015-04-22 10:22:08 · 322 阅读 · 0 评论 -
C语言中生成随机数的另类实现
请描述random(a, b) 过程的一种实现,它只调用random(0,1)。意思就是说,你用一个只返回0和1这两个随机数的函数来实现一个能返回a,b间任意数的一个随机函数。实现如下:#include #include #include #include //时间相关int Random(int a, int b){ int i; int ram = a; f原创 2015-04-18 11:26:49 · 451 阅读 · 0 评论 -
快速排序的实现
简介:快速排序通常是实际排序应用中最好的选择,因为它的性能非常好:其期望时间复杂度为 nlgn ;而且隐含的常数因子非常小,另外,它还能进行原址排序,甚至在虚存环境中也能很好地工作.特点: 1.最坏情况的时间复杂度:n^2;(发生在) 2.期望时间复杂度: nlgn; 3.原址排序 没有什么特殊的输入会导致最坏情况的发生!注意:lgn是以2为底方法:分原创 2015-04-22 10:11:41 · 396 阅读 · 0 评论 -
九度OJ1008-最短路径问题 之 dijkstra算法的理解与实现
因为没学过数据结构,所以不好下手,但我也知道这是数据结构里面的东西,所以,,,还是先来学学理论吧。看了也写了测试程序,最后总结一下这个算法,当然这只是表面一点的东西,更深一点的,后面慢慢说。Dijkstra算法针对单源点的最短路径问题,Dijkstra提出了一种按路径长度递增次序产生最短路径的算法,即迪杰斯特拉(Dijkstra)算法,其思想是:从图的给定源点到其它各个顶点之间客观原创 2015-03-22 19:56:01 · 790 阅读 · 0 评论 -
BUG!!求二进制数中1的个数---编程之美
问题如题,在编程之美中也给出了很多方案,而对于这一个题,我想大家最快想到的就是通过移位来进行,而编程之美中也是写了两种用位操作的方式,我就拿其中一个来说吧,这个bug也不是什么大问题,但它确实是一个很低级的bug!下面是编程之美的源码:int Count(int v){ int num = 0; while (v) {原创 2015-12-16 19:14:15 · 483 阅读 · 0 评论