当前位置: 首页 > news >正文

(剑指Offer)面试题41:和为s的连续正数序列

题目:

输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,,4-6和7-8.

思路:

题目求的是连续正数序列,而且至少含有两个数,那么我们可以从1,2这两个数开始,

以求和为9的所有连续序列为例,假设两个指针pSmall和pBig,分别指向正数序列的首尾,pSum表示序列之和,一开始pSmall=1,pBig=2,,pSum=3<9,序列需要包含更多的数,于是pBig+1,此时pSum=6,依旧小于9,于是pBig+1,此时pSum=10,大于9,序列需要删除一些数,于是pSmall-1,pSum=9,找到第一个满足条件的序列;接着pBig+1,按照前面的方法继续查找满足条件的序列,直到pSmall等于(s+1)/2.

代码:

#include <iostream>
#include <vector>
using namespace std;

void PrintContinuousSequence(int pSmall,int pBig){
    for(int i=pSmall;i<=pBig;i++)
        cout<<i<<" ";
    cout<<endl;
}

void FindContinuousSequence(int sum){
    if(sum<3)
        return;

    int pSmall=1;
    int pBig=2;
    int halfSum=((sum+1)>>1);
    int curSum=pSmall+pBig;

    while(pSmall<halfSum){
        if(curSum==sum)
            PrintContinuousSequence(pSmall,pBig);

        while(curSum>sum && pSmall<pBig-1){
            curSum-=pSmall;
            pSmall++;
            if(curSum==sum)
                PrintContinuousSequence(pSmall,pBig);
        }

        pBig++;
        curSum+=pBig;
    }
}

int main()
{
    FindContinuousSequence(3);

    return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/c451a3fd84b64cb19485dad758a55ebe?rp=2

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

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

AC代码:

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > result;
        if(sum<3)
            return result;

        int pSmall=1;
        int pBig=2;
        int curSum=pSmall+pBig;
        int halfSum=((sum+1)>>1);
        vector<int> sequence;

        while(pSmall<halfSum){
            if(curSum==sum){
                GetSequence(pSmall,pBig,sequence);
                result.push_back(sequence);
            }
            
			// at least two numbers
            while(curSum>sum && pSmall<pBig-1){
                curSum-=pSmall;
                pSmall++;

                if(curSum==sum){
                    GetSequence(pSmall,pBig,sequence);
                    result.push_back(sequence);
                    break;
                }
            }

            pBig++;
            curSum+=pBig;
        }

        return result;
    }

    void GetSequence(int pSmall,int pBig,vector<int> &sequence){
        sequence.clear();
        for(int i=pSmall;i<=pBig;i++)
  			sequence.push_back(i);
    }
};

 

转载于:https://www.cnblogs.com/AndyJee/p/4682465.html

相关文章:

  • html 7.28
  • 每天一个Linux命令—— WC
  • const的作用
  • 重置 Launchpad 和更新APP图标缓存
  • (算法)求1到1亿间的质数或素数
  • java程序设计之完数
  • css 多行显示省略号....
  • python--参数列表的分拆
  • EL表达式从request和session中取值
  • 经典图论500题
  • 下拉列表框实现二级联动
  • 修改乱码的方法
  • 微信网站注意事项
  • iOS 9应用开发教程之显示编辑文本标签文本框
  • pip常用命令
  • Cookie 在前端中的实践
  • css系列之关于字体的事
  • Fastjson的基本使用方法大全
  • httpie使用详解
  • Java程序员幽默爆笑锦集
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 跨域
  • 目录与文件属性:编写ls
  • 使用common-codec进行md5加密
  • 突破自己的技术思维
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 我的zsh配置, 2019最新方案
  • 应用生命周期终极 DevOps 工具包
  • 怎么将电脑中的声音录制成WAV格式
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​2020 年大前端技术趋势解读
  • !!Dom4j 学习笔记
  • #define,static,const,三种常量的区别
  • #HarmonyOS:Web组件的使用
  • #include到底该写在哪
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (ibm)Java 语言的 XPath API
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (八)Spring源码解析:Spring MVC
  • (分布式缓存)Redis持久化
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (全注解开发)学习Spring-MVC的第三天
  • (十一)手动添加用户和文件的特殊权限
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)Linq学习笔记
  • .Net Core和.Net Standard直观理解
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net Redis的秒杀Dome和异步执行
  • .NET程序员迈向卓越的必由之路