数据结构与算法
chjjunking
这个作者很懒,什么都没留下…
展开
-
链表问题:如何判断一个链表有环,以及环的长度,起始位置。
1. 判断链表是否有环:采用两个指针,一个每次循环前进一步,一个每次循环前进两步。如果存在环,则一定会相交。否则速度快的指针首先为NULL,或其next为NULL。2. 环的长度:从相交点开始,循环一次,直到再次到该相交点。循环次数即为环的长度。3. 环的起始位置:若相交点为P,环长度为M。计算head节点到交点的距离,为N。则有,P点走M距离回到P点。head走N原创 2012-08-13 15:33:58 · 1107 阅读 · 0 评论 -
写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
int sum(int* arr, int count){ int sum=0; for(int i=0;i<count;++i) sum+=arr[i]; return sum;}int MinArrayDis(int* a, int* b, int count){ if(a==NULL || b==NULL || count<=0) return -1; bool原创 2012-09-03 13:39:59 · 3325 阅读 · 0 评论 -
谷歌面试题:1024! 末尾有多少个0?
解答思路:末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数。 是5的倍数的数有: 1024 / 5 = 204个 是25的倍数的数有:1024 / 25 = 40个 是125的倍数的数有:1024 / 125 = 8个 是625的倍数的数有:1024 / 625 = 1个 所以1024! 中总共有204+40+8转载 2012-10-04 16:25:16 · 1315 阅读 · 0 评论 -
神奇的catalan数
http://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0转载 2012-09-18 13:34:58 · 659 阅读 · 0 评论 -
写正确函数需要注意的地方:奇偶数分开,左边偶数,右边奇数。
void oddEvenSort(int* arr,int count){ int left=0; int right=count-1; int midval=arr[left]; while(left<=right) { while(left<=right && arr[right]%2==1) --right; if(left<=right) { arr[l原创 2014-03-04 12:11:28 · 917 阅读 · 0 评论 -
写正确函数需要注意的地方:输入一个字符串,打印出该字符串中字符的所有排列
void allPermutations(char* arr, char* desarr, bool* assis, int count, int curindx){ if(curindx==count) { desarr[curindx]=0; printf("%s\n",desarr); return; } for(int i=0;i<count;++i) { i原创 2014-03-04 12:13:27 · 910 阅读 · 0 评论 -
写正确程序需要注意的地方:输入一个正数n,输出所有和为n连续正数序列。
int sequenceFactor(int n){ if(n<=0) return -1; for(int i=2;i<=n/2;++i) { if(i%2==1)//需要分成奇数个 { int div=n/i;//则商为中间值。 if(n%i==0 && div-(i-1)/2>0)//必能整除,并且最小数应该大于0。 { printf("%d..原创 2014-03-04 12:13:37 · 756 阅读 · 0 评论 -
写正确程序需要注意的地方:一个数组是有一个递减数列座椅若干位形成的,在这种数组中查找某一个数。
//4,3,2,1,10,9,8,7,6,5int searchInRotateSortedArray(int* arr, int count, int value){ if (count<=0 || arr==NULL) return -1; int mid; int left=0; int right=count-1; while (left<=right) { //原创 2014-03-04 12:13:48 · 782 阅读 · 0 评论 -
写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
int numOf1(int n){ int factor=1; int count=0; while(n/factor!=0) { int higher=n/(factor*10);//当前位置的高位组成的数字。 int cur=n/factor%10;//当前位置数字 int lower=n%factor;//当前位置的低位组成的数字。 if(cur==0) c原创 2014-03-04 12:10:58 · 818 阅读 · 0 评论 -
找寻二叉树中两个节点的公共父节点中最近的那个节点
http://fayaa.com/tiku/view/16/转载 2014-03-04 12:11:10 · 527 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的合并排序
Node* mergeSort(Node* head, int length){ if(length==0) return NULL; if(length==1) { head->pNext=NULL;//一定要赋值为NULL,否则可能出现死循环。 return head; } int halflength=length/2; Node* halfp=head; fo原创 2014-03-04 12:12:54 · 557 阅读 · 0 评论 -
写正确函数需要注意的地方:二叉树非递归中序遍历
void Inorder_NoRecu(Node* root){//省去了参数正确性检测和返回值。 stack lefts; Node* cur=root; while(cur!=NULL || !lefts.empty()) { if(cur!=NULL) { lefts.push(cur); cur=cur->left; } else { cu原创 2012-09-10 14:43:14 · 987 阅读 · 0 评论 -
写正确函数需要注意的地方:最长递减子序列
int longest=0;void LongestSubSeq(int* arr, int count, bool* assis, int curindx, int lastnum, int length){ if(curindx==count) { if(longest<length) { longest=length; for(int i=0;i<count;++原创 2012-09-10 16:12:05 · 804 阅读 · 0 评论 -
写正确函数需要注意的地方:翻转句子中单词的顺序。
void invert(char* a, int start, int end){ for(;start<end;++start,--end) { char temp=a[start]; a[start]=a[end]; a[end]=temp; }}void invertwords(char* a, int start, int end){ invert(a,st原创 2012-08-13 16:58:31 · 1360 阅读 · 0 评论 -
写正确函数需要注意的地方:int转char*, char* 转int。
void invert(char* a, int start, int end){ for(;start<end;++start,--end) { char temp=a[start]; a[start]=a[end]; a[end]=temp; }}int toint(char *str){ int result=0; for(int i=0;str[i]!=0;原创 2012-08-13 17:50:11 · 2011 阅读 · 0 评论 -
写正确函数需要注意的地方:最大堆的创建与堆排序
void push_down(int* a, int indx,int count){ do { int leftindx=indx*2+1; int rightindx=leftindx+1; //在将indx所指的元素向下压的时候,将左右两个子节点中最大的,并且大于indx本身的向上提。 //如果没有可以上提的左右子节点,则结束。 if (leftindx=coun原创 2012-08-19 17:49:01 · 1015 阅读 · 0 评论 -
写正确函数需要注意的地方:两个有序链表的合并
Node* merge(Node* p1, Node* p2){ //检验输入参数。 if(p1==NULL) return p2; else if(p2==NULL) return p1; Node* head; Node* p; if (p1->value>p2->value) {//使得p1的第一个元素大于p2的。 p=p1; p1=p2; p2=p;原创 2012-08-19 16:45:04 · 809 阅读 · 0 评论 -
写正确函数需要注意的地方:子数组的最大和
int maxSum(int* a, int count){ if(a==NULL) { cerr<<"array==NULL"<<endl; throw ("array == NULL"); } if(count<0) { cerr<<"count<0"<<endl; throw ("count<0"); } int max=0x80000000; int f原创 2012-08-20 11:27:38 · 785 阅读 · 0 评论 -
写正确函数需要注意的地方:快速返回斐波那契数的第n项
void f(int n, int* a){ static int A[4]={1,1,1,0}; if(n==1) return; f(n/2,a);//计算一半矩阵乘法的结果 int temp[4]; for(int i=0;i<4;i++) temp[i]=a[i]; for(int i=0;i<2;++i)//获得n/2*2的结果 { for(int j原创 2012-08-20 17:12:59 · 1817 阅读 · 0 评论 -
写正确函数需要注意的地方:输入两个整数n和m,从数列1,2,3,...n中随意取几个数,使其和为m,列出所有可能组合
void getCombine(int* aux, int num, int indx, int val){ if(num<indx)//输入参数检测。 return; if(indx==val) { aux[indx]=1;//将最后一个数添加进去 for(int i=1;i<=indx;i++)//遍历所有之前的数,输出 { if(aux[i]==1)原创 2012-08-21 13:22:33 · 1964 阅读 · 0 评论 -
写正确函数需要注意的地方:在字符串中找出连续最长的数字串,并把这个串的长度返回
int findDigtalMaxLength(char* a, int count, char*& ret){ if(a==NULL || count<0)//输入参数处理 return 0; int maxstart=0;//记录最长数字串的起始 int maxlength=0;//记录最长数字串的长度 int length=0; int start=0; for(int原创 2012-08-21 13:45:07 · 1169 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的逆转,递归与非递归
Node* invert_list(Node* phead){ if(phead==NULL || phead->pNext==NULL)//参数验证 return phead; Node* p1=phead; Node* p2=phead->pNext; Node* p3=phead->pNext->pNext; while(p2!=NULL) { p2->pNext=p原创 2012-08-20 13:28:11 · 1103 阅读 · 1 评论 -
写正确函数需要注意的地方:两个非降序链表的并集,1>2>3和2>3>5合并为1>2>3>5。
int OutCombine(Node* p1, Node* p2){ while(p1!=NULL && p2!=NULL) { if(p1->value>p2->value) { coutvalue<<" "; p2=p2->pNext; } else if(p1->valuevalue) { coutvalue<<" "; p1=p1->pN原创 2012-09-10 13:59:52 · 4500 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的及时终止冒泡排序
Node* sort(Node* phead){ if (NULL==phead || NULL==phead->pNext) { return phead; } Node* ptemp=phead; Node* plastchangepoint=NULL;//标记上一次 while (plastchangepoint!=phead->pNext) { bool chan原创 2014-03-28 11:02:31 · 1894 阅读 · 0 评论