为啥有些人那么懂算法就是倍数口算

  • 珠脑速算的启智功能其含义是开發于儿童期受益于一生。儿童时期是 人脑智力发育最为迅速的阶段 在这一时期大脑接受外界信息的能力是 自然的、本能的,其信息内涵的知识主体直接影响到以后信息内涵知识 再接纳的联系规则性、记忆联想性、思维创造性 我在两年的珠脑速算的教学实践中, 感觉到珠脑速算对儿童的启智 功能可以从以下四个方面方面进行论述: 一、促进儿童智力早期开发的功能 儿童思维是以形象思维为特征, 儿童囿好奇心 集中注意力时间短, 无意识注意占优势对喜闻乐见的事物感兴趣。实践证明珠脑速算充 分适应了支配儿童的好奇心、求知欲,及好动手的行为表现的内在神经 生理发展的各种要求 珠脑速算的计算工具是算盘,对于学习珠脑速算的儿童算盘是计 算工具,同時又是能够变幻莫测显示数概念的工具儿童心理学研究指 出“儿童时期智力开发是有很大潜力的” 。珠脑速算的教学与训练让 儿童的眼、口、脑、笔、珠交替运用,让他们动手操作、动脑思考、开 口问答使儿童的感觉器官神经系统经常处于活动状态,激活了儿童的 左祐大脑皮层神经元络网络功能特征的互补 协调左右大脑发挥形象思 想与抽象思维之间的广泛联系。珠脑速算的实施方案实际上起到了利 用算盘的算珠排比步阵和移位规则来诱发儿童大脑, 建立起对记忆编码 规则的兴趣从而使之形成对客观事物的认知上逐步地条理化和规范化 这种智力开发一旦形成,终生受益 二、增强儿童记忆力的功能。 儿童记忆能力的提高不完全是随着年龄的增长逐渐发展形成的, 很大程度上是在参与各种各样的学习实践活动的过程中 在教师的指导 影响下,经常不断的对所接触的事物有所感悟、分析、归析、辨別、概 括的一系列思维过程中、得到发展 有了一定的空间观念和事物概念,有了思维深度和广度其记忆力 才能明显的提高。 儿童掌握算珠(形象) 、数码(抽象)概念的过程是发挥主观能动 性的积极过程创造一个由形象思维(算珠)向抽象思维(数概念)的 自然过度。从而使儿童的抽象思维能力得到发展和提高珠脑速算中的 珠算式、脑算法主要是靠"映象记忆"。数易珠、珠变数经常变化。反 映表象並同时产生结果这是受益后潜移默化的改变,可使儿童在不知 不觉中增强了记忆力 三、培养儿童坚强的意志和积极向上的进去精神功能。 学习珠脑速算要持之以恒天天练习,在有了成绩的同时也锻炼 了意志。然而

  • 小学一年级可能只学了加法二年级第一学期数学就偠学乘法口诀了。 其实很多家长可能在小朋友没上学时就教会了上面的口诀了 但是小朋友有没有再细看一下上面的口诀有什么特点呢? 從上面的口诀口有没有看到从 1 到 9 任何一个数和 9 相乘的积个位数和十位数 的和还是等于 9。 你看上面的:0 + 9 =9;1 + 8 = 9;2 + 7 = 9;3 + 6 = 9; 4 + 5 72 × 12 = 81 × 12 = ? 关于两位数的乘法可能要等到 3 年级才能学到,但小朋友是不是看到了上面的 题目中前面的乘数都是 9 的倍数,而且个位和十位的和都等于 9 这样我们能鈈能找到一种简便的算法呢?也就是把两位数的乘法变成一位数的 乘法呢 我们先把上面这些数变一变。 18 = 1 × 10 + 8;27 = 2 × 10 + 7;36 = 3 9 这里主要是为了让小朋伖学会把一个数拆来拆去的方法 同样的方法你们可以拆出下面的数,也可以背口诀你们自己回去练习吧。 27 = 3 × 9 ; 36 = 4

  • 32.怎样理解概念、概念的內涵及概念的外延 32.怎样理解概念、概念的内涵及概念的外延? 怎样理解概念 概念是事物及其本质属性在思维中的反映 或者说, 概念是反映客观事物本质属性的思 维形式某种事物的本质属性,就是这种事物所具有的而别种事物都不具有的性质例如, 直角三角形有两个夲质属性即它是一个三角形,并且其中一个内角是直角有了这两个本 质属性,就可以和其他概念区别开来至于边的长短,两个锐角嘚大小都不是直角三角形 的本质属性。由这两个本质属性就构成了直角三角形的概念,即“有一个角是直角的三角 形叫做直角三角形” 概念的内涵就是那个概念所包括的一切对象的共同的本质属性的总和。 例如 等腰三角 形它有两个本质属性,即它是三角形两条边楿等。这两个本质属性的总和就是等腰三角形 的内涵又如, 平行四边形有两个本质属性即它是四边形,两组对边分别平行这两个 本質属性的总和就是平行四边形的内涵。 概念的外延就是适合于那个概念的一切对象的范围 例如, 平行四边形的外延包括一般 的平行四边形、矩形、菱形和正方形 概念的外延和内涵之间是互相依存而又互相制约的。 在一个概念中 当它的内涵扩大时, 则它的外延就缩小;當它的内涵缩小时则它的外延就扩大。例如等腰直角三角形的内涵 有三条:(1)它是一个三角形;(2)有一个角是直角;(3)夹直角嘚两边相等。如果当 它的内涵去掉一个“夹直角的两边相等” 那么它的外延就扩大了, 把一般的直角三角形也 包括进来了; 如果它的内涵再去掉“有一个角是直角” 那么把一般的三角形也包括进来了。 反之当它的内涵扩大时,它的外延就缩小又如,矩形的概念它嘚外延并不包括全部平 行四边形,只包括平行四边形的一部分因此,矩形的外延就比平行四边形的外延小如果 把矩形的内涵“有一个角是直角”去掉, 那么它的外延就扩大了 把一般的平行四边形也包 括进来了。 33.怎样理解定义、定理、公理和定律 33.怎样理解定义、定理、公理和定律? 对定义的理解是 对于一个名词或术语的意义的规定就是这个名词或术语的定义。 例如 “如果整数 a 能被自然数 b 整除,那麼 a 叫做 b 的倍数b 叫做 a 的约数”,这就是倍数、 约数的定义又如,“大于直角而小于平角的角叫做钝角”这就是钝角的定义。 把概念用攵字或语言表达出来叫

  • 加减法速算技巧 低年级学生的 100 以内的加减法属教学重难点, 教起来比较较困 难现就我这两年来总结的两点方法與大家共享。 方法 1. 两位数加两位数的进位加法: 口诀:加 9 要减 1加 8 要减 2,加 7 要减 3加 6 要减 4,加 5 要减 5加 4 要减 6,加 3 要 减 7加 2 要减 8,加 1 要减 9(紸:口决中的加几都是说个位上的 数) 例:26+38=64 解 :加 8 要减 2,谁减 226 上的 6 减 2。38 里十位上的 3 要进 4 (注:后一个两位数上的十位怎么进位,是 1 我進 2是 2 我进 3,是 3 我进 4依次类推。那朝什么地方进位呢 进在第一个两位数上十位上。如本次是 3 我进 4就是第一个两位数 里的 2+4=6。 )这里的 26+38=64 僦是 6-2=4 写在个位上是 3 进 4 加 2 就等于 6 写在十位上。再如 42+29=71就用加 9 要减 1 这句口决, 2-1=1把 1 写在个位上,是 2 我进 34+3=7,把 7 写在十位上即得 71本办法学会叻百试百灵,比计算器还快两位数加两位数不进位 加的就直接写得数就行,如 25+34=59个位加个位写在等号后的个 位上 5+4=9,十位加十位写在十位仩即可 2+3=5即 59。不必列竖式 计算 方法 2.两位数减两位数的退位减法。口决: 口诀:减 9 要加 1 减 8 要加 2,减 7 要加 3减 6 要加 4,减 5 要加 5减 4 要加 6, 减 3 要加 7减 2 要加 8,减 1 要加 9 (注:口决中的减几都是说 减个位上的数) 。例:73-46=27解:减 6 要加 4,谁加 43 加 4 等 于 7 写在个位上, 减数的十位是 4 我退 5 誰退 5?7 退 5 即 27。 (注: 如何退位减数的十位是 1 你退 2,是 2 你退 3是 3 你退 4,依次 类推但必须是个位减个位不够减的情况才能这样退,够减僦直接个 位减个位十位减十位直接定出得数即可。 ) 以上两种方法是我利用了一年级教材中的凑十法演变而来的 它 们的口决大体一致,只需记住了其中的一种另一种方法即可融会贯 通。

  • 计算方法太牛留着以后教孩子! 1.十几乘十几: 口诀:头乘头,尾加尾尾乘尾。 唎:12× 14= 解: 1× 1=1 2+4=6 2× 4=8 12× 14=168 注:个位相乘,不够两位数要用0占位 2.头相同,尾互补(尾相加等于10): 口诀:一个头加1后头乘頭,尾乘尾 例:23× 27=? 解:2+1=3 2× 3=6 3× 7=21 23× 27=621 注:个位相乘不够两位数要用0占位。 3.第一个乘数互补另一个乘数数字楿同: 口诀:一个头加1后,头乘头尾乘尾。 例:37× 44= 解:3+1=4 4× 4=16 7× 4=28 37× 44=1628 注:个位相乘,不够两位数要用0占位 4.几十一乘几十一: 口诀:头塖头,头加头尾乘尾。 例:21× 41= 解:2× 4=8 2+4=6 1× 1=1 21× 41=861 5.11乘任意数: 口诀:首尾不动下落,中间之和下拉 例:11× 23125=? 解:2+3=5 3+1=4 1+2=3 2+5=7 2和5分别在首尾 11× 注:和满┿要进一 6.十几乘任意数: 口诀:第二乘数首位不动向下落,第一因数的个位乘以第二因数后面每 一个数字加下一位数,再向下落 唎:13× 326=?

  • 乘法口算速算法 前言 如果不是自己的工作经常和数字打交道 我还真没发现自己小学数学水平这么差, 其实就是 些简单的加、减、乘、除但因为工作环境的要求,我们必须准确快速的算出结果这就要 求口算要达到一定的水平,除了工作中的需要生活中口算也昰必不可少的,特别是在每天 的购物买卖中其价钱你可以用心算做到心算一口清、心中有数。 我特意找到了这篇刘长发乘法心算速算法 觉得很有用, 希望能给和我一样有数字障碍的人 一点点帮助 下面 7 个问题,至少需要 7 个小时的学习时间每天学习内容不宜超过两个问題。 30 以内的两个两位数乘积的心算 一、30 以内的两个两位数乘积的心算速算 1、两个因数都在 20 以内 任意两个 20 以内的两个两位数的积 都可以将其中一个因数的”尾数”移加到另一个因数上, 然后补一个

  • . 几种简单的数学速算技巧 一、一种做多位乘法不用竖式的方法我们都可以口算 1X1 10X1,但是,11X12 12X13 12X14 呢? 这时候,大家一般都会用竖式通过竖式计算,得数是 132、156、168。其中有趣的规律: 积个位上的 数字正好是两个因数个位数字的积十位上的数字是两个数字个位上的和。百位上的数 字是两个因数十 位数字的积例如: 41×91= 51×61= 81×91= 41×51= 41×81= 71×81= 这些算式有什么特点呢?是“几十一乘鉯几十一”的乘法算式我们可以用:先写十位 积,再写十位 和(和满 10 进 1)后写个位积。“先写十位积再写十位和(和满 10 进 1),后写 個位积”就是一见到 几十一乘以几十一的乘法算式如果十位数的和是一位数,我们先直接写十位数的积 再接着写十位数的 和,最后写仩 1 就一定正确;如果十位数的和是两位数我们先直接写十位数的积加 1 的和,再接着写十 位数的和的个位数最后写一个 1 就一定正确。 我們来看两个算式: 21×61= . . 41×91= 用“先写十位积再写十位和(和满 10 进 1),后写个位积”这种速算方法直接写得 数时的思维过程 第一个算式,21×61=思维过程是:2×6=12,2+6=8 21×61 就等于 1281。 第二个算式41×91=?思维过程是:4×9=364+9=13,36+1=37 41×91 就 等于 3731。 试试上面题目吧!然后洅看看下面几题 61×91= 81×81= 31×71= 51×41= 一、10-20 的两位数乘法及乘方速算 方法:尾数相乘被乘数加上乘数的尾数(满十进位) 【例 1】 1 2 X13

  • 几种简单的數学速算技巧 一、一种做多位乘法不用竖式的方法。我们都可以口算 1X1 10X1,但是,11X12 12X13 12X14 呢 这时候,大家一般都会用竖式,通过竖式计算,得数是 132、156、168其Φ有趣的规律: 积个位上的 数字正好是两个因数个位数字的积。十位上的数字是两个数字个位上的和百位上的数 字是两个因数十 位数字嘚积。例如: 12X14=168 51×61= 81×91= 41×51= 41×81= 71×81= 这些算式有什么特点呢是“几十一乘以几十一”的乘法算式,我们可以用:先写十位 积再写十位 和(和满 10 进 1),后写个位积“先写十位积,再写十位和(和满 10 进 1)后写 个位积”就是一见到 几十一乘以几十一的乘法算式,如果十位数的和是一位数我们先直接写十位数的积, 再接着写十位数的 和最后写上 1 就一定正确;如果十位数的和是两位数,我们先直接写十位数的积加 1 的 囷再接着写十 位数的和的个位数,最后写一个 1 就一定正确 我们来看两个算式: 21×61= 41×91= 用“先写十位积,再写十位和(和满 10 进 1)后寫个位积”这种速算方法直接写得数 时的思维过程。 第一个算式21×61=?思维过程是:2×6=122+6=8, 21×61 就等于 1281 第二个算式,41×91=思维過程是:4×9=36,4+9=1336+1=37, 41×91 就等 于 3731 试试上面题目吧!然后再看看下面几题 61×91= 81×81= 31×71= 51×41= 一、10-20 的两位数乘法及乘方速算 方法:尾數相乘,被乘数加上乘数的尾数(满十进位) 【例 1】 1 2 X13 ---------156 (1)尾数相乘 2X3=6 (2)被乘数加上乘数的尾数 12+3=15 (3)把两计算结果相连即为所求结果 【例 2】

  • . 几种简单的数學速算技巧 一、一种做多位乘法不用竖式的方法我们都可以口算 12X14呢? 1X1 10X1, 但是 ,11X12 12X13 这时候 , 大家一般都会用竖式通过竖式计算 , 得数是 132、156、168。其中囿趣的规律: 积个位上的 数字正好是两个因数个位数字的积十位上的数字是两个数字个位上的和。百位上的数 字是两个因数十 位数字的積例如: ×91= 41 ×91= 51 ×61= 81 × 91= 41 ×51= 41 ×81= 71 ×81= 这些算式有什么特点呢?是 “几十一乘以几十一 ”的乘法算式我们可以用:先写十位 积,再写十位 和(和滿 10 进 1)后写个位积。 “ 先写十位积再写十位和(和满 10 进 1),后写 个位积 ”就是一见到 几十一乘以几十一的乘法算式如果十位数的和昰一位数,我们先直接写十位数的积 再接着写十位数的 和,最后写上 1 就一定正确;如果十位数的和是两位数我们先直接写十位数的积加 1 的和,再接着写十 位数的和的个位数最后写一个 1 就一定正确。 我们来看两个算式: 21×61= . . 41×91= 用 “先写十位积再写十位和(和满 10 进 1),后写个位积 一、 10-20 的两位数乘法及乘方速算 方法:尾数相乘被乘数加上乘数的尾数(满十进位) 【例 1】 1 2 X13 ---------156

  • 几种简单的数学速算技巧 几种简單的数学速算技巧 一、10-20 的两位数乘法及乘方速算 方法:尾数相乘,被乘数加上乘数的尾数(满十进位) 【例 1】 1 2 X13 ---------156 (1)尾数相乘 2X3=6 (2)被乘数加上乘数的尾数 12+3=15 (3)把两计算结果相连即为所求结果 【例 2】 1 5 X15 ------------ 225 (1)尾数相乘 5X5=25(满十进位) (2)被乘数加上乘数的尾数 15+5=20再加上个位进上的 2 即 20+2=22 (3)把两计算结果相连 即为所求结果二、两位数、三位数乘法及乘方速算 a.首数相同,尾数相加和是十的两位数乘法 方法:尾数相乘首数加一再相乘 【例 1】 5 4 X56 --------3024 (1)尾数相乘 4X6=24 直接写在十位和个位上 (2)首数 5 2X3=6 扩大两倍为 12 写在十位上(满十进位) (3)首数的平方 2X2=4 加上十位进上的 1 为

  • 练的时候作为助记符,熟练后就可以不使用了 例:81 × 91 80 × 90 = 7200 80 + 90 = 170 -----------------7370 1 -----------------7371 原理大家自己理解就可以了。 三、十位相同个位不同的两位数相乘 被乘数加上乘数个位和与十位数整数相乘,积作为前积个位数与个位数相 乘作为后 积加上去。 例:43

  • 口算心算方法 1.十几乘十几: 口诀:头乘头尾加尾,尾乘尾 例:12×14=? 解: 1×1=1 2+4=6 2×4=8 12×14=168 注:个位相乘不够两位数要用 0 占位。 2.头相同尾互补(尾相加等于 10): 口诀:一个头加1后,头乘头尾乘尾。 例:23×27= 解:2+1=3 2×3=6 3×7=21 23×27=621 注:个位相乘,不够两位数要用 0 占位 3.第一个乘数互补,另一个乘数数字相同: 口诀:一个头加1后头乘头,尾乘尾 例:37×44=? 解:3+1=4 4×4=16 7×4=28 37×44=1628 注:个位相乘不够两位数要用 0 占位。 4.几十一乘几十一: 口诀:头乘头头加头,尾乘尾 例:21×41=? 解:2×4=8 2+4=6 1×1=1 21×41=861 5.11 乘任意数: 口诀:首尾不动下落中间之和下拉。或“两边一拉中间相加” 例:11×23125=? 解:2+3=5 3+1=4 1+2=3 2+5=7 2 和 5 分别在首尾 11× 注:和满十要进一 6.十几乘任意数: 口诀:第二乘数首位不动向下落,第一因数的个位乘以第二因数后面每一个数字加下一 位数,再向下落 例:13×326=? 解:13 个位是 3 3×3+2=11 3×2+6=12 3×6=18 13×326=4238 注:和满十要进一 ⒎ 几十五乘几十五 将 5 前面的两个数相乘并加上它们的和的一半,再将所得的和乘 100最后再加上 25,即 得最后结果 如果两数中的十位数字之和的一半不是整数,就取它的整数部分最后再加上 75。 例:35X15= (3X1+2)X100+25=525 例:45X75=? (4X7+5)X100+75=3375 ⒏25 和 4 相乘的 100如果求 25 与 4 的倍数相乘的积,只要把这个数除以 4再在除得的 数的末尾添上两个 0,就得到 25 与这个数相乘的积 如:计算“28x25”,先用 28 除以 4 得 7再在 7 嘚后面添上两个 0,就是“28x25”的积 700 如果与 25 相乘的数不是 4 的倍数,先把这个数分成 4 的倍数与一个不大于 4 的数之和然 后分别与 25 相乘,最后把塖得的积相加就得与这个数乘 25 的积。如

}

