剑指offer-和为s的连续正数序列

Posted 浮生缘,半生梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-和为s的连续正数序列相关的知识,希望对你有一定的参考价值。

题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路:首先找出这个数字的因数,然后判断是否能找到以这个因子包含在内的那串连续正数序列,若因子为偶数,则可能出现以此因子为中心的连续正数序列,若因子为奇数,则可能出现一串连续正数序列首尾相加都等于此因子,例如9、10、11、12、13、14、15、16首尾相加都为25,共有100/25=4组

ac代码:

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
 4        
 5            
 6         ArrayList<Integer> list=new ArrayList<Integer>();
 7         for(int i=2;i<=sum;i++){
 8             if(sum%i==0)
 9                 list.add(i);
10         }
11         System.out.println(list.toString());
12         ArrayList<Integer> ss;
13         ArrayList<ArrayList<Integer>>list2=new ArrayList<ArrayList<Integer>>();
14         for(int i=list.size()-1;i>=0;i--){
15             ss=isRight(sum,list.get(i));
16             if(ss!=null){
17                 list2.add(ss);
18             }
19         }
20         if(sum==3){
21             ArrayList<Integer>t=new ArrayList<Integer>();
22             t.add(1);
23             t.add(2);
24             list2.add(t);
25         }
26         return list2;
27     }
28     ArrayList<Integer> isRight(int sum,int n){
29         if(n%2==0){
30             int x=sum/n;
31             if(n-x<0)
32                 return null;
33             ArrayList<Integer>list=new ArrayList<Integer>();
34             int s=0;
35             for(int i=n-x/2;i<=x/2+n;i++){
36                 list.add(i);
37                 s+=i;
38             }
39             if(s==sum)
40             return list;
41             return null;
42         }else{
43             int x=sum/n;
44             int y=n/2;
45             if(y-x<0)
46                 return null;
47             ArrayList<Integer>list=new ArrayList<Integer>();
48             for(int i=y-x+1;i<=y+x;i++){
49                 list.add(i);
50             }
51             return list;
52         }
53     }
54 }

 

以上是关于剑指offer-和为s的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-和为s的连续正数序列

剑指offer 和为S的连续正数序列

剑指offer57 和为s的连续正数序列

和为S的连续正数序列——牛客网(剑指offer)

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

剑指Offer-和为S的连续正数序列