和为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;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

和为s的连续正数序列(Java实现)

本题为剑指offer面试题41 题目2 牛客网测试地址:https://www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55...

剑指offer(21)-和为S的连续正数序列

题目:链接:https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&rp=2&ru=...

【41】和为S的连续正数序列

【41】和为S的连续正数序列 时间限制:1秒 空间限制:32768K 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,...

【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ

本题当然不能用遍历的思想来解答,因为这样分类过多。根据题目的求和特点,我们应该想到公差为1的等差数列的求和,现在情况是和与公差已知,所以给定初始值和元素的个数两个变量中间的任意一个就可以求另外一个,这...

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

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

【追求进步】和为S的连续正数序列

本题跟蘑菇街面试出的输入指定和为K的任意两个数字在递增数字中: 参考一下链接: 点击打开链接 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出...

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

链接 牛客OJ:和为S的连续正数序列 九度OJ:http://ac.jobdu.com/problem.php?pid=1354 GitHub代码: 041-和为S的连续正数序...
  • gatieme
  • gatieme
  • 2016年05月09日 23:28
  • 3195

剑指Offer——(42)和为S的连续正数序列

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

九度OJ-题目1354:和为S的连续正数序列

题目链接地址: 九度OJ-题目1354:和为S的连续正数序列 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并...

剑指offer面试题41_2 和为s的连续正数序列(java实现)

主要思想:用small和big分别表示序列的最小值和最大值,首先将small初始化为1,big初始化为2,如果从small到big的序列的和大于s,从序列中去掉较小的值,也就是增大small的值,序列...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:和为S的连续正数序列
举报原因:
原因补充:

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