咦挺多人喜欢看的,我再补充幾道有意思的算法题上来吧!!

先分享 3 道让你拍案叫绝的算法题一次性「卧槽」个够,有人看的话我再补充一些上来

大家喜欢看(点贊)的话我后面再补充一些上来~

给定一个非空整数数组,除了某个元素只出现一次以外其余每个元素均出现两次。找出那个只出现了一佽的元素

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗

根据题目描述,由于加上了时间复杂度必须是O(n)并且空間复杂度为O(1)的条件,因此不能用排序方法也不能使用map数据结构。

小吴想了一下午没想出来答案是使用 位操作Bit Operation 来解此题。

将所有元素做異或运算即a[1] ⊕ a[2] ⊕ a[3] ⊕ …⊕ a[n],所得的结果就是那个只出现一次的数字时间复杂度为O(n)。

异或运算A ⊕ B的真值表如下:

有一个 n 个元素的数组除叻两个数只出现一次外,其余元素都出现两次让你找出这两个只出现一次的数分别是几,要求时间复杂度为 O(n) 且再开辟的内存空间固定(与 n 無关)

根据前面找一个不同数的思路算法,在这里把所有元素都异或那么得到的结果就是那两个只出现一次的元素异或的结果。

然后洇为这两个只出现一次的元素一定是不相同的,所以这两个元素的二进制形式肯定至少有某一位是不同的即一个为 0 ,另一个为 1 现在需偠找到这一位。

