题目:
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是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:<span style="font-family:Microsoft YaHei;"> </span>实现strstr函数
- Author:<span style="font-family:Microsoft YaHei;"> </span>gocode
- Date:<span style="font-family:Microsoft YaHei;"> </span>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();
- }