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

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

2017-03-06 14:12 260 查看
题目一:输入一个递增排序的数组和数字,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

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

思路:可以利用2个指针,分别指向数组的第一个元素和最后的一个元素,如果两元素之和大于我们输入的和,则将第二个指针向左移一位,如果两元素之和小于我们输入的和,则将第一个指针向右移一位。时间复杂度为O(n)。

bool FindNumbers(int *a, int length, int *num1, int *num2, int sum)
{
bool ret = false;
if(length < 1 || num1 == NULL || num2 == NULL)
return ret;

int low = 0;
int high = length - 1;
int s = a[low] + a[high];

while(low < high)
{
if(s > sum)
high--;

else if(s < sum)
low++;

else
{
ret = true;
break;
}

s = a[low] + a[high];

}

*num1 = a[low];
*num2 = a[high];

return ret;
}

题目2:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列,

1~5,4~6,7~8。

思路:同样是使用两个指针的思想,令low指向1,high指向2,当low和high指向的元素小于我们输入的和时,则令high向右移动,若小于,则令low向右移动,直到high到(1+s)/2为止。

void FindNumbers(int *num1, int *num2, int sum)
{
int low = 1;
int high = 2;

int s = low + high;

while(high <= sum/2+1)
{
if(s > sum)
low++;

else if(s < sum)
high++;
else
{
for(int i = low; i <= high; i++)
{
cout<<i<<" ";
}
cout<<endl;
low++;
}

s = (low+high)*(high-low+1)/2;;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