博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(44):和为s的连续正数序列
阅读量:4287 次
发布时间:2019-05-27

本文共 2208 字,大约阅读时间需要 7 分钟。

题目描述

输入一个整数s,打印出所有何为s的连续整数序列(至少含有两个数字)。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。例如输入15,则有3个序列:1,2,3,4,5;4,5,6;7,8。

分析

参考之前的问题:,使用了前后索引。类似的,在本题中使用序列的前后数字(第一个firstNum和最后一个lastNum)。由前后数字可以确定整个连续整数序列及其和tmpSum。如果tmpSum大于s,则从序列中去掉较小值,即增大firstNum的值;如果tmpSum小于s,则从序列中增加最后一个值lastNum,让序列包含更多的数字。由于序列最好都要包含两个数字,一直增加大firstNum到(1+s)/2为止。

牛客AC:

package com.problem;import java.util.ArrayList;import java.util.Iterator;public class ContinuousSeqOfSum {
/** * 输入15,输出3个序列: * 1,2,3,4,5 * 4,5,6, * 7,8 */ public static void main(String[] args) { ContinuousSeqOfSum continuousSeqOfSum = new ContinuousSeqOfSum(); int sum = 15; ArrayList
> listAll = continuousSeqOfSum.FindContinuousSequence(sum); // 遍历打印输出 Iterator
> iteratorOuter = listAll.iterator(); while(iteratorOuter.hasNext()) { Iterator
iteratorInner = iteratorOuter.next().iterator(); while(iteratorInner.hasNext()) System.out.printf("%4d", iteratorInner.next()); System.out.println(); } } public ArrayList
> FindContinuousSequence(int sum) { ArrayList
> listAll = new ArrayList
>(); int firstNum = 1; // 第一个数 int lastNum = 2; // 最后一个数 int midNum = (1 + sum) / 2; // 中间的数 int tmpSum = firstNum + lastNum; // 初始和 // 序列至少有两个数,循环条件为第一个数一直增加到midNum,即(1+sum)/2为止 while(firstNum < midNum) { // 和相等,则找到序列的起始值和终止值,加入到序列 if(tmpSum == sum) { ArrayList
list = addSeqToList(firstNum, lastNum); listAll.add(list); } // 和大于sum,并且第一个数尚未增加到midNum // 将第一个数(序列中最小的数去除,则最小的数更新的下一个数),在进行判断 // 直到和小于sum或者第一个数增加到midNum,退出循环 while(tmpSum > sum && firstNum < midNum) { tmpSum -= firstNum; firstNum++; if(tmpSum == sum) { ArrayList
list = addSeqToList(firstNum, lastNum); listAll.add(list); } } // 和小于sum,将最后一个数增加1,计算新的和 lastNum++; tmpSum += lastNum; } return listAll; } /** * 将起始值和结束值及其之间的连续序列加入list * @param firstNum * @param lastNum * @return */ public ArrayList
addSeqToList(int firstNum, int lastNum) { ArrayList
list = new ArrayList
(); if(firstNum > lastNum) return list; for(int i = firstNum; i <= lastNum; i++) list.add(i); return list; }}

参考

1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

转载地址:http://qzxgi.baihongyu.com/

你可能感兴趣的文章
iOS之tableView(三)cell复制粘贴操作
查看>>
iOS collectionView实现瀑布流
查看>>
iOS 控制器创建的三种方式
查看>>
iOS UIAlertView和UIAlertController的使用
查看>>
iOS之常用的格式控制符
查看>>
iOS 之scrollView 实现图片轮播/collectionview实现轮播/当前页面切换collectionviewcell显示个数
查看>>
iOS 内存分区和关于static的使用
查看>>
iOS中代码性能测试的方法
查看>>
iOS 之系统的autoLayou自动t布局
查看>>
iOS UIDatePicker的使用(一)
查看>>
iOS corefoundation与foundation的桥接问题
查看>>
iOS 修改状态栏样式
查看>>
iOS 中关于绘图的框架介绍、手势解锁
查看>>
iOS 手势绘图/小画板的实现
查看>>
iOS 绘图Quartz2D的内存管理
查看>>
iOS 绘图Quartz2DQ绘制图片和文字
查看>>
iOS 绘图Quartz2d图片裁剪/加水印/截屏
查看>>
iOS touch事件的多点触控案例和获取touch的属性
查看>>
iOS ARC内存管理/strong weak copy assign 的用法与区别(一)
查看>>
iOS NSthread多线程的应用原理与总结
查看>>