// 面试题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; }