人人笔试题——寻找俩数的和

9月22日,人人校招笔试题
1、给定一个有序数组a,长度为len,和一个数X,判断A数组里面是否存在两个数,他们的和为X,bool judge(int *a, int len, int x),存在返回true,不存在返回false。

2、贴上代码:

 1 bool judge(int* arrays,int n,int target)
 2 {
 3     if(n==1 && arrays[0] == target)
 4         return true;
 5     if(n == 1)
 6         return false;
 7     bool ascending = arrays[0]<=arrays[n-1]?true:false;
 8     int pre = 0,post = n-1;
 9     while (pre<post)
10     {
11         if(arrays[pre]+arrays[post]== target)
12             return true;
13         if(arrays[pre]+arrays[post]>target)
14         {
15             if(ascending)
16             {
17                 post--;
18             }
19             else
20             {
21                 pre++;
22             }
23         }
24         else 
25         {
26             if(ascending)
27             {
28                 pre++;
29             }
30             else
31             {
32                 post--;
33             }
34         }
35     }
36     return false;

37 } 

3、思路

(1)数组A,寻找俩数的和为target,设置前后指针,初始化前指针(pre)为0(C语言数组起始索引),后指针(post)为n-1;

(2)判断数组为升序还是降序? 此处假设为升序!

(3)在前指针不大于后指针的前提下,完成以下步骤:

        ① 如果A[pre]+A[post] 等于 target,则直接返回true,否则②;

② 如果A[pre]+A[post] 大于 target,注意到我们假设升序,则post-1;

    如果A[pre]+A[post] 小于 target,则pre+1,继续下一次判断;

 (4)最后默认设置返回false。

 

如有不对,请提出更改之处。 

posted @ 2013-09-29 22:17  小桂子的博客  阅读(376)  评论(3)    收藏  举报