zoukankan      html  css  js  c++  java
  • 剑指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 }
  • 相关阅读:
    45.如何优雅的删除一张大表?
    13.安装上传和下载文件
    12.yum install 和yum localinstall区别
    7.Mysql之MGR环境搭建
    mod运算
    取整
    同余式
    Windows下的重定向
    C语言求正负余数
    复利计算公式
  • 原文地址:https://www.cnblogs.com/llsq/p/8809759.html
Copyright © 2011-2022 走看看