[オファー] [57-2]及び[連続正シーケンスSの数]

タイトル説明

  正の数Sを入力し、(少なくとも2つの数値を含む)全ての連続する正のシーケンスSをプリントアウト。1 + 2 + 3 + 4 + 4 + 5 + 5 = 6 = 7 + 8 = 15に起因例えば、入力15、のために、8 5,4〜6および7には3つの連続した配列1のうち印刷。

牛が質問がネットワークに対処はねのけます

アイデア解析

  我々はまた、それぞれ、最大値と最小値の二つの数大小のシーケンスを考えます。まず、小さなが1に初期化し、大きなは2に初期化。sが小さいから大に配列より大きく、そして場合、値が小さいほど、すなわち小の値を増加させるために、シーケンスから除去することができます。小規模から大規模までのシーケンスならば、そしてs未満であるシーケンスは複数の数字が含まれているように、大きなは、増加させることができます。これは、少なくとも2つのシーケンス番号でなければならないため、我々は/ 2まで小さな(1 + S)を大きくする必要があります。
  

テストケース

  1. 機能テスト:9,100等の連続したシーケンスSの存在と、;及び連続シーケンスsの不在、及び4,0など、が挙げられます。
  2. 境界値テスト:3、及び最小の連続配列。

Javaコード

public class Offer057_02 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();

    }

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

        return Solution1(sum);
    }

    private static ArrayList<ArrayList<Integer>> Solution1(int sum) {

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

        if (sum < 3) {
            return list;
        }
        int small = 1;
        int big = 2;
        int middle = (sum + 1) >> 1;
        int curSum = small + big;

        while (small < middle) {
            if (curSum == sum) {
                subList = add(small, big);
                list.add(subList);
            }
            while (curSum > sum && small < middle) {
                curSum -= sum;
                small++;
                if (curSum == sum) {
                    subList = add(small, big);
                    list.add(subList);
                }

            }
            big++;
            curSum += big;
        }

        return list;
    }

    private static ArrayList<Integer> add(int start, int end) {
        ArrayList<Integer> subList = new ArrayList<Integer>();
        for (int i = start; i <= end; i++) {
            subList.add(i);
        }
        return subList;
    }

    private static void test1() {

    }

    private static void test2() {

    }

    private static void test3() {

    }
}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer572-he-weis-de-lian-xu-zheng-shu-xu-lie.html
おすすめ