算法
文章平均质量分 65
简直酷炫
这个作者很懒,什么都没留下…
展开
-
自己写的插入排序c++实现!
声明:本人纯菜鸟(应该算是菜到不得鸟),目前正在自学算法,今天写了一下插入排序的c++实现,写的不好,只是为了记录一下自己的学习过程!#include#includeusing namespace std;void main(){vector ivec;int num;while(cin>>num)ivec.push_back(num);int i,j,ke原创 2012-06-29 15:47:20 · 415 阅读 · 0 评论 -
二叉树后序遍历(非递归)
二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂。好在最终摸索出来了,不禁感叹很多出书人的水平真是...... 这里将直接可以在编译器里调试的代码贴出来(在DEV-C++编译器中编译通过) 这里我们约定:空的节点用空格表示,按转载 2013-07-01 10:42:47 · 585 阅读 · 0 评论 -
数组循环左移k位
题目:把含有n个元素的数组循环左移K位,要求时间复杂度O(n)法一:时间复杂度O(n),空间复杂度O(n) 左移位数k 将数组a分成两部分,把数组a的后部分复制到数组tmp中的前面部分,把a的前面部分复制到tmp的后面部分,在把tmp的元素复制到a中void ArrayLeftShiftKBit(int *a,int n,int k){ if(a==NULL |原创 2013-08-14 20:25:35 · 1612 阅读 · 0 评论 -
求解1-n之间的素数
1、最常用的方法void PrintPrime(int n){ int i,j; for (i=2;i<=n;i++) { bool Ok=true; for (j=2;j<=sqrt(i);j++) { if (i%j==0) { Ok=false; break; } } if(Ok) cou转载 2013-08-14 19:32:09 · 527 阅读 · 0 评论 -
判断字符串是否为IP地址
bool IsIPAddress(const char *str){ if(str==NULL || *str=='\0' || *str=='.') //这个地方就不解释了 return false; int len=strlen(str); int i=0,j=0; //i用来控制循环,j用来指示数组arr[] int arr[4]; /原创 2013-09-10 17:17:09 · 1040 阅读 · 0 评论 -
等概率随机函数的实现
题目:已知随机函数rand(),以p的概率产生0,以1-p的概率产生1,现在要求设计一个新的随机函数newRand(), 使其以1/n的等概率产生1~n之间的任意一个数。解决思路:可以通过已知随机函数rand()产生等概率产生0和1的新随机函数Rand(),然后调用k(k为整数n的二进制表示的位数)次Rand()函数,得到一个长度为k的0和1序列,以此序列所形成的整数即为1--n之间的数字。注转载 2013-08-21 21:10:50 · 696 阅读 · 0 评论 -
求字符串的最长重复子串
int pstrcmp(const void* p,const void* q){ //qsort要用到,按字典序对子字符串排序 return strcmp(*(char**)p,*(char**)q);}int comlen(char* p,char* q){ //求相邻两个子字符串的公共部分 int len=0; while(*p&&*q&&(*p++==*q+原创 2013-09-11 21:02:53 · 674 阅读 · 0 评论 -
概率随机问题
1、问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一 行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机。这个概念即蓄水池抽样(Reservoir转载 2013-08-21 10:55:19 · 768 阅读 · 0 评论 -
求最长递增子序列
下面程序是用动态规划法写的void LIS(int *a,int n){ int *Lis=new int[n]; //存储以i为结尾的最长子序列,动态规划法 int *prev=new int[n]; //prev[]存储最长子序列的每一个值的“前驱”的下标值, //例如测试中的最长子序列1,4,8,10(下标分别为0,2,原创 2013-09-15 21:48:03 · 658 阅读 · 0 评论 -
O(n^3)、O(n^2)和O(n)求最长回文子串
其实求最长回文子串就是求最长对称子串【法一】最容易想到的就是找出所有的子串(O(n^2)),判断每个字符是否对称(O(n)),所以总的时间复杂度是O(n^3)。【法二】法一是“从外向里”判断,相反,可以“从里向外”判断,时间复杂度O(n^2),代码如下void GetLongestSymmetircalSubstring(char *pStr){ int symmetric原创 2013-09-18 16:41:03 · 995 阅读 · 0 评论 -
判断单链表是否有环的相关问题
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如何找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fas转载 2013-10-04 19:38:41 · 752 阅读 · 0 评论 -
求最长不重复子串---O(n)
【题目】求字符串的的最长不重复子串,即子串中没有重复字符。例如“abcad”的最长。。。为“bcad”;“abca”的最长。。。为“abc”。。。void GetLongestNoRepeatedSubstring(char *str){ if (str==NULL || *str=='\0') { cout<<"Invalid Input"<<endl; return原创 2013-10-05 22:21:23 · 736 阅读 · 0 评论 -
求一个已排序的数组中绝对值最小的元素
题目为:有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。这一题该如何求呢?初步的解决思路是: 1.数组中的元素全为正,取最左边的数字; 2.数组中转载 2013-10-06 15:00:54 · 718 阅读 · 0 评论 -
堆排序中--建堆的算法复杂度分析O(n)
代码:[cpp] view plaincopyprint?templateclass T> inline void MaxHeap::make_heap(vector & v) { if (heap_.size() != 0) heap_.clear(); heap_ = v; // start with last转载 2013-09-01 14:45:08 · 813 阅读 · 0 评论 -
二叉树的非递归遍历
1.先序遍历从递归说起void preOrder(TNode* root) { if (root != NULL) { Visit(root); preOrder(root->left); preOrder(root->right); } }递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点转载 2013-06-28 16:37:39 · 532 阅读 · 0 评论 -
字符串转换为整数
bool isspace(char c){ if(c==' '||c=='\t' ||c=='\n'||c=='\v'||c=='\f'||c=='\r') return true; return false;}bool StrToInt(char *str,int &num){ if(!str) return false; while(issp原创 2013-07-08 14:57:38 · 518 阅读 · 0 评论 -
计算从1到n的正整数中1出现的次数!
long long numberof1(long long n){ long long count=0; long long factor=1; long long lower=0; long long curr=0; long long higher=0; while(n/factor!=0) { lower=n%factor; curr=n/fact原创 2013-05-20 19:36:38 · 783 阅读 · 0 评论 -
计数排序c/c++实现
计数排序的详细解释请看维基百科http://zh.wikipedia.org/zh-cn/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F void CountSort(int *arr,int n,int *sorted_arr){ int i; int *count_arr=new int[100]; for (i=0;i count_ar原创 2013-05-23 21:39:32 · 665 阅读 · 0 评论 -
斐波那契数列的递归、迭代(循环)、通项公式三种实现
转自http://blog.csdn.net/a9529lty/article/details/4564758所谓Fibonacci数列是指这样一种数列,它的前两项均为1,从第三项开始各项均为前两项之和。用数学公式表示出来就是: 1 (n=1,2)fib(n)= fib(n-1)+fib(转载 2013-05-24 15:22:52 · 883 阅读 · 0 评论 -
斐波那契数列通项公式的求法
以下两种方法其实是一样的1、方法一其实所有人都知道T(n)= T(n-1) + T(n-2), T(1) = T(2)=1,T(n)也是一个斐波那契数列,求解时间复杂度的本质也就是求数列通项,结果MB的一个通项就把我难住了,只好回来google一下,把高中数学用的求通项的方法放出来,软院的学生,果然还是跌倒在了数学上。。。P.S.用线代知识也能解据说?据说高中学的特征根法求通项实际上就转载 2013-05-24 15:38:36 · 7248 阅读 · 0 评论 -
单链表的反转
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用三个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 方法1:浪费空间。方法2:代码如下,参见http:转载 2013-05-28 20:37:30 · 600 阅读 · 0 评论 -
找出两个链表的第一个公共结点
转自http://zhedahht.blog.163.com/blog/static/254111742008053169567/题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:[cpp] view plaincopyprint?struct ListNode { int m_nKey; List转载 2013-05-21 11:04:16 · 469 阅读 · 0 评论 -
6174问题
6174问题:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.具体解释参见百度百科。题目:假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到转载 2013-06-09 15:50:43 · 1104 阅读 · 0 评论 -
判断单链表是否存在环
设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)代码如下bool IsExitsLoop(ListNode *head) { ListNode *slow = head, *fast = he转载 2013-05-28 21:02:17 · 583 阅读 · 0 评论 -
《程序员面试宝典》:输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序,即输出125,126,145,146
list list1;//用到STL中的容器,至于为什么用list容器,估计与作者的喜好有关吧 //用vector容器当然也行,而且好像一般推荐使用vector容器。其实这方面 //我也不是很懂,没研究过STL,只看过c++ primer上的那部分 void findLink(const char*p1,const char转载 2013-06-11 20:47:39 · 1352 阅读 · 2 评论 -
求周期串的最小周期
问题描述:(其实这个题是《算法竞赛入门经典上》的5.1.3题)如果一个字符串可以有某个长度为K的字符串重复多次得到,我们说该串一k为周期,例如abcabcabcabc以3为周期,(注意它也可以以6和12为周期)。输入一个长度不超过80 的串,输出它的最小周期。样列输入:HoHoHo样列输出:2分析:我们可以从小到大枚举各个周期;一旦符合就输出。代码:[cpp]转载 2013-06-07 21:48:47 · 1384 阅读 · 0 评论 -
阶乘的准确值
题目:输入不超过1000的正整数n,输出n!=1x2x3x...xn的精确结果。 样例输入:30 样例输出:265252859812191058636308480000000注:本题为《算法竞赛入门经典》5.2.2题,书上注释较少,我加上了较详细的注释。1000!约等于4*10^2567,所以可以用一个3000个元素的数组f保存。为了方便原创 2013-06-08 20:13:34 · 1024 阅读 · 0 评论 -
一个效率很高的归并排序算法!
今天看到的这种归并排序写法,个人感觉很好归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp]转载 2013-05-15 21:20:02 · 783 阅读 · 0 评论 -
整数转化成字符串; 字符串转换为整数
/*整数转化成字符串*/char *IntToStr(int num, char str[]){ int i = 0, j = 0; char temp[100]; while(num) { temp[i] = num % 10 + '0'; //取模运算得到从后往前的每一个数字变成字符 num = num / 10; i++; } temp[转载 2013-06-19 19:25:39 · 578 阅读 · 0 评论 -
用两个队列实现一个栈
题目:说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。解法:1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。3.如果继续做push操作,比如插入d,f,则把d,f插入到转载 2013-10-08 20:39:01 · 1022 阅读 · 0 评论