[劍指Offer]-和爲S的連續正數序列

題目描述

輸入一個正數s,打印出所有和爲s的連續正數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列1-5,,4-6和7-8.

解題思路

  • 以求和爲9的所有連續序列爲例,假設兩個指針pSmall和pBig
  • 一開始pSmall=1,pBig=2,,pSum=3<9,序列需要包含更多的數,於是pBig+1,
  • 此時pSum=6,依舊小於9,於是pBig+1,此時pSum=10,大於9,序列需要刪除一些數,
  • 於是pSmall-1,pSum=9,找到第一個滿足條件的序列;接着pBig+1,
  • 按照前面的方法繼續查找滿足條件的序列,直到pSmall等於(s+1)/2.
算法圖解

在這裏插入圖片描述

參考代碼:
package offer;

/**
 * 和爲s的連續正數序列
 * 輸入一個正數s,打印出所有和爲s的連續正數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列1-5,,4-6和7-8.
 */
public class Offer57_2 {
    public static void main(String[] args) {
        int nums[] = {1, 2, 3, 4, 5, 6, 7, 8};
        findContinuous(nums, 15);
    }

    static void findContinuous(int nums[], int s) {
        if (nums == null || s <= 0 || nums.length < 1) {
            return;
        }
        int small = 1;
        int big = 2;
        int currsum = 3;
        int mid = (1 + s) / 2;
        while (small < mid) {
            if (currsum == s) {
                for (int i = small; i <= big; i++) {
                    System.out.print(i);
                }
                System.out.println();
            }
            while (currsum > s && small < mid) {
                currsum -= small;
                small++;
                if (currsum == s) {
                    for (int i = small; i <= big; i++) {
                        System.out.print(i);
                    }
                    System.out.println();
                }
            }
            big++;
            currsum += big;
        }
    }
}


附錄

該題源碼在我的 ?Github 上面!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章