剑指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,那么他就是一颗平衡二叉树.如下图: 所以 ...
随机推荐
- HQuorumPeer和QuorumPeerMain进程的区别
HBase是列式数据库,既可以单机也可以集群的方式搭建,以集群的方式搭建一般建立在HDFS之上. 分布式HBase启动说明:首先启动hadoop,然后问题就来了:zookeeper和hbase的启动顺 ...
- 1、gitlab的理论知识
2.1 svn与git对比 . svn git 分布式 不是 是 在线阅读 不支持 不仅支持,而且可以在线编辑 存储方式 按文件 按元数据 完整性 一般 优 离线工作 日志都没法看 完全没问题 分支 ...
- Github网站css加载不出来的处理方法(转,亲测有效)
转载链接:https://blog.csdn.net/qq_36589706/article/details/80573008因为工作需求,自己会经常使用到github,但是突然有一天打开github ...
- Polycarp's Pockets(思维)
Polycarp has nn coins, the value of the ii-th coin is aiai. Polycarp wants to distribute all the coi ...
- aspnetcore的中间件
Run会终止中间件继续传递 app.Run(new RequestDelegate(async context => { await Task.Run(() => { context.Re ...
- excel单元格内容合并
这几天在整理数据,有时候数据都在表格的不同单元格中,想把两格内容合并为一格,于是验证了两种方法 方法一: (1)在B1输入公式=A1&B1 (2)做完第一步后,选中B1后,鼠标移到单元格右下出 ...
- Windows开机自动登录及取消自动登录的设置
开机自动登录 1.开始菜单搜索框输入 “netplwiz” 按回车 或“Win+R”组合键打开“运行”框内输入“netplwiz” 或“运行”框内输入“control userpasswords2”( ...
- Unity MonoBehaviour.Invoke 调用
使用 Invoke() 方法需要注意 3点: 1 :它应该在 脚本的生命周期里的(Start.Update.OnGUI.FixedUpdate.LateUpdate)中被调用: 2:Invoke(); ...
- Linux Shell命令系列(1)
1. ls命令ls命令是列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里的内容,可能是文件也可能是文件夹.“ls -l”命令以详情模式(long listi ...
- jdbc 开启事务
package com.itheima.tx; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...