面试题45:和为s的两个数字VS和为s的连续正数序列
2016-01-13 14:20
387 查看
题目一:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
思路:
由于数组已经排好序,可以从数组的头尾各取一个数字。
如果它们的和等于s,输出结果。
如果他们的和小于s,则前面的那个数往后一一个,重新判断。
如果它们的和大于s,则后面的那个数往前移动一个,重新判断。
知道出现相等或者前面的数和后面的数碰到。
时间复杂度:O(n)
代码略。
题目二:
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列。
思路:
用类似于题目一的方法,我们用两个数small和big来表示序列的最小值和最大值,small初始化为1,big初始化为2,如果序列的和小于s,则big增加1,如果序列的和大于s,则small增加1(即去掉序列中较小的值)。一直增加small到(1+s)/2。
输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
思路:
由于数组已经排好序,可以从数组的头尾各取一个数字。
如果它们的和等于s,输出结果。
如果他们的和小于s,则前面的那个数往后一一个,重新判断。
如果它们的和大于s,则后面的那个数往前移动一个,重新判断。
知道出现相等或者前面的数和后面的数碰到。
时间复杂度:O(n)
代码略。
题目二:
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列。
思路:
用类似于题目一的方法,我们用两个数small和big来表示序列的最小值和最大值,small初始化为1,big初始化为2,如果序列的和小于s,则big增加1,如果序列的和大于s,则small增加1(即去掉序列中较小的值)。一直增加small到(1+s)/2。
#include <iostream> #include <vector> #include <queue> #include <string> #include <stack> #include <algorithm> #include <hash_set> //for hashtable #include <hash_map> #include <unordered_map> #include <set> #include <ctime> using namespace std; using namespace std; int GetSum(int small, int big) { int re = 0; while (small <= big) { re += small; small++; } return re; } vector<vector<int>>& GetContinuousSequeue(int s, vector<vector<int>>& res) { int small = 1, big = 2; if (s < 3) return res; while (small <= s / 2) { int sum = GetSum(small, big); if (sum == s) { vector<int> temp; for (int i = small; i <= big; ++i) { temp.push_back (i); } res.push_back(temp); ++small; ++big; } else if (sum < s) big++; else small++; } return res; } int main() { vector<vector<int>> re; GetContinuousSequeue(15,re); for (int i = 0; i < re.size(); ++i) { for (int j = 0; j < re[i].size(); ++j) cout << re[i][j] << " "; cout << endl; } return 0; }不能将res定义在函数内,不然返回的地址是临时变量的地址,无效的。
相关文章推荐
- 程序员如何规划好自己的职业发展方向?
- 菜鸟在线与你一起分析:程序员如何让自己变得不可替代?
- 98%的人没解出的德国面试逻辑题!?
- java 面试题
- java特种兵读书笔记(3-4)——java程序员的OS之对象内存结构
- 面试题
- 面试题
- 转载程序员「奇葩」说
- 【剑指offer】5.2时间效率——面试题32:从1到n整数中1出现的次数
- 【剑指offer】5.2时间效率——面试题31:连续子数组的最大和
- java面试一二三
- 怎么招聘程序员
- 【剑指offer】5.2时间效率——面试题29:数组中出现次数超过一半的数字
- 【剑指offer】5.2时间效率——面试题30:最小的k个数
- 黑马程序员@java核心之面向对象
- 面试经历---广东耶萨智能科技股份有限公司(2016年01月11日上午面试)
- 黑马程序员@数组及对数组的操作
- 黑马程序员@java基本语句组成
- 黑马程序员@java基础语法
- 程序员如何做到年薪超过60万?