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

面试题57-题目二:和为S的连续正数序列

2018-09-19 18:43 405 查看

/*

 * 面试题57-题目二:和为S的连续正数序列

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

 * 思路:定义两个指针,分别递增,寻找和为s的序列

 * 用两个数字small和big分别表示序列的最大值和最小值,首先将small初始化为1,big初始化为2.

 * 如果从samll到big的和大于s,我们就从序列中去掉较小的值(即增大small),

 * 相反,只需要增大big。

 * 终止条件为:一直增加small到(1+sum)/2

 */

 

import java.util.ArrayList;

 

public class No57FindContinuousSequence {

 

    public static void main(String[] args) {

       No57FindContinuousSequence n = new No57FindContinuousSequence();

       ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();

       lists = n.FindContinuousSequence(15);

       for (int i = 0; i < lists.size(); i++) {

           System.out.println(lists.get(i));

       }

    }

 

    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {

       ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();

       if (sum < 3) {

           return lists;

       }

      

       int small = 1;

       int big = 2;

      

       while (small < (sum + 1) / 2) {

           int curSum = getSum(small, big);

          

           if (curSum < sum) {

              big++;

           } else if (curSum == sum) {

              ArrayList<Integer> list = new ArrayList<Integer>();

              for (int i = small; i <= big; i++) {

                  list.add(i);

              }

              lists.add(list);

              big++;

           }else {

              small++;

           }

                 

       }

      

       return lists;

    }

 

    private int getSum(int small, int big) {

       int sum = 0;

       for(int i = small; i <= big; i++) {

           sum += i;

       }

       return sum;

    }

 

}

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