和为S的连续正数序列

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

解法,刚开始直接用的暴力解法,解题思路是通过遍历在100/i附近对数字进行拼接,如果100%i==0,那连续正数数列肯定在100/i处附近对称,如果100%i!=0,那肯定左边或者右边会多出一个数,解法如下:

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       ArrayList<ArrayList<Integer>> resultlist = new ArrayList<ArrayList<Integer>>();
       int midnum = sum/2;
       if(sum==3){
           ArrayList<Integer> templist = new ArrayList<Integer>();
           templist.add(1);
           templist.add(2);
           resultlist.add(templist);
           return resultlist;
       }
       for(int i=2;i<midnum;i++){
           int middle = sum/i;
           if(sum%i==0){
               int temp = 0;
               for(int j=middle-i/2;j<=middle+i/2&&j>0;j++){
                   temp = temp+j;
               }
               if(temp==sum){
                   ArrayList<Integer> templist = new ArrayList<Integer>();
                   for(int j=middle-i/2;j<=middle+i/2;j++){
                    templist.add(j);
                   }
                   resultlist.add(templist);
               }
           }else{
               int modNum = sum%i;
               int max = sum - middle*(i-1);
               int temp = 0;
               if(max==modNum+middle&&middle+i/2==max){
                   ArrayList<Integer> templist = new ArrayList<Integer>();
                   for(int j=middle-i/2+1;j<=middle+i/2&&j>0;j++){
                    templist.add(j);
                    temp = temp + j;
                   }
                   if(templist!=null&&templist.size()!=0&&temp==sum){
                       resultlist.add(templist);
                   }
               }

           }
       }
       Collections.sort(resultlist,new MyComparator());
       return resultlist;
    }
    class MyComparator implements Comparator{
        public int compare(Object object1, Object object2) {// 实现接口中的方法  
            ArrayList<Integer> p1 = (ArrayList<Integer>) object1; // 强制转换  
            ArrayList<Integer> p2 = (ArrayList<Integer>) object2;  
            if(p1.get(0)>=p2.get(0)){
                return 1;
            }else{
                return -1;
            }
        }  
    }
}

后来看了一下网友的解法,觉得更加巧妙,贴上来:

思路:
    由,求和为s的的两个数得到的启发。
    由于是要求连续的。所以我们就从左开始走。
    当连续数组和小于sum时,我们肯定得再多加一点。那么就再加上后一个数字。(i++)
    当所加和大于sum时,那么我们肯定得减小一点。舍弃第一个数字。
    当所加和等于时,listAll添加一个新的list。然后list删去head,count减去head。
import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> listALL = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();

        if (sum < 1) {
            return listALL;
        }

        int count = 0;
        int head = 0;
        // 最多就到sum/2
        for (int i = 1; i <= sum;) {
            if (count < sum) {
                count += i;
                list.add(i);
                i++;
            } else if (count > sum) {
                head = list.remove(0);
                count -= head;
            } else {
                listALL.add(new ArrayList(list));
                head = list.remove(0);
                count -= head;
            }
        }
        return listALL;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指offer----和为S的连续正数序列----java实现

输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15;所以打印出三个连续序列1~5,4~6,7~8; 思路: 从递增数组...
  • snow_7
  • snow_7
  • 2016年08月15日 12:48
  • 747

剑指offer面试题之和为S的连续正数序列

1,问题: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久...
  • zzuchengming
  • zzuchengming
  • 2016年04月04日 19:18
  • 418

找出所有和为S的连续正数序列

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一...
  • u012303737
  • u012303737
  • 2016年03月09日 16:26
  • 230

《剑指offer》——和为s的连续整数序列

题目:输入一个正整数s,打印出所有和为s的连续正数序列(至少含有两个数)。可以考虑用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small...
  • zengzhen_CSDN
  • zengzhen_CSDN
  • 2016年02月24日 10:28
  • 469

网易面试题 输入一个正数n,输出所有和为n连续正数序列

输入一个正数n,输出所有和为n连续正数序列
  • susidian
  • susidian
  • 2015年08月17日 16:41
  • 559

剑指Offer面试题41:求和为s的两个数字;求和为s的连续正数序列 Java实现

题目一:输入一个递增排序的数组和一个数字s,在数组中找两个数,使得他们的和刚好是s.如果有多对数字的和等于s,则输出任意一对即可。例如,输入数组{1,2,4,7,11,15}和数字15,则输出4和11...
  • gg543012991
  • gg543012991
  • 2016年09月25日 16:40
  • 624

剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多个数字的和等于s,输出任意一对即可。 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月10日 19:47
  • 1457

剑指Offer——输入正整数S,打印出所有和为S的连续正数序列(至少含有两个正数)

主要思路: 定义两个数从1,2开始增长,求这两个数之间所有数的和,如果等于S则打印输出,如果大于则让小的数增长,否则让大的数增长,增长后重现判断和是否等于S,在循环中执行直到小的数大于等于(1+S)...
  • zhang2531
  • zhang2531
  • 2016年04月07日 14:16
  • 233

输入一个正数s,打印出所有和为s的连续正数序列(至少包含两个数)

void FindContinuousSequence(int sum) { if (sum < 3) return; int small = 1; int big = 2; int mi...
  • litoujkl
  • litoujkl
  • 2015年09月07日 16:53
  • 170

面试题40:输出和为指定值的连续正数序列

思路: 1. 用两个变量分别表示序列的最小值和最大值。首先把他们分别初始化为1和2, 2. 如果从最小值到最大值的序列之和大于给定值,则从序列中去掉最小值,也就是增大最小值; 3. 如果从最小值...
  • htyurencaotang
  • htyurencaotang
  • 2013年09月05日 11:23
  • 1353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:和为S的连续正数序列
举报原因:
原因补充:

(最多只允许输入30个字)