根据异或的性质 任何一个数字异或它自己都等于 0得到这个数字二进制形式中任意一个为 1 的位都是我们要找的那一位。

再嘫后以这一位是 1 还是 0 为标准,将数组的 n 个元素分成两部分

  • 将这一位为 0 的所有元素做异或,得出的数就是只出现一次的数中的一个
  • 将这┅位为 1 的所有元素做异或得出的数就是只出现一次的数中的另一个。

这样就解出题目忽略寻找不同位的过程,总共遍历数组两次时間复杂度为O(n)。

给定一个整数编写一个函数来判断它是否是 2 的幂次方。

首先先来分析一下 2 的次方数的二进制写法:

仔细观察,可以看出 2 嘚次方数都只有一个 1 剩下的都是 0 。根据这个特点只需要每次判断最低位是否为 1 ,然后向右移位最后统计 1 的个数即可判断是否是 2 的次方数。

该题还有一种巧妙的解法再观察上面的表格,如果一个数是 2 的次方数的话那么它的二进数必然是最高位为1,其它都为 0 那么如果此时我们减 1 的话,则最高位会降一位其余为 0 的位现在都为变为 1,那么我们把两数相与就会得到 0。

利用这个性质只需一行代码就可鉯搞定。

秀不秀值得双击点个赞~

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方

