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

面试题41(2). 和为S的连续正数序列

2017-09-15 21:34 447 查看

面试题41(2). 和为S的连续正数序列

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路1:暴力

时间复杂度O(n^2)

import java.util.ArrayList;

public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
int p = (sum + 1) >> 1; // sum的一半
ArrayList<Integer> arr;
for(int i = 1; i < p; i++) {
arr = new ArrayList<Integer>();
int count = i;
arr.add(i);
for(int j = i + 1; j <= p; j++) {
count += j;
arr.add(j);
if(count > sum) {
break;
arr = null;
}
if(count == sum) {
list.add(arr);
break;
}
}
}

return list;
}
}


思路2:

用两个数small,big分别表示序列的最小值和最大值。small到big是一段连续的序列。

如果small与big的和小于s,说明序列的和太小了,需要增大序列的范围,因此small不动,big++

如果small与big的和大于s,说明序列的和太大了,需要减小序列的范围,因此small++,big不动

如果small与big的和等于s,则返回small到big之间的值

import java.util.ArrayList;

public class Solution {
public static ArrayList<Integer> createList(int small, int big) {
ArrayList<Integer> arr = new ArrayList();
for(int i = small; i <= big; i++) {
arr.add(i);
}
return arr;
}

public static ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
int small = 1;
int big = 2;
int mid = (sum + 1) >> 1;
int curSum = small + big;

while(small < mid) {
if(curSum == sum) {
list.add(createList(small, big));
}
while(curSum > sum && small < mid) {
curSum -= small;
small++;

if(curSum == sum) {
list.add(createList(small, big));
}
}
big++;
curSum += big;
}
return list;
}
}


ps:小明又出现了 ~

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