sum

剑指Offer对答如流系列 - 和为s的数字

只谈情不闲聊 提交于 2020-01-31 23:04:27
文章目录 面试题57:和为s的数字 一、题目描述 二、问题分析 三、问题解答 面试题57:和为s的数字 一、题目描述 问题(1)和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 问题(2)为s的连续正数序列 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。 二、问题分析 问题(1) 考虑到数列递增,我们设置两个头尾两个索引i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 由于是从两边往中间移动,所以不会有跳过的情况,时间复杂度为O(n)。 问题(2) 顺着问题(1)的思路来就是 当从i到j的序列的和小于sum时,增加j,使序列包含更多数字;(记得更新序列之和) 当从i到j的序列的和大于sum时,减少i,使序列去掉较小的数字;(记得更新序列之和) 当从i到j的序列的和等于sum时,此时得到一个满足题目要求的序列,输出,然后继续将i增大

剑指Offer对答如流系列 - 和为s的数字

情到浓时终转凉″ 提交于 2020-01-31 22:30:29
面试题57:和为s的数字 题目描述 问题(1)和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 问题(2)为s的连续正数序列 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。 问题分析 问题(1) 考虑到数列递增,我们设置两个头尾两个索引i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 由于是从两边往中间移动,所以不会有跳过的情况,时间复杂度为O(n)。 问题(2) 顺着问题(1)的思路来就是 当从i到j的序列的和小于sum时,增加j,使序列包含更多数字;(记得更新序列之和) 当从i到j的序列的和大于sum时,减少i,使序列去掉较小的数字;(记得更新序列之和) 当从i到j的序列的和等于sum时,此时得到一个满足题目要求的序列,输出,然后继续将i增大,往后面找新的序列。 序列要求最少两个数字,因此,当i到了sum/2时,就可以结束了。

线段树

