剑指offer第二版-57.2.和为s的连续正数序列

本系列导航:剑指offer(第二版)java实现导航帖

面试题57.2:和为s的连续正数序列

题目要求:
输入一个整数s,打印所有和为s的连续正数序列(至少两个)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出三个连续序列15,46,7~8。

解题思路:
上一题类似,依旧使用两个指针small,big,值分别为1,2。如果从small加到big的和等于s,即找到了一组解,然后让big后移,继续求解。如果和小于s,big后移,如果和大于s,small前移。直到small大于s/2停止。

package chapter6;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/17
 * Time  : 15:47
 * Description:和为s的连续正数序列
 **/
public class P282_ContinuousSequenceWithSum {
    public static void findContinuousSequence(int sum){
        if(sum<3)
            return;
        int small = 1,big = 2,middle = sum>>1;
        int curSum = small+big;
        while (small<=middle){
            if(curSum==sum){
                printContinousSequence(small,big);
                big++;
                curSum+=big;
            }
            else if(curSum<sum){
                big++;
                curSum+=big;
            }
            else{
                curSum-=small;
                small++;
            }
        }
    }
    public static void printContinousSequence(int small,int big){
        for(int i=small;i<=big;i++){
            System.out.print(i);
            System.out.print(" ");
        }
        System.out.println();
    }
    public static void main(String[] args){
        findContinuousSequence(15);
    }
}

运行结果

1 2 3 4 5 
4 5 6 
7 8 
    原文作者:ryderchan
    原文地址: https://www.jianshu.com/p/272a81c77bfa#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