本题跟蘑菇街面试出的输入指定和为K的任意两个数字在递增数字中:
参考一下链接:
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出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>> result=new ArrayList<>(); //边界处理 if(sum<3){ return result; } //初始化变量 int small=1; int big=2; int mid=(1+sum)/2; int cursum=small+big; //small序列增加在mid的时候就停止 while(small<mid){ //如果当前和等于sum,则打印small到big之间的连续序列 if(cursum==sum){ ArrayList<Integer> list=new ArrayList<>(); for(int i=small;i<=big;i++){ list.add(i); } result.add(list); } //如果当前和大于sum while(cursum>sum&&small<mid){ //当前和去掉最小的small序列 cursum-=small; //small序列向前移动 small++; //然后遇到相等则打印small到big之间的连续序列 if(cursum==sum){ ArrayList<Integer> list=new ArrayList<>(); for(int i=small;i<=big;i++){ list.add(i); } //将list2添加进去result中 result.add(list); } } //否则big一直加 big++; //当前和一直累加 cursum+=big; } return result; } }