转载并参考July的博客http://topic.youkuaiyun.com/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();
}