《剑指offer》第五十七题(和为s的两个数字)

// 面试题57(一):和为s的两个数字
// 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
// 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

#include <iostream>

bool FindNumbersWithSum(int data[], int length, int sum,
    int* num1, int* num2)
{
    bool found = false;
    if (length < 1 || num1 == nullptr || num2 == nullptr)//边界判断
        return found;

    int ahead = length - 1;//设置两个指针指向头和尾
    int behind = 0;

    while (ahead > behind)
    {
        long long curSum = data[ahead] + data[behind];//注意long long

        if (curSum == sum)//如果刚好等于
        {
            *num1 = data[behind];
            *num2 = data[ahead];
            found = true;
            break;
        }
        else if (curSum > sum)//如果大于要求的数值,令尾指针向前动一个
            ahead--;
        else//如果小于要求的数值,令头指针向前动一个
            behind++;
    }

    return found;
}

// ====================测试代码====================
void Test(const char* testName, int data[], int length, int sum, bool expectedReturn)
{
    if (testName != nullptr)
        printf("%s begins: ", testName);

    int num1, num2;
    int result = FindNumbersWithSum(data, length, sum, &num1, &num2);
    if (result == expectedReturn)
    {
        if (result)
        {
            if (num1 + num2 == sum)
                printf("Passed. 
");
            else
                printf("FAILED. 
");
        }
        else
            printf("Passed. 
");
    }
    else
        printf("FAILED. 
");
}

// 存在和为s的两个数字,这两个数字位于数组的中间
void Test1()
{
    int data[] = { 1, 2, 4, 7, 11, 15 };
    Test("Test1", data, sizeof(data) / sizeof(int), 15, true);
}

// 存在和为s的两个数字,这两个数字位于数组的两段
void Test2()
{
    int data[] = { 1, 2, 4, 7, 11, 16 };
    Test("Test2", data, sizeof(data) / sizeof(int), 17, true);
}

// 不存在和为s的两个数字
void Test3()
{
    int data[] = { 1, 2, 4, 7, 11, 16 };
    Test("Test3", data, sizeof(data) / sizeof(int), 10, false);
}

// 鲁棒性测试
void Test4()
{
    Test("Test4", nullptr, 0, 0, false);
}

int main(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/CJT-blog/p/10544547.html