剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
一 . 分析题目
该题目有几个点需要注意一下:
1 . 这个链表是连续的正数序列,且最少为两个数。
2 . 由于1中的特性,所以数组的和可以用公式计算。(1加到100的那种方法求和,即为:(1+100)*100 / 2)。
貌似题目也只有这两个点需要注意,接下来就是核心算法了,三个概念:1.数组内的数。2.数组实际和。3. 数组目标和。
当数组实际和=目标和时,为了继续寻找可以实现目标和的数组,需要把小数和大数都前移1位;
当数组实际和>目标和时,把小数往前移一位,这样数组内的数就少了最小的一个数,在做比较。
当数组实际和<目标和时,把大数往前移一位,这样数组内的数就增加了一个大数,再比比啊。
二 . 代码实现
using System.Collections.Generic;
class Solution
{
public List<List<int>> FindContinuousSequence(int sum)
{
// write code here
// 定义最终输出数组
List<List<int>> ret = new List<List<int>>();
// 定义i=1,j=2,原因:
int i = , j = ;
// 方法停止条件:1.因为最终输出数组最少为2个数,所以小的那个数不能超过sum的一半,超过了相加就大于sum了,而且小数必须小于大数
while(i < (sum + ) / && i < j)
{
// 因为是连续的数,所以求和公式可以为(小数+大数)*长度/2;(举例:1加到100怎么算)
int tmpSum = (i + j) * (j - i + ) / ;
// 要是数组和小于目标数,需要让大数增加以下
if(tmpSum < sum)
{
j++;
}
// 相等就输出咯
else if(tmpSum == sum)
{
// 定义一个数组,数组长度就是i-j之间的长度
int[] ary = new int[j - i + ];
// 执行循环,得出数组从i-j
for(int k = i, l = ; k <= j; k++, l++)
{
ary[l] = k;
}
// 这个数组添加到定义的那个链表
ret.Add(new List<int>(ary));
// 如果还存在其他的怎么办呢,所以要执行i++h和j++
i++;
j++;
}
// 要是数组和大于目标数,把小数加1,这样数组里的数就变少了对吧
else
{
i++;
}
}
// 返回那个链表
return ret;
}
}
剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列的更多相关文章
- 《剑指offer》第五十七题(为s的连续正数序列)
		
// 面试题57(二):为s的连续正数序列 // 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数). // 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结 ...
 - (剑指Offer)面试题41:和为s的连续正数序列
		
题目: 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数).例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,,4-6和7-8. 思路: ...
 - 《剑指offer》面试题57 - II. 和为s的连续正数序列
		
问题描述 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target ...
 - 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
		
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
 - 剑指Offer的学习笔记(C#篇)-- 反转链表
		
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
 - 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
		
题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...
 - 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
		
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
 - 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字
		
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将 num1[0], num2[0 ...
 - 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
		
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
 
随机推荐
- SLF4J、Log4J使用记录
			
程序中一直在用log4j,之前都没了解过,只知道是打印日志信息的.最近独立新建了几个开发工程,发现slf4j老有冲突,开始关注起来,我用log4j打印日志,与slf4j有毛关系,怎么老冲突呢.网上找了 ...
 - Angular输入框内按下回车会触发其它button的点击事件的解决方法
			
方法:给button按钮添加type=“botton”属性
 - docker compose容器互联
			
使用docker-compose编排容器时,如容器之间需要互相通信,使用本地连接,需要使用容器名来代替localhost "connection": "postgresq ...
 - STP-18-Port-Channl上的负载均衡
			
Ether Channel通过在多条链路上传输多个数据帧,增加了可用带宽.一个以太网帧总是通过一个Ether Channel中的一条链路传输.针对数据帧地址字段执行散列计算能够产生一个编号,标识这个数 ...
 - 原生JS实现雪花特效
			
今天在校园招聘上被问到的问题,用JS写出雪花的效果.我打算使用多种方法来试试如何实现雪花. 这是目前按照网上某种思路模仿的第一种雪花,不太好看,但是大致意思清楚. 思路1:该思路直接由JS实现. 雪花 ...
 - 同域内的两台电脑,一台访问另一台上搭建的IIS站点无法访问解决方法
			
需要在搭建IIS站点的机器上,打开[高级安全Windows防火墙],新建[入站规则],添加外部允许访问的端口号即可.
 - BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)
			
先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串. 然后二分子串(答案)的长度,每次把长度为$md ...
 - Docker从入门到实战(三)
			
Docker从入门到实战(三) 一:安装Docker 1. linux系统脚本安装 Docker基于linux容器技术,面向服务器端,Docker只能安装运行在64位计算机上(社区有对32位的支持), ...
 - Spring RestTemplate GET 请求参数
			
@Test public void testUpdateProfitJson_GET_Params() throws BusinessException { String apiURL="U ...
 - Storm概念学习系列之Blot消息处理者
			
不多说,直接上干货! Bolt消息处理者 认识了消息源Spout和消息的数据存储元组Tuple,接下来了解消息的处理者Bolt.Bolt是接收Spout发出元组Tuple后处理数据的组件,所有的消息处 ...