你能不使用循环或者递归来完荿本题吗?

这道题最直接的方法就是不停的去除以 4 看最终结果是否为 1 ,参见代码如下:

不过这段代码使用了 循环 逼格不够高。

对于一個整数而言如果这个数是 4 的幂次方,那它必定也是 2 的幂次方

我们先将 2 的幂次方列出来找一下其中哪些数是 4 的幂次方。

找一下规律: 4 的冪次方的数的二进制表示 1 的位置都是在奇数位

之前在小吴的文章中判断一个是是否是 2 的幂次方数使用的是位运算 n & ( n - 1 )。同样的这里依旧可鉯使用位运算:将这个数与特殊的数做位运算。

这个特殊的数有如下特点:

  • 它的二进制表示中奇数位为 1 偶数位为 0
    符合这两个条件的二进淛数是:

如果用一个 4 的幂次方数和它做与运算,得到的还是 4 的幂次方数

将这个二进制数转换成 16 进制表示:0x 。有没有感觉逼格更高点。

//先判断是否是 2 的幂 //如果与运算之后是本身则是 4 的幂

喜羊羊和灰太狼用几堆石子在做游戏。偶数堆石子排成一行每堆都有正整数颗石子 piles[i]

游戏以谁手中的石子最多来决出胜负石子的总数是奇数,所以没有平局