陌路散爱 提交于 2020-01-31 13:49:02
线段树 线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息统计,区间修改. 线段树有如下几种性质 1·每个节点代表一个区间 2·唯一的根节点,代表全部区间 3·每个叶子节点代表一个长度为1的区间 对于每个内部节点 非叶节点,左子节点[l,mid] 右子节点[mid + 1,r] 存储方式 使用数组,仿照二叉堆存储,父的左孩子是 x * 2,右孩子是 x * 2 + 1 使用struct结构存储最后一层会产生空余, 所以数组长度必须为 4N,才不会越界 建树 struct SegmentTree{ int sum,mul,add,maxm; }tree[MAX_N << 2]; void build(int root, int l, int r){ tree[root].mul = 1; tree[root].add = 0; if(l == r)tree[root].sum = a[l]; else{ int mid = (l + r) >> 1; build(root * 2, l, mid + 1); build(root << 1 | 1, mid + 1,r); //求区间最大 tree[root].sum = max(tree[root << 1].sum ,tree[root * 2 + 1].sum); //求区间和值 tree[root].sum =

PAT甲题题解-1103. Integer Factorization (30)-(dfs)

眉间皱痕 提交于 2020-01-31 13:03:45
  该题还不错~。   题意:给定N、K、P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个。否则输出Impossible。   dfs枚举,为了防止超时,这里要预先将从1开始的i^p的值存储在factor数组中,直到i^p>n。然后dfs深度优先搜索,相当于把问题一步步分解,即若第一个因子是n1,则接下来我们要判断N-n1^p、k-1是否可行。同时存储当前因子的总和sum,要取sum最大的;还有上一次相加的因子的索引last,因为因子要从大到小输出,所以后一个不能大于前一个因子。 #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> using namespace std; /* 其实可以预先把i^p<n的i都存储起来 */ const int maxn=405; int res[maxn]; int ans[maxn]; int factor[maxn]; int fidx=0; int maxsum=0; bool flag=false; int n,k,p; /* num为当前的总和 cnt为还剩几个i^p项,即当前的k sum为各因子的总和

26.方法

安稳与你 提交于 2020-01-31 08:27:37
方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。 方法用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。 public class Test20 { /** main方法:程序的入口 */ public static void main ( String [ ] args ) { int num1 = 10 ; int num2 = 20 ; //调用求和的方法:将num1与num2的值传给add方法中的n1与n2 // 求完和后将结果返回,用sum接收结果 int sum = add ( num1 , num2 ) ; System . out . println ( "sum = " + sum ) ; //输出:sum = 30 //调用打印的方法:该方法没有返回值 print ( ) ; } /** 求和的方法 */ public static int add ( int n1 , int n2 ) { int sum = n1 + n2 ; return sum ; //使用return返回计算的结果 } /** 打印的方法 */ public static void print (

循环知识点,if 和 while

倾然丶 夕夏残阳落幕 提交于 2020-01-31 07:49:47
1. 循环. while循环 while 条件: 代码块(循环体) 执行流程: 1. 判断条件是否为真. 如果真. 执行代码块 2. 再次判断条件是否为真...... 3. 当条件为假.执行else 跳出循环. 循环结束 2. 格式化输出 %s: 字符串的占位符, 可以放置任何内容(数字) %d: 数字的占位符 3. 运算符 逻辑运算: and 并且的意思. 左右两端的值必须都是真. 运算结果才是真 or 或者的意思. 左右两端有一个是真的. 结果就是真. 全部是假. 结果才能是假 not 非的意思. 原来是假. 现在是真. 非真即假, 非假既真 break 结束循环. 停止当前本层循环 continue 结束当前本次循环. 继续执行下一次循环 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- # 计数 # count = 1 # while

while循环

帅比萌擦擦* 提交于 2020-01-31 07:00:34
1. 循环. while循环 while 条件: 代码块(循环体) 执行流程: 1. 判断条件是否为真. 如果真. 执行代码块 2. 再次判断条件是否为真...... 3. 当条件为假.执行else 跳出循环. 循环结束 计数 count = 1 while count <= 8: print("你是alex么?") print("你才是太白") count = count + 1 让用户尽情的喷. 输入q退出 while True: s = input("请开始喷:") if s == 'q': break # 停止当前循环 # 过滤掉马化腾 if "马化腾" in s: # 在xxx中出现了xx print("你输入的内容和草泥马有一拼. 不能输出") continue # 停止当前本次循环. 继续执行下一次循环 print("喷的内容是:"+s) 1+2+3+4+5+6+7+8....+100 = ? count = 1 # 准备一个变量 sum = 0 while count <= 100: # 累加到sum中 sum = sum + count # 把sum中的值(之前运算的结果)和当前数的数相加 count = count + 1 print(sum) 输出1-100所有的奇数. count = 1 while count <= 100: if count % 2 !=

多线程累加求和

一个人想着一个人 提交于 2020-01-31 02:39:57
多线程问题,很重要的一点是代码和数据分离 看了这篇文章,感觉内部类用的很好玩,略有启发,对其中错误的地方修改了下,并去除了取处理器核数和线程池的代码,重新写了一个demo。 Java并发和多线程2:3种方式实现数组求和 其实对这个结果并不满意,因为这个demo中,为各个线程分配任务的方式不太好,太死板,按说应该让各个线程自己去抢任务。 package learnThread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @author lakeslove * 多线程累加求和 * */ public class SumCalculator{ private class Sum implements Callable<Integer>{ private int subMin; private int subMax; public Sum(int subMin,int subMax){ this.subMin = subMin; this.subMax = subMax;

寒假第五天

北战南征 提交于 2020-01-30 23:19:58
今天完成了实验二 目的是 掌握 Scala 语言的基本语法、数据结构和控制结构; 2.掌握面向对象编程的基础知识,能够编写自定义类和特质; 3.掌握函数式编程的基础知识,能够熟练定义匿名函数。熟悉 Scala 的容器类库的基本 层次结构,熟练使用常用的容器类进行数据; 4.熟练掌握 Scala 的 REPL 运行模式和编译运行方法。 先通过教程下载安装了scala 然后通过借鉴完成了实验 明天继续学习scala的语法和结构 实验二-1.计算级数 请用脚本的方式编程计算并输出下列级数的前 n 项之和 Sn,直到 Sn 刚好大于或等于 q 为止,其中 q 为大于 0 的整数,其值通过键盘输入。 2 3 4 1 1 2 3n n n S       例如,若 q 的值为 50.0,则输出应为:Sn=50.416695。请将源文件保存为 exercise2-1.scala,在 REPL模式下测试运行,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459; q=50 时,Sn=50.416695。 import scala.io.StdIn object Jishu { def main(args: Array[String]) { var Sum=0.0 println("请输入n") var n:Long=StdIn.readLine().toLong var

2020 CCPC Wannafly Winter Camp Day2 Div.1&2

依然范特西╮ 提交于 2020-01-30 22:09:31
A 数组sum表示前i个字符中元音的数量,即前缀和 我们处理出每个长度的期望,再称上概率 令数组f[i]表示长度为i的子串中元音的总数, f [ 1 ] = 1 , 2 , 3 , . . . , n [ a [ i ] = 元 音 ] = s u m [ n ] f[1]=1,2,3,...,n[a[i]=元音]=sum[n] f [ 1 ] = 1 , 2 , 3 , . . . , n [ a [ i ] = 元 音 ] = s u m [ n ] , f [ 2 ] = ( 1 , 2 ) + ( 2 , 3 ) + . . . + ( n − 1 , n ) = s u m [ n ] + s u m [ n ] − s u m [ 1 ] = f [ 1 ] + s u m [ n ] − s u m [ 1 ] f[2]=(1,2)+(2,3)+...+(n-1,n)=sum[n]+sum[n]-sum[1]=f[1]+sum[n]-sum[1] f [ 2 ] = ( 1 , 2 ) + ( 2 , 3 ) + . . . + ( n − 1 , n ) = s u m [ n ] + s u m [ n ] − s u m [ 1 ] = f [ 1 ] + s u m [ n ] − s u m [ 1 ] , f [ i ] = f [ i − 1 ] + s