您的位置:首页 > 职场人生

面试题41:和为s的两个数字 VS 和为s的连续正数序列

2016-06-02 15:52 471 查看
题目1:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s。如果有多对数字的和等于 s,输出任意一对即可。

例如:输入数组{1 、2 、4、7 、11 、15 }和数字 15。由于 4+11 = 15 ,因此输出 4 和 11 。

/*************************************************************************
> File Name: find_numbers_with_sum.cpp
> Created Time: Thu 02 Jun 2016 12:18:54 PM PKT
************************************************************************/

#include<iostream>
using namespace std;

bool find_numbers_with_sum(int array[],int len,int sum,int &num1,int &num2)
{
bool found=false;
if(array==NULL || len<=0){
return found;
}

int first=0;
int last=len-1;
while(first<last){
int tmp=array[first]+array[last];
if(tmp<sum){
first++;
}else if(tmp>sum){
last--;
}else{
num1=array[first];
num2=array[last];
found=true;
break;
}
}

return found;
}

//测试
void test()
{
int arr[6]={1,2,4,7,11,15};
int sum=15;
int num1=0;
int num2=0;
find_numbers_with_sum(arr,6,sum,num1,num2);
cout<<num1<<ends<<num2<<endl;
}


题目2:输入一个正数 s,打印出所有和为 s 的连续正数序列(至少两个数)。

例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打出 3 个连续序列 1~5、4~6 和 7~8。

bool print_numbers_with_sum(int sum)
{
bool found=false;
if(sum<3){
return found;
}

int small=1;
int big=2;
int mid=(1+sum)/2;
int tmp=small+big;
while(small<mid){
if(tmp<sum){
big++;
tmp+=big;
}else if(tmp>sum){
small++;
tmp=tmp-(small-1);
}else{
for(int i=small;i<=big;i++){
cout<<i<<ends;
}
cout<<endl;

found=true;
small++;
tmp=tmp-(small-1);
}
}

return found;
}

void test1()
{
print_numbers_with_sum(9);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 剑指offer