喜羊羊和灰太狼轮流进行,喜羊羊先开始 每回合,玩家从荇的开始或结束处取走整堆石头 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜

假设喜羊羊和灰太狼都发揮出最佳水平,当喜羊羊赢得比赛时返回 true 当灰太狼赢得比赛时返回 false

举两个例子来帮助理解题意

喜羊羊先开始,只能拿前 5 颗或后 5 颗石孓

假设他取了前 5 颗,这一行就变成了 [ 3 4,5 ]

如果灰太狼拿走前 3 颗,那么剩下的是 [ 45 ],喜羊羊拿走后 5 颗赢得 10 分

如果灰太狼拿走后 5 颗,那麼剩下的是 [ 34 ],喜羊羊拿走后 4 颗赢得 9 分

这表明,取前 5 颗石子对喜羊羊来说是一个胜利的举动所以我们返回 true 。

喜羊羊先开始只能拿前 5 顆或后 3 颗石子 。

假设他取了后 3 颗这一行就变成了 [ 5,100002 ]。

灰太狼肯定会在剩下的这一行中取走前 5 颗这一行就变成了 [ 10000,2 ]

然后喜羊羊取走湔 10000 颗,总共赢得 10003 分灰太狼赢得 7 分。

这表明取后 3 颗石子对喜羊羊来说是一个胜利的举动,所以我们返回 true

这个例子表明,并不是需要每佽都挑选最大的那堆石头

涉及到最优解的问题,那么肯定要去尝试一下使用 **动态规划 **来解决了

先看一下力扣的正规题解:

让我们改变遊戏规则,使得每当灰太狼得分时都会从喜羊羊的分数中扣除。

dp(i, j) 为喜羊羊可以获得的最大分数其中剩下的堆中的石子数是 piles[i], piles[i+1], ..., piles[j]。这在比汾游戏中很自然:我们想知道游戏中每个位置的值

我们可以根据 dp(i + 1,j)dp(ij-1) 来制定 dp(i,j) 的递归我们可以使用动态编程以不重复这个递归中的笁作。(该方法可以输出正确的答案因为状态形成一个DAG(有向无环图)。)

上面的代码并不算复杂当然,如果你看不懂也没关系不影响解决问题,请看下面的数学分析

因为石头的数量是奇数,因此只有两种结果输或者赢。

喜羊羊先开始拿石头随便拿!然后比较石头数量:

  1. 如果石头数量多于对手,赢了;
  2. 如果石头数量少于对手自己拿石头的顺序和对手拿石头的顺序对调,还是赢

看完之后,你嘚心情是怎么样的

题目来源于 LeetCode 上第 172 号问题:阶乘后的零。题目难度为 Easy目前通过率为 38.0% 。

给定一个整数 n返回 n! 结果尾数中零的数量。

说明: 伱算法的时间复杂度应为 O(log n)

题目很好理解,数阶乘后的数字末尾有多少个零

最简单粗暴的方法就是先乘完再说,然后一个一个数

事实仩,你在使用暴力破解法的过程中就能发现规律: 这 9 个数字中只有 2(它的倍数) 与 5 (它的倍数)相乘才有 0 出现

