面試題57(一):和為s的兩個數字
阿新 • • 發佈:2018-12-16
一、題目
輸入一個遞增排序的陣列和一個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。
二、關鍵
1.兩個指標,一個指向頭一個指向尾,按照規則向中間靠攏。
三、解釋
四、程式碼
#include <cstdio> 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 right= length - 1; int left= 0; while(left<right) { long long curSum = data[left] + data[right]; if(curSum == sum) { *num1 = data[right]; *num2 = data[left]; found = true; break; } else if(curSum > sum) right--; else left++; } 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[] = {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(); return 0; }