面试题(4)和为S的两个数字

题目:输入一个递增序列的数组S,在数组中查找两个数使得他们的和为s,如果有多对数字的和为s,输出任意一对即可。

思路:我们先在数组中选择两个数,如果他们的和等于s,这两个数即为我们所找的两个数,如果这两个数的和小于s,我们希望选择的两个数更大一点,由于数组是按照从小到大排序的,我们可以考虑选择较小的数字后面的数字,因为后面的数字较大一些,因此他们的和也会较大一点,这样我们就有可能找到两个和为s的数字了,同样当两个数字的和大于给定数字的时候,我们看了一考虑选择较大数字前面的数字。

比如:我们以数组{1,2,4,7,11,15}以及期待的和15为例,首先定义两个指针,第一个指针指向数组的最小的元素1,第二个指针指向数组的最带的元素15,他们的和为16>15,因此我们把第二个指针向前移动一位得数字11,此时他们的和为12<15,这时我们把第一个指针向后移动一位得到数字2,他们的和为13<15,此时再把第一个指针向后移动一位得到数字4此时他们的和为15,这正是我们期待的结果。

参考代码如下:

#include <iostream>
using namespace std;
bool findNumbersWithSum(int data[],int length,int sum,int *num1,int *num2)
{
    bool found = false;
    if(length < 1 || num1 == NULL || num2 == NULL)
        return found;
    int tail = length = 1;
    int head = 0;
    while(head < tail)
    {
        int nSum = data[tail] + data[head];
        if(nSum == sum)
        {
            *num1 = data[head];
            *num2 = data[tail];
            found = true;
            break;
        }else if(nSum > sum)
        {
            tail--;
        }
        else{
            head++;
        }
    }
    return found;
}
int main()
{
    int a,b;
    int data[] = {1,2,4,7,11,15};
    bool flag = findNumbersWithSum(data,6,15,&a,&b);
    if(flag)
    {
        cout<<a<<" "<<b<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值