這是一個很好的算法題,解法類似於快速排序的整理方法。同時,更為值得注意的是這道題是 人人網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;
}