题目描述
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印3个连续序列1-5、4-6、7-8.
练习地址
实现
方法:
- small-最小值,big-最大值
- 初始化small=1,big=2
- small-big的和>sum,small增大
- small-big的和<sum,big增大
- 序列数量>2,设置small≤(1+sum)/2
public class C57_array_Continous {
public static ArrayList<ArrayList<Integer>> findSequence(int sum) {
ArrayList<ArrayList<Integer>> resLists = new ArrayList<>();
if (sum < 3) {
return resLists;
}
int p1 = 1;
int p2 = 2;
int mid = (1 + sum) / 2;
int curSum = p1 + p2;
while (p1 < mid) {
ArrayList<Integer> list = new ArrayList<>();
if (curSum == sum) {
list = addNum(p1, p2);
}
while (curSum > sum && p1 < mid) {
curSum -= p1;
p1++;
if (curSum == sum) {
list = addNum(p1, p2);
}
}
resLists.add(list);
p2++;
curSum += p2;
}
return resLists;
}
static ArrayList<Integer> addNum(int p1, int p2) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = p1; i <= p2; i++) {
list.add(i);
}
return list;
}
}
Test
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> list = findSequence(15);
for (ArrayList<Integer> l : list) {
for (Integer i : l) {
System.out.print(i + " ");
}
System.out.println();
}
}