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

转载并参考July的博客http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html,万分感谢!

题目

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组12471115和数字15。由于4+11=15,因此输出411

分析

此题目要求是时间复杂度为O(n),意味着只能遍历一次数组。另外要充分利用该数组已经排序的特征。可以从2端同时遍历,对a[begin]+a[end]进行3种情况的考虑:1)大于给定和,则把end--2)小于给定和,则把begin++3)相等,则打印结果。

/*Title:14.求在数组中查找两个数的和为指定数
Author:gocode
Date:2012-10-12*/
 
#include 
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<<"找到两个数是: "<

补充strstr函数

/*Title:   实现strstr函数
Author:     gocode
Date:        2012-10-12*/
 
#include 
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<


你可能感兴趣的:(面试100题)