タイトル説明
正の数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)を大きくする必要があります。
テストケース
- 機能テスト:9,100等の連続したシーケンスSの存在と、;及び連続シーケンスsの不在、及び4,0など、が挙げられます。
- 境界値テスト: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() {
}
}