转载并参考July的博客http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html,万分感谢!
题目:
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
分析:
此题目要求是时间复杂度为O(n),意味着只能遍历一次数组。另外要充分利用该数组已经排序的特征。可以从2端同时遍历,对a[begin]+a[end]进行3种情况的考虑:1)大于给定和,则把end--。2)小于给定和,则把begin++。3)相等,则打印结果。
/*Title:14.求在数组中查找两个数的和为指定数 Author:gocode Date:2012-10-12*/ #include <iostream> using namespace std; bool ValidateSum(int a[], int length, int sum) { int i = 0; int j = length - 1; bool flag = false; /*while(i<=(length - 1) && 0<=j)*/ while(i < j) { int result = a[i]+a[j]; if(result > sum) --j; else if(result < sum) ++i; else if(result == sum) { flag = true; break; } } if(flag) cout<<"找到两个数是: "<<a[i]<<" 和 "<<a[j]<<endl; else cout<<"没有找到"<<endl; return flag; } void main() { int a[] = {1, 2, 4, 7, 11, 15}; int len = sizeof(a)/sizeof(a[0]); ValidateSum(a, len, 15); getchar(); }
补充strstr函数
/*Title: 实现strstr函数 Author: gocode Date: 2012-10-12*/ #include <iostream> using namespace std; char * __cdecl StrstrFunc ( char *str1, char *str2 ) { char *cp = (char *) str1; char *s1, *s2; if ( !*str2 ) return((char *)str1); while (*cp) { s1 = cp; s2 = (char *) str2; while ( *s1 && *s2 && !(*s1-*s2) ) s1++, s2++; if (!*s2) { cout<<cp<<endl; return(cp); } cp++; } return NULL; } void main() { char *a1 = "ABCDAA"; char *a2 = "CDAA"; StrstrFunc(a1, a2); getchar(); }