1. 程式人生 > >劍指offer-和為s的連續正數序列

劍指offer-和為s的連續正數序列

solution string arr OS 包含 i++ import ray spa

題目描述:小明很喜歡數學,有一天他在做數學作業時,要求計算出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的連續正數序列