题目:输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
分析:这是网易的一道面试题。
这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small到big的序列的和小于n的话,我们向右移动big,相当于向序列中添加big的下一个数字。一直到small等于(1+n)/2,因为序列至少要有两个数字。
基于这个思路,我们可以写出如下代码:
public class Test_26 {
public static void main(String[] args) {
int n =15;
FindContinousSequence(n);
}
public static void FindContinousSequence(int n){
if(n<3)return;
int small = 1;
int big = 2;
int mid = (n+1)/2;
int sum = small+big;
while(small<mid){
//如果sum==n,直接打印
if(sum == n){
printContinousSequence(small,big);
}
//如果sum>n,small向右移动
while(sum>n){
sum-=small;
small++;
//如果sum == n,打印
if(sum == n){
printContinousSequence(small,big);
}
}
//将big向右移动
big++;
sum+=big;
}
}
public static void printContinousSequence(int small ,int big){
for(int i = small;i<=big;i++){
System.out.print(i+",");
}
System.out.println(" ");
}
}
输出结果:
1,2,3,4,5,
4,5,6,
7,8,