41.和位S的连续正数序列
2017-03-14 20:22
246 查看
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:首先,设置前后两个指针,刚开始的时候两个指针肯定是相邻的,然后将他们所指的元素以及之间的元素相加,如果和小于目标数,则让后边的指针往后走以继续增大加和的值,反之,如果相加的和大于目标数,则让前边的指针往后走以减小加和的值,如果加和等于目标值时,就输出前后指针之间的所有数。
代码实现如下:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:首先,设置前后两个指针,刚开始的时候两个指针肯定是相邻的,然后将他们所指的元素以及之间的元素相加,如果和小于目标数,则让后边的指针往后走以继续增大加和的值,反之,如果相加的和大于目标数,则让前边的指针往后走以减小加和的值,如果加和等于目标值时,就输出前后指针之间的所有数。
代码实现如下:
import java.util.ArrayList; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList <ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); if (sum < 3) return list;//和小于3的连续正数数组不存在 int begin = 1; int end = 2; int curSum = 3; //初始最小和为begin + end = 3 while (begin <= sum >> 1){ while (curSum < sum){ end++; curSum += end; } if (curSum == sum){ ArrayList<Integer> temp = new ArrayList<Integer>(); for (int i = begin; i <= end; i++) temp.add(i); list.add(temp); } curSum -= begin;//大于加和的时候去掉前面的小的; begin++; } return list; } }
相关文章推荐
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 41、和为S的连续正数序列
- 面试题41-题目2:和为S的连续正数序列
- 面试题41-2:和为s的连续正数序列
- 剑指offer面试题[41]-和为s的两个数VS和为s的连续正数序列
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 41 和为 s 的连续正数序列
- 【剑指offer】面试题41-和为S的两个数VS和为S的连续正数序列
- 面试题41(2) 和为s的连续正数序列
- 《剑指Offer》学习笔记--面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指offer面试题41_2 和为s的连续正数序列(java实现)
- 【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
- (C++)剑指offer-41:和为S的连续正数序列(知识迁移能力)
- 剑指offer-面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 【剑指Offer】面试题41:和为s的连续正数序列
- 剑指offer 41 - 和为s的两个数字VS为s的连续正数序列
- 面试题41:和为s的两个数字 VS 和为s的连续正数序列
- 剑指offer-面试题41-和为s的两个数字VS和为s的连续正数序列
- 剑指offer 面试题41 和为 s 的两个数字 VS 和为 s 的连续正数序列