// 面试题57(一):和为s的两个数字
// 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
// 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 #include <iostream> bool FindNumbersWithSum(int data[], int length, int sum,
int* num1, int* num2)
{
bool found = false;
if (length < || num1 == nullptr || num2 == nullptr)//边界判断
return found; int ahead = length - ;//设置两个指针指向头和尾
int behind = ; 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. \n");
else
printf("FAILED. \n");
}
else
printf("Passed. \n");
}
else
printf("FAILED. \n");
} // 存在和为s的两个数字,这两个数字位于数组的中间
void Test1()
{
int data[] = { , , , , , };
Test("Test1", data, sizeof(data) / sizeof(int), , true);
} // 存在和为s的两个数字,这两个数字位于数组的两段
void Test2()
{
int data[] = { , , , , , };
Test("Test2", data, sizeof(data) / sizeof(int), , true);
} // 不存在和为s的两个数字
void Test3()
{
int data[] = { , , , , , };
Test("Test3", data, sizeof(data) / sizeof(int), , false);
} // 鲁棒性测试
void Test4()
{
Test("Test4", nullptr, , , false);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
system("pause");
return ;
}