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

剑指Offer----面试题41(1):和为s的两个数字

2016-08-02 10:15 381 查看

题目:

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

方法一:

分析

先固定其中的一个数字,再依次扫描该数字后边的数字,判断这两个数字的和是否为s,时间复杂度为O(n2)。

代码:

#include<iostream>

using namespace std;

void Function1(int *arr, int length, int s)
{
if (arr == nullptr || length<=1)
{
cout << "输入的数组不符合条件" << endl;
return;
}

for (int i = 0; i < length - 1; ++i)
{
for (int j = i + 1; j < length; ++j)
{
if (arr[i] + arr[j] == s)
{
cout << "找到一对值的和为s,分别为:" << arr[i] << "\t" << arr[j] << endl;
return;
}
}
}

cout << "没有找到" << endl;
}

void test1()
{
cout << "==================test1:{1,2,4,7,11,15}==================" << endl;
int arr[] = { 1, 2, 4, 7, 11, 15 };
int s = 15;
Function1(arr, sizeof(arr) / sizeof(int), s);
cout << endl;
}

int main()
{
test1();

system("pause");
return 0;

}


运行结果:
==================test1:{1,2,4,7,11,15}==================
找到,数值分别为:4     11

请按任意键继续. . .

方法二



分析

用两个指针,一个指向头,一个指向尾,求所指数字的和,如果等于s,直接输出两个数字;如果小于s,将头指针向后移动;如果大于s,尾指针向前移动,直至其和为s或者尾指针大于头指针。

这种算法的时间复杂度为O(n)。

源码

#include<iostream>

using namespace std;

void Function2(int *arr, int length, int s)
{
if (arr == nullptr || length <= 1)
{
cout << "输入的数组不符合要求" << endl;
return;
}

int *pBegin = arr;
int *pEnd = arr + length - 1;

while (pBegin < pEnd)
{
long long sum = *pBegin + *pEnd;
if (sum == s)
{
cout << "找到,数值分别为:" << *pBegin << "\t" << *pEnd << endl;
return;
}
else if (sum > s)
{
--pEnd;
}
else if (sum < s)
{
++pBegin;
}
}

cout << "没有找到" << endl;
}

// 存在和为s的两个数字,这两个数字位于数组的中间
void test11()
{
cout << "==================test1:存在和为s的两个数字,这两个数字位于数组的中间==================" << endl;
int arr[] = { 1, 2, 4, 7, 11, 15 };
int s = 15;
Function2(arr, sizeof(arr) / sizeof(int), s);
cout << endl;
}

// 存在和为s的两个数字,这两个数字位于数组的两段
void test12()
{
cout << "==================test2:存在和为s的两个数字,这两个数字位于数组的两段==================" << endl;
int arr[] = { 1, 2, 4, 7, 11, 16 };
int s = 17;
Function2(arr, sizeof(arr) / sizeof(int), s);
cout << endl;
}

// 不存在和为s的两个数字
void test13()
{
cout << "==================test3:不存在和为s的两个数字==================" << endl;
int arr[] = { 1, 2, 4, 7, 11, 15 };
int s = 20;
Function2(arr, sizeof(arr) / sizeof(int), s);
cout << endl;
}

// 鲁棒性测试
void test14()
{
cout << "==================test4:鲁棒性测试==================" << endl;
Function2(nullptr, 0, 0);
cout << endl;
}
int main()
{
test11();
test12();
test13();
test14();

system("pause");
return 0;

}


输出结果:
==================test1:存在和为s的两个数字,这两个数字位于数组的中间==================
找到,数值分别为:4     11

==================test2:存在和为s的两个数字,这两个数字位于数组的两段==================
找到,数值分别为:1     16

==================test3:不存在和为s的两个数字==================
没有找到

==================test4:鲁棒性测试==================
输入的数组不符合要求

请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