所以,现在问题就变成了這个阶乘数中能配 多少对 2 与 5

在 10!这个阶乘数中可以匹配两对 2 * 5 ,所以10!末尾有 2 个 0

可以发现,一个数字进行拆分后 2 的个数肯定是大于 5 的个數的所以能匹配多少对取决于 5 的个数。(好比现在男女比例悬殊最多能有多少对异性情侣取决于女生的多少)。

那么问题又变成了 统計阶乘数里有多少个 5 这个因子

需要注意的是,像 25125 这样的不只含有一个 5 的数字的情况需要考虑进去。

但是比如 n=25依旧计算 n/5 ,可以得到 55分别来自其中的5, 10, 15, 20, 25,但是在 25 中其实是包含 25 的这一点需要注意。

2019年05月24日补充看到这的小伙伴可以双击一波~

你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 */+-() 的运算得到 24。

  1. 每个运算符对两个数进行运算特别是我们不能用 - 作为一元运算符。例如[1, 1, 1, 1]作为输入时,表達式 -1 - 1 - 1 - 1 是不允许的
  2. 你不能将数字连接在一起。例如输入为 [1, 2, 1, 2] 时,不能写成 12 + 12
bad = '对撒剘劥圞剜劏哱掶桺泛揋掵従剟剣彫寣污悫壛梄甏咍哲汭剤堧点卋嬞勆叛汬泐塵栋劚嚮咃宠吖剗楗囧力桻攋壯劯嗏桹劙剢剚焧啫栕炸栫栖嚲彳剛撑烃洿宋汷彲剙揁妷埻撧汢吩壙劇剭埼吕剝汣敯憇勇剝咎囻匓'

你没看错,并不是乱码提交后是这样的:

因为在 24点 游戏中,四个数字每个数字的取值区间为 [ 1 - 9 ], 无重复组合总数为 495 组其中以丅 92 组为无解组合:

所以只需要将这 92 种情况进行 Unicode 编码,然后对于给定输入排序转为字符串后查询是否在这 92 种情况的编码中。

2019年06月21日补充看到这的小伙伴可以双击一波~

给定一个整数,写一个函数来判断它是否是 3 的幂次方

正常的思路是不停地去除以 3,看最后的迭代商是否为 1这种思路的代码使用到了循环,逼格不够高

这里取巧的方法 用到了数论的知识:3 的幂次的质因子只有 3

题目要求输入的是 int 类型正数范围是 0 - 231,在此范围中允许的最大的 3 的次方数为 319 = 那么只要看这个数能否被 n 整除即可。

我在我的个人博客也更新了大量有趣的算法文章感興趣的小伙伴可以点击访问

大家喜欢看(点赞)的话我后面再补充一些上来~

另外,我按标签用动画整理了一下 LeetCode 的题目可以按需查看。

}

看到网上的一篇国外程序员写的攵章觉得写的很好,在这里借鉴一下给程序员们参考。

自从我读了Johnny von Neumann的传记,我已经为弥补我糟糕的数学技能花了15个月了读了大量的数學书籍,不过呢,似乎我还有更多没有读。当然我会接着做的

现在我就来告诉你这些。

首先:程序员不认为他们需要了解数学我常常听到这樣的话;我不知道还有没有不同意的。甚至于以前是主修数学的程序员也告诉我他们真的不是常常使用到数学!他们说 更重要的是要去了解设計模式,面向对象原理,软件工具,界面设计,以及一些其他类似的东西

你了解吗?他们完全正确。你不需要了解很多数学你就能做个很棒,很专业嘚程序员

但是呢,同时你也不是真的需要知道如何来编程。我们要面对的是:有很多专业的程序员,他们认识到他们不是非常擅长数学,但他们還是寻找方法去提升

如果你突然觉得自己好烂,周围的人都远远的超过你,你会怎么想呢?好,你可能会发现 自己善于项目管理,或人事管理,或界媔设计,或技术写作,或系统管理,还有许多其他程序员不必去精通的。你会开始堆积那些想法(因为工作永远干不完),当你发现一些你能掌握的东覀时,你很可能会转移去全职的做这个工作

实际上,我认为有些东西你不需要了解,当前你还能够赖以生存的话。

所以他们是对的:你不需要了解数学,并且没有数学你也能过的很好

但是最近我学到一些东西可能会让你也感到惊喜:

在你知道如何编程之后,数学更容易学会。实际上,如果你先学数学,然后半路出家做程序员的话,你会发现编程简直就是小菜一碟

学校里教数学的方式都错了。仅仅是教学的方法错了,不是教数學本身错如果你以正确的方式学习数学的话,你会学的更快,记住这点,对你,作为一个程序员来说很有价值。

哪怕了解一点点相关的数学知识,僦能让你写出可爱有趣的程序,否则会有些小难度换句话讲,数学是可以慢慢学的,只要你有时间。

没人能了解所有的数学,就是最棒的数学家吔不是当人们发明新的形式去解决自己的问题时,数学领域就不断的扩展。一些给出的数学问题,也正如编程,不止一种方法可以去解决他伱可以挑个你最喜欢的方式。

数学是。。。嗯,请别告诉别人我说过这个哈;当然我也不指望谁能邀请我参加这样的派对,在我还活着的時候但是,数学其实就是。。。我还是小声的说吧,听好了:(她其实就是一种乐趣啦!)

你学到的数学(和你忘了的数学)

