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

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。

 

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

 

转载于:https://www.cnblogs.com/xiaoguizi-buaa/p/3346440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值