面试题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;
}
}
}
方法:需要两个指针分别指向开头和结尾,
当*开头+*结尾 > 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;
}
}
}
相关文章推荐
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 剑指offer 面试题41 递增数组中和为s的两个数字 | 和为s的连续整数序列
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 剑指offer 面试题41—和为s的两个数字VS和为s的连续正数序列
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 剑指offer-面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 数据结构面试题总结4——数组:求两个有序数组中的共同元素
- 剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列
- 一个有序数组数组,给出和为s的两个数字和连续正数数列
- 查找两个有序数组的公共元素
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- ] 两个有序非重数组,如果查找数组之间的重复元素 (未完成)
- 两个有序非重数组,如果查找数组之间的重复元素
- 和为s的两个数字VS和为s的连续整数序列(面试题 41)
- 【剑指offer】6.3知识迁移能力——面试题41:和为s的两个数字VS和为s的连续正数序列
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字