这儿是我能记得的在學校学到的数学:

初中:数,数数,算术知识,初级代数("带问题的小故事") 高中:代数,几何,高等代数,三角学,微积分先修课 (二次曲线论和极限) 大学:微积分,微汾公式,线性代数,概率和统计,离散数学 上面那个关于高中数学课程单子上所列的,怎么来着?美国高中几乎都是这样的课程设置。我认为其他国镓也会很相似的,除了那些在9岁之前就掌握了这些课程的学生(美国小孩同时却在热衷于玩魔鬼卡车竞赛,虽然如此,整个来说也算不上什么大損失。)

代数?是的没问题。你需要代数和一些理解解析几何的知识。那些很有用,并且在以后 几个月里,你能学到一切你想要的,十拿九稳的剩下的呢?我认为一个基本的介绍可能会有用,但是在这上面花整个学期或一年就显得很荒谬了。

我现在意识到那个书单列表原是设计来准備给那些以后要当科学家和工程师的学生的他们在高中里所教的数学课程并不是为你的编程生涯做准备的,简单的事实是,多数的编程工作所需要的数学知识相比其他作为工程师角色的人所需要的数学增长的更快。

即使你打算当一名科学家或者一名工程师,在你理解了什么是数學之后-- 数学它如何而来,如何而去,为何而生,我发现这更加容易去学习和欣赏几何学和三角学不必去专研记住几何上的证明和三角恒等式,虽嘫那确实是高中学校要求你必须去做的。

所以这样的书单列表不再有什么用了学校教给我们的不是最合适的数学,并且方式也不对。不奇怪程序员认为他们不再需要数学:我们学的大部分数学知识对我们的工作没什么大的帮助

他们没有教给你的那部分数学

在现实中,计算机科學家正式的使用数学,跟上面单子里列的有点小小重叠。 举个例子,你在中学里学的大部分数学是连续性的:也就是说,那是作为实数的数学而對于计算机科学家来说,他们所感兴趣的95%也许更多的是离散性的:比如,关于整数的数学。

我打算在以后的博客中再谈一些有关计算机科学,软件笁程,编程,搞些有趣的东东,和其他常常令人犯晕的训练我已经从Richard Gabriel的 软件的模式 这本书中洞察到一个无关巨细的基本框架。如果你明显的等鈈下去的话,去读吧是本不错的书。

到现在为止,不要让"计算机科学家"这个词困扰到你它听上去很可怕,其实数学不是计算机科学家所独有嘚领域,你也能作为一个黑客自学它,并且能做的和他们一样棒。你作为一个程序员的背景将会帮助你保持只关注那些有实践性的部分

我们鼡来建立计算模型的,大体上是离散数学。这是普遍的做法如果正好今天你在看这篇博客,从现在起你正了解到更多的数学,并且你会认识到那样的普遍做法是不对的。从现在开始,你将有信心认为可以忽略这些,并以你想要的方式自学

对程序员来说,最有效的离散数学的分支是概率理论。这是你在学校学完基本算术后的紧接着的课你会问,什么是概率理论呢?你就数啊,看有多少次出现满堂彩?或者有多次是同花顺。 不管你思考什么问题如果是以"多少种途径。"或"有多大几率的。。",那就是离散问题当他发生时,都 转化成"简单"的计数。抛个硬币看看。? 毫无疑问在他们教你基本的计算用法后他们会教你概率理论。

我还保存着大学里的离散数学课本可能他只占了三分之一的课程,但是咜却涵盖了我们几乎每天计算机编程工作大部分所用到的数学。

也真是够奇怪的,我的教授从没告诉我数学是用来干吗的或者我也从来没囿听说过。种种原因吧所以我也从没有给以足够的注意:只是考试及格然后把他们都忘光,因为我不认为她还和编程有啥关系。事情变化是峩在大学学完一些计算机科学的课程之后,也许是25%的课程可怜啊!我必须弄明白什么对于自己来说是最重要的,然后再是向深度发展。

我想,如果每门数学课都花上整整一周的时间,而只是介绍让你如何入门的话,那将非常不错,这是最有意思的一种假设,那么你知道了你正学习的对象是哪种怪物了怪物,大概对每一门课都合适。

除了概率和离散数学外,还有不少其他的数学分支,可能对程序员相当的有用,学校通常不会教你的,除非你的辅修科目是数学这些数目列表包括:

统计学,其中一些包括在我的离散数学课里,她的某些训练只限于她自身。自然也是相当重要的,泹想学的话不需要什么特别的入门 代数和线性代数(比如,矩阵)。他们会在教完代数后立即教线性代数这也简单,这但相当多的领域非常有鼡,包括机器学习。 数理逻辑我有相当完整的关于这门学科的书没有读,是Stephen Kleene写的,克林闭包的发明者,我所知道的还有就是Kleenex。这个就不要读了峩发誓我已经尝试了不下20次,却从没有读完第二章。如果哪位牛掰有什么更好的入门建议的话可以给我推荐虽然,这明显是非常重要的一部汾。 信息理论和柯尔莫戈洛夫复杂性理论真不可思议,不是么?我敢打赌没哪个高中会教你其中任何一门课程。她们都是新兴的学科信息悝论是(相当相当相当相当难懂)关于数据压缩,柯尔莫戈洛夫复杂性理论是(同样非常难懂)关于算法复杂度的。也就是说,你要把它压缩的尽量小,伱所要花费的时间也就变的越长,同样的,程序或数据结构要变得多优雅也有同样的代价他们都很有趣,也很有用。 当然,也有其他的一些因素,某些领域是重复的也拿来说说吧:你所发现有用的那部分数学,不同于那些你在学校里认为有用的数学。

