? ? ? 這是一個很好的算法題,解法類似于快速排序的整理方法。同時,更為值得注意的是這道題是 人人網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;
}
? ? ? 這樣就以高效的方法得到了結果。
?
?