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

面试题41:有序数组,查找和为s的两个元素and 和为s的连续数字

2017-04-10 20:08 330 查看
第一个问题:有序数组查找和为s的两个元素

方法:需要两个指针分别指向开头和结尾,

当*开头+*结尾 > s时,需要--结尾

当*开头+*结尾 <s时,需要++开头

直到两个指针碰头为止,代码如下

#include<iostream>

using namespace std;

bool find_pair_for_s(int list[], int n, int s, int* index1, int* index2){
bool is_frond = false;
if(list == NULL || n < 0 || index1 == NULL || index2 == NULL){
return is_frond;
}
int first = 0;
int end = n - 1;
while(first < end){
if(list[first] + list[end] > s){
--end;
}else if(list[first] + list[end] < s){
++first;
}else{
*index1 = list[first];
*index2 = list[end];
is_frond = true;
break;
}
}
return is_frond;
}

int main(){
int a[10] = {1,3,5,6,8,9,12,14,15,17};
int index1 = 0;
int index2 = 0;
bool is_frond = find_pair_for_s(a, 10, 18, &index1, &index2);
if(is_frond){
cout << "frond: "<< index1 << " " << index2 << endl;
}
return 0;
}

第二个问题:求出和为s的连续数字
例如,s=15,则打印12345      456    78

方法:

1. 初始化 开头为1 结尾为2,当前之和为1+2 = 3

2. 如果当前和 < sum 则,结尾++,当前和变大

3. 如果当前和> sum 则, 开头++, 当前和变小

4. 如果当前和 == sug则,输出,且结尾++,当前和变大

5. 结束条件时:开头达到 (sum+1)/2,因为至此以后,无论谁++,都会大于sum

代码如下:

#include<iostream>
#include<vector>

using namespace std;

bool find_continuously_nums(int sum, vector<pair<int, int> > &result){
int a = 1;
int b = 2;
int cur_sum = a + b;
bool is_find = false;

while(a < (sum+1)/2){
if(cur_sum > sum){
cur_sum -= a++;
}else if(cur_sum < sum){
cur_sum += ++b;
}else{
pair<int, int> t(a, b);
result.push_back(t);
cur_sum += ++b;
is_find = true;
}
}
return is_find;
}

int main(){
int s = 15;
vector<pair<int, int> > result;
bool is_find = find_continuously_nums(s, result);
if (is_find){
for(int i = 0; i< result.size(); ++i){
cout << result[i].first << "~" << result[i].second << endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