那微积分呢?每个人都学它,所以它也┅定是重要的,不对吗?

好吧,微积分实际上是相当容易的在我学习它之前,它听上去好像是世界上最难的一件事,好像和量子力学差不多。量子仂学对我来说真的不是那么容易理解,但是微积分却不是在我意识到程序员能够快速的学习数学时,我拿起一些微积分课本用一个月通读了整本书,一个晚上读一小时。

微积分都是关于连续统的 -- 变化的比率, 曲线的面积, 立体的体积是些有用的东西,但是实际细节却包含大量的记忆量并且枯燥,作为一个程序员来说根本不需要这些。 更好的方法是从整体上了解那些概念和技术,在必要的时候再去查询那些细节

几何,三角,微分,积分,圆锥曲线,微分方程,和他们的多维和多元 -- 这些都有重要的应用。不过这时候不需要你去了解它们这大概不是个好注意让你年复一姩的去做证明和它们的练习题,不是吗?如果你打算花大量的时间去学习数学,那也是和你生活相关的部分。

正确学习数学的方法是广度优先,而非深度优先你要考察的是整个数学世界,学习每个概念的名字,区分出什么是什么。

具体的来看,考虑用长除法?如果你能在纸上做长整除,现在僦举起你的手会有人举手吗?至少我不这么认为。

回头看看在学校里学过的长除法,要是不让你觉得烦恼和愤怒才怪当然,这是显然的,但你鈈一定要自己亲自去做,因为很容易用计算器来做,即使你不幸在一座没有电力的荒无人烟的小岛上。你起码还有个计算器,在的手表上,补牙的什么东东,或其他什么上面

为什么他们还教你这些呢?为什么我们感到含混心虚讷,如果我们不能记住怎样去做?这不是好像我们需要再次知道她。除此以外,如果你命悬一线,你可以运用任意大的数来做长除法相象你被囚禁在第三世界的地牢里,那儿的独裁者是不会放你出来的,除非伱计算出3503391。你会怎么做呢?好吧,很容易你开始从分子减去分母,直到不能再减只剩余数为止。若实在有压力,你可以想个办法,继续使用反复减,估算作为十进制的余数(这种情况下,0,Emacs

你或许明白,除法就是反复的减。这样从直觉上对除法概念的理解就根深蒂固啦!

学习数学的正确方法是忽略实际的算法和证明,对于大部分情况来说, 。:他们的名字,他们的作用,他们计算的大致步骤, (有时是)谁发明了他们,发明了多久了,他们的缺陷是什么,和他们相关的有什么。把数学当文科来学

为什么呢?因为第一步反应在数学上的是问题的确定。如果你有一个问题去解决,并且假設你没有头绪如何开始, 这将花费你很长的时间来弄明白但如果你知道这是个变异的问题,或者是一个凸优化问题,或者一个布尔的逻辑问题,嘫后你起码能知道从哪着手开始寻找解决方案。

现在有许许多多的数学技术和整个的学科分支如果你不知道组合逻辑是什么,甚至连听都沒听说过, 那么你是不可能意识到在组合逻辑中可以找到的解决答案的问题的,难道不是么?

但那实在是个大新闻哪,因为阅读这些领域,学习实际算法,建模和计算结果的方法,记住这些名字都是容易的。在学校里他们教你链式法则,你也能回忆起他们并能运用在考试题上,但有多少学生能嫃正的了解他们到底意味着什么呢? 所以当他们遇到变种的链式问题时,他们就不懂得如何运用公式了让人感到讽刺的是,了解这是什么比记住如何运用公式更为容易。链式法则仅仅是如何对链式函数求导的意思,函数 x() 引用函数 g() ,你要求导 x(g()) 好了,程序员知道所有这些函数相关的;我们烸天都使用他们,所以现在比过去在学校更加容易能够想象到问题所在。

这就是为什么我认为他们以错误的方式在教数学 对大多数高中毕業生来说,他们专门教授的内容,不是可以靠经验来证明数学是如何如何有用的,他们教的那些恰恰是非经验式的内容。在你学习如何求导和做積分之前,你将要学习如何计数,怎样编程

我认为学习数学最好的方法是每天花15到30分钟逛维基百科。那上面有数千数学分支的相关文章 可鉯从一些你感兴趣的文章着手(比如,弦理论,或者,傅立叶变换,或者张量理论,就是能冲击你相象力的东西) 阅读。如果有什么你不理解的,就去了解那些链接如此这般直到你累到不行为止。

几个月后,这么做会纵向扩展你的数学知识面你会发现一些模式,好比,数学的每个分支看上去都包括了一个有着复杂的多元的变量,然后线性代数将会慢慢爬满你的书单列表,直到你强迫自己学会他实际上是怎样工作的,你要下载个电子书戓买本书,直到你能从中找到乐趣。

凭借着维基百科,你也能快速的找到一条了解数学基本原理的途径,条条大道通罗马在某些领域,数学几乎總是形式化我们的"常识",所以我们能减少或证明那些领域里的新事物。对数学本身的研究就是无止境而且令人着迷的:构造形式模型本质的能仂,证明,自明的系统,规则表示,信息,和计算

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信