您的位置:首页 > 职场人生

面试100题:14.求在有序数组中查找两个数的和为指定数

2013-02-01 14:58 330 查看
转载并参考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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