這是一個很好的算法題,解法類似於快速排序的整理方法。同時,更為值得注意的是這道題是 人人網2014校園招聘的筆試題,下面首先對題目進行描述: 給出一個有序數組,另外給出第三個數,問是否能在數組中找到兩個數,這兩個數之和等於第三個數。 我們首先看到第一句話,這個數組是有序的,所以,我們可以定義兩個指針,一個指向數組的第一個元素,另一個指向應該指向的位置(這個需要看具體的實現和數組給定的值),首先計算兩個位置的和是否等於給定的第三個數,如果等於則算法結束,如果大於,則尾指針向頭指針方向移動,如果小於,則頭指針向尾指針方向移動,當頭指針大於等於尾指針時算法結束,沒有找到這樣的兩個數。 它看起來就好像下面這張圖一樣: 下面給出具體的實現:
#include <stdio.h> int judge(int *a, int len, int k, int *num1, int *num2); int main(int argc, char **argv) { int test_array[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; int result = -1; int num1, num2; result = judge(test_array, sizeof(test_array) / sizeof(int), 12, &num1, &num2); if(result == 0) { printf("%d\t%d\n", num1, num2); } else if(result == -1) { printf("can't find"); } else { printf("error"); } } int judge(int *a, int len, int k, int *num1, int *num2) { int *low = NULL; int *high = NULL; int i = 0; int result = -1; if(a == NULL || len < 2) { return result; } if(a[0] >= k) { return result; } while(a[i] <= k && i < len) { i++; } low = a; high = a + i - 1; while(low < high) { *num1 = *low; *num2 = *high; if((*low + *high) == k) { result = 0; break; } else if((*low + *high) > k) { high--; } else if((*low + *high) < k) { low++; } } return result; }