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;
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。
如有不对,请提出更改之处。