美文网首页
《剑指offer第二版》面试题57 题目二:和为s的连续正数序列

《剑指offer第二版》面试题57 题目二:和为s的连续正数序列

作者: castlet | 来源:发表于2020-02-28 20:26 被阅读0次

题目描述

  • 输入一个正整数s,打印出所有和为s的连续正整数序列(至少包含两个数字)。例如输入15,所以打印出3个连续序列(1,2,3,4,5)(4,5,6)(7,8)

解题思路

  1. 用连个数small和end表示序列的最小值和最大值。small到big序列的连续和用sum表示。
  2. 如果sum大于s,则small增加。
  3. 如果sum小于s,则增加big。
  4. 如果sum等于s,则保存这个序列。此时再增大end。
  5. 因为序列里至少有连个数字,则small能增加到的最大值是(1+s)/2。

代码

ArrayList<ArrayList<Integer>> findContinuousSequences(int sum){
    if (sum <= 2) {
        return null;
    }
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    int begin = 1;
    int end = 2;

    int curSum = begin + end;
    while (begin <= (sum + 1) / 2 && begin < end) {
        if (curSum > sum) {
            curSum = curSum - begin;
            begin ++;
        } else if (curSum < sum) {
            end ++;
            curSum = curSum + end;
        } else {
            result.add(createList(begin, end));
            end ++;
            curSum = curSum + end;
        }
    }
    return result;
}
ArrayList<Integer> createList(int start , int end) {
    ArrayList<Integer> list = new ArrayList<>();
    while (start <= end) {
        list.add(start);
        start ++;
    }
    return list;
}

相关文章

网友评论

      本文标题:《剑指offer第二版》面试题57 题目二:和为s的连续正数序列

      本文链接:https://www.haomeiwen.com/subject/hmprhhtx.html