
python
文章平均质量分 77
可雷曼土
数学是美基础,简单是真理的光辉。
展开
-
趣味编程闯关游戏介绍
趣味编程闯关游戏介绍游戏入口:编程闯关这个最土的小游戏主要是进行算法入门训练的。学习算法不可能一蹴而就。一般都是个循环往复的过程。有点感觉,然后遇到挫折,百思不解,直到想放弃。不甘心,从头再来。。更多的收获,更深的认识…再遇拦路虎。。。。。。终于有一天,曾经的崇山峻岭,回首皆为土磊沙丘。。。但更辽阔的天地才刚刚看到边界。。。。这个游戏是为算法I级(入门级)预备的。一共只有五关。大体剧透一下:太空罚款没什么难度,属于热身类型会基本的选择,循环,就能完成。但也有坑:原创 2021-07-12 10:25:02 · 1343 阅读 · 0 评论 -
刷力扣,学算法(2)
题外真正学会编程,只能通过实践。需要有一个外在的标准(而不是自我的感觉),来检验思路及编码的可行性。在线OJ是很好的客观检验手段。对初学者而言,刷题不在多,不在难,而在于对每道题多思考,多设计不同思路。一般而言,python语言并适合写出最高效的算法。但它的简单易读,很适合向初学者介绍算法的思想。题目【leetcode题库,第1982题】给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = “abc”,原创 2021-05-19 21:10:05 · 143 阅读 · 0 评论 -
最大公共子序列LCS
实用意义面对经典算法,经常有同志质疑:为什么要研究这个问题,是不是吃得太饱?这里说一下最大公共子序列问题的实际意义:两个场景:某个上万人参加的在线OJ考试,为了避免抄袭,需要用机器断定出任意两个提交的相似度。我们假设作弊者没有充分的时间和能力,只能多次对原稿进行如下两个操作之一:a添加一行,b删除一行。两段基因序列,可能同源,在复制过程中,可能会丢失了某些位置的碱基对,也可能会把某些碱基对复制错。我们想知道两个序列同源的可能性多大。示例我们以字符串代表序列,不影响问题的本质。那么,最大公原创 2021-04-25 13:55:15 · 593 阅读 · 0 评论 -
为什么python打开文件时有文本和二进制的说法
文件的扩展名尤其是windows环境下,常有误解:文件名决定了它的类型。其实文件名与人的名字一样,叫张富贵不一定是有钱人。扩展名为 txt 的也可能本来是一幅图片(我一哥们常把他的电影文件改扩展名为txt)。当然,扩展名是大家暗暗约定的风俗,最好要入乡随俗。文件内容有文本和二进制之分?这个也不十分了然。文件在存储上,就是一些1011010010…的信息,怎么好说是什么类型呢?比如,你把一个mp3文件删去一半,再后边粘上一首古诗上去,机器也不至于爆炸吧?这个文件又算哪种类型呢?类型只是一种观点原创 2021-04-22 19:52:43 · 574 阅读 · 0 评论 -
python3题解(56 控制台输出月历)
在控制台输出月历【问题】已知年,月,在控制台输出该月的月历,比如1900年1月的月历:Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 分析:问题的关键是需要知道那个月的第一天是星期几。既然已经...原创 2019-12-20 13:03:25 · 226 阅读 · 0 评论 -
python3 题解(55 最长公共子串)
最长公共子串【问题】已知两个串a,b,求它们的最大公共子串的长度。最笨的办法是找到所有的公共子串,再来它们中最长的。这个复杂度太高,串稍微长一点,就特别慢了。请设计更好的算法。分析:如果把 a 串中字符为模坐标,b 串中的字符为纵坐标,求对应位置字符是否相同,相同则为 1, 不同为 0。所谓公共子串长度,就是左上到右下斜线方向的连续 1 的个数。为了避免再去统计这个数字,可以在相同时把左...原创 2019-12-16 12:16:51 · 381 阅读 · 0 评论 -
python3 题解(54 三阶幻方)
三阶幻方【问题】用1~N2N^2N2的数字填充一个方阵。如果每行,每列,以及两条对角线上的数字之和相等,称此方阵为幻方。用 1~9 填充 3 行 3 列的方阵,可以得出多少个幻方?如果,把旋转,镜像后的方阵看作同一个方阵,可以得出多少个幻方。分析:对所有可能的情况产生全排列。再筛选每一种情况即可。因为3阶方阵规模很小,没有必要用一个二维数组表示,直接用一维就可以。# 三阶幻方问题#...原创 2019-12-09 19:51:16 · 2055 阅读 · 0 评论 -
python3 题解(53 车队入栈问题)
车队入栈问题【题目】编号为 1,2…n 的一个车队,从右向左行驶。道路只能容一辆车通过,无法超车。中间有个死胡同,作为检查站。所有经过车辆必需入站检查。也可能进行很复杂检查,也可能不检查,入站后,马上出站继续上左边的路行驶。检查站容量很大,且也是单车道。求这n辆车最后在左边道路上的排列有多少种可能。分析:如果是 1 辆车,当然只 1 种可能。2 辆车则 2 种。现在考虑 3 辆车的情...原创 2019-12-02 20:03:00 · 293 阅读 · 0 评论 -
python3 题解(52 最原始的加密解密)
原始加密解密【问题】据传说,最原始的加密解密是使用在罗马军队传递情报的环节中。其原理只是把明文的字母向后移动 k 个位置。比如k=2时,a变成c,b变成d,y则变为a,z变为b。请据此规则编写加密、解密的程序。我们不妨假定只对小写字母加密,其它的符号保持不变。分析:加密的过程向后移动,遇到z后,再循环回a,这可以用 +k 取模来实现。解密实际上就是 -k 参数的加密而已。## 原始的...原创 2019-11-30 21:05:13 · 357 阅读 · 0 评论 -
python3 题解(51 矩阵的乘法)
矩阵的乘法【问题】给定两个矩阵 A( a 行 b 列) B(b行c列),可以用乘法得出一个a行c列的矩阵。试编程解之分析:如果使用第三方的库,比如numpy,这个问题是基本运算,一句话就可以搞定。现在说的是要自己编写。乘法的本质是,把第二个矩阵转置后,把它都看成行向量。然后求所有两个向量的点积。因而,主要的逻辑是定义两个辅助函数,一个求转置,一个求点积。### 矩阵的乘法def...原创 2019-11-26 15:27:33 · 279 阅读 · 0 评论 -
python3 题解(50 点到直线的距离)
求给定点到给定的直线的距离【问题】已知一点,以及一条直线(通过给定直线上的两个点来决定)。求点到直线的距离。分析:这基本是个纯数学的问题。设点为p0,直线上的两个点p1,p2。思路一:先求出三角形 △p0p1p2\bigtriangleup p_0p_1p_2△p0p1p2 的面积,又知道底边长p1p2p_1p_2p1p2,可以很容易求出高,就是p0到直线的距离。思路二:如下...原创 2019-11-19 21:00:05 · 466 阅读 · 0 评论 -
python3 题解(49 已知两直线求交点)
两直线交点【问题】两点确定一条直线。两直线只要不平行,就一定有唯一的交点。请编程,输入两组两点的坐标,求这两条直线的交点坐标。两点(x0,y0) (x1,y1) 所确定的直线形式为 ax + by = c需要用点坐标来确定参数 a, b, c 的值。实际上有效的信息是两个值。因为上面的方程同时放大一定的倍数仍然成立。这样,(a,b,c)是一组解,不是一个。求出任意一个即可。点坐标代入,解...原创 2019-11-18 13:49:57 · 1599 阅读 · 0 评论 -
python3 题解(47 定义有理数类)
有理数类【问题】浮点数的运算很多时候都是近似的,因为计算机无法表示一个无限的小数。有理数总可以表示为整数的比值,并且有理数的四则运算结果还是一个有理数(除0除外)。如果是有四则运算,则可以考虑用有理数表示,这样可以没有舍入误差。分析:记录一个有理数的分子,分母就可以表示一个有理数。需要注意约分。### 定义有理数类class Rati(object): @staticmethod...原创 2019-11-12 16:38:03 · 2611 阅读 · 0 评论 -
python3 题解(46 身份证号码校验)
身份证号码校验【问题】目前使用的身份证号码是18位的。如果在需要输入身份证的时候,随便编一个数字上去,十有八九是不能通过的。因为,这18位编码要符合一定的校验规则。具体地说,把18位编码的每一位乘以一个权值加起来,总和对11求模,结果必须为1。身分证编码的前17位数必需是数字,最后一位是校验位,可能是数字,也有可能是X,代表10。请编程对已知的身份证号校验是否合格。分析:这个需求很明确...原创 2019-11-11 20:21:48 · 823 阅读 · 0 评论 -
python3 题解(45 卡号校验 Luhn算法)
银行卡号校验【问题】在自助机上给别人转款,你有没有担心过,万一卡号错了一位,把钱打给不认识的人怎么办呢?其实大可不必这么心累,银行卡的号码并不是连续有效的,它需要符合一定的校验规则,卡号中任何一位发生错误都是一个无效的号码。这个规则是:Luhn算法。具体地说,把卡号码从后向前分别标为1,2,3…奇数位的数不变,偶数位的乘以2,如果是2位数,把它的两个数位上数相加。最后,把这些数求和,如果刚...原创 2019-11-08 13:51:30 · 1149 阅读 · 0 评论 -
python3 题解(44 控制台画圆)
控制台上近似地画圆【问题】通过输出空格和星号,在控制台上近似地画一个半径为 r 的圆。分析:假定垂直方向为 y 轴,水平方向为 x 轴。如下图:y的值就是当前所在行的值。由此可以算出 x 值。由于圆是对称的,只要画出了它的四分之一,就可以生成全圆。先画出右下部分比较方便。### 在控制台上画圆import mathdef quarter(r): ## 生成半径为r的圆的右...原创 2019-11-07 13:12:10 · 358 阅读 · 0 评论 -
python3 题解(43 进制转换)
进制转换【问题】因为有十个手指,我们人类喜欢用10进制来表示数字。其实用其它进制表示可能更有合优势。比如,计算机中常用的2进制,16进制。请你来编程,把一种进制表示的数字串,转换为另一种进制的表示。为了表示言行方便,约定最多只到 36 进制,这样用10个阿拉伯数字和26个大写字母就可以表示了。分析:实际上我们只要实现了把一个数转为任意进制,以及把任意进制串转为一个数就可以了。把进制串转...原创 2019-11-06 11:38:27 · 289 阅读 · 0 评论 -
python3 题解(42 Excel地址转换)
Excel地址转换【问题】Excel表示单元格地址的方式很特别。它用字母来表示列号。A表示第1列,B表示第2列,…,Z表示第26列,然后,AA表示第27列,依此类推。请实现两个转换函数。分别把数字列号转为Excel列号,以及把Excel列号转换为数字列号。分析:这个转换看上去是大约就是26进制,仔细观察又有些区别。如果把A…Z 分别固定为代表1…26Excel 列号转为数字很容易。个...原创 2019-11-05 11:49:52 · 265 阅读 · 0 评论 -
python3 题解(41 罗马数字转换)
罗马数字转换【问题】因为宗教的原因,古罗马的数字表示体系中没有零。这使得简单的数值表示变得十分复杂,更不用说四则运算。I 表示1,II表示2,III表示3,4不是用IIII,而是IV。接着是…5是V,6是VI,7是VII,8是VIII,就是加法。但,9不是VIIII,而是IX,也就是10减1,X表示10XI表示11,XII表示12,。。。。逢五逢十都有一个固定的字母表示。它们还有:L ...原创 2019-11-04 19:39:29 · 349 阅读 · 0 评论 -
python3题解(40 通话时长)
通话时长【问题】已知通话的起始时间,结束时间,求通话的时长。时间的格式: 小时:分:秒求通话的总秒数。假设通话时长不大于24小时。比如:23:59:58 到 0:0:2 通话时长为3秒。分析:把不同的单位都转为秒,就容易处理了。即,把时间转换为距离当日午夜的秒数。### 通话时长def sec_span(begin, end): def toHMS(s): #拆分为时分秒...原创 2019-11-01 13:46:33 · 540 阅读 · 0 评论 -
python3题解 (39 N天后的日期)
N天后的日期【问题】给定一个日期,求它的N天后是什么日期。分析:并不需要调用关于日期的API。只要不断地求某一天的后一天是什么日期就可以了。不是当月的最后一天,则直接 day + 1如果是最后一天,则变成下一个月的第一天。### N天后的日期def ndays(date, n): def leap_year(year): return (year % 4 == 0) and (...原创 2019-10-30 18:54:24 · 314 阅读 · 0 评论 -
python3 题解(38 格子中的输出)
在格子中输出【问题】给定多个串的列表,每个串含多个项,用逗号分开。把这些项输出到表格中,居中对齐。例如,串表如下:a,bb,cccaaaa,,ccccca,b,c,dddaa,,ccccccccccccccccc,,ee则输出的效果如下:+----+--+-----------------+---+--+| a |bb| ccc | | |+...原创 2019-10-29 20:37:31 · 292 阅读 · 0 评论 -
python3 题解(37 最大连续次数的字符们)
连续次数最多的字符【问题】给定一个串,其中的字符可能连续出现多次。请列出出现次数最多的字符。注意,出现次数最多的字符可能不只有一个。例如:“aabbbccddde”,其中,b和d都是出现了3次,是出现次数最多的。分析:可以先把所有连续出现的字符分成一组,“aabbbccddde”分组后如下:[“aa”, “bbb”, “cc”, “ddd”, “e”]然后,统计每个元素的长度,得到:...原创 2019-10-28 16:10:55 · 457 阅读 · 0 评论 -
python3 题解(36 补齐为回文串)
补齐为回文串【问题】回文串也中镜像串,就是左右对称的串。“a”, “aba”,“baab”, 都是回文串。给定一个串,至少要添加上多少个字母,才能将它改造为回文串呢?分析:这可以通过递归的方法,不断缩小规模来实现。如果一个串的首尾两个字符相同,那么最小次数就是去掉首尾后的子串的递归问题。如果不同,有两种改造方案。a…b ⇒ a…ba或a…b => ba…b选哪个方案取决于...原创 2019-10-24 14:55:19 · 1071 阅读 · 0 评论 -
python3 题解(35 汉诺塔)
汉诺塔【问题】hanoi,也有翻译为河内塔的。据说是源于印度的古老传说。传说大梵天创世之时,在其庙宇中,置3根金刚石的柱子。其中的一根柱子上叠放了64张大小各异的金盘。下面的金盘总是比上面的大。僧侣被要求把这些金盘完全搬到另一个空柱子上。但有如下约束:每次只能搬一张金盘。大的金盘不能放置在较小的金盘上面。金盘如果不是在搬运的途中,就一定是套放在 3 个柱子中的一个上。大梵天已预言,任...原创 2019-10-23 16:31:29 · 213 阅读 · 0 评论 -
python3 题解(34 棋盘放麦子)
棋盘放麦子【问题】国际象棋的棋盘有共有64格。传说国王为奖励它的发明人,答应了他的一个“小”要求。在棋盘的第1格放1粒小麦,第2格放2粒,第3格放4粒,第4格放8粒…,每一格是前一格数目的2倍。这一共是多少小麦呢?是个天文数字!请你利用计算机计算,准确地说,到底是多少小麦。分析:实际上就是求:1 + 2 + 4 + 8 + …一共凑齐64项就行。注意,这个数字可能很大,但,py...原创 2019-10-22 14:54:22 · 7827 阅读 · 0 评论 -
python3 题解(33 人民币金额大写)
人民币金额大写【问题】把一个整数,转为人民币金额的大写形式。这个函数很有用,比如在开发票的时候,就需要输出人民币的金额大写。比如:1250030001转为:壹拾贰亿伍仟零叁万零壹分析:首先要找到汉语数字的读法规律。数字很大的时候,英文是每三位一组,给它起个名字。千,百万,十亿,…汉语则是每4位一组,给它起个名字。万,亿,万亿,亿亿,万亿,…至于每一组内,当然就是千百十个这样读的...原创 2019-10-21 11:44:04 · 403 阅读 · 0 评论 -
python3 题解(32 组合问题)
组合问题【问题】从ABCDE中取3个不同的字母,有多少种不同的取法。请列出每一种不同的取法来。分析:这个问题可以对结果集进行等价类划分。把所有的结果分为两类,一类是包含A的,一类是不包含A的。剩下的问题是不是就可以递归考虑了?def zu_he(s,n): if n == 0: return [""] if len(s) == n: return [s] r = zu_he(s[...原创 2019-10-21 11:30:42 · 292 阅读 · 0 评论 -
python3 题解(31 生成全排列)
生成全排列【问题】给定一个包含不同字母的串,求它的所有可能的排列。比如,给定"ABC",应该输出:ABCACBBACBCACABCBA分析:思路1—将所有这些全排列分类,开始的字母是什么?只可能是串中的某一个字母。从串中选取一个字母x,如果剩下的串的已经实现了全排列,则把x添在每一个排列前,就是结果的一部分。对其中所有的字母都这样处理…def pai_lie(x): i...原创 2019-10-16 15:13:47 · 521 阅读 · 0 评论 -
python3 题解(30 寻找小数循环节)
小数循环节【问题】我们在做小数除法时候,有的时候得到有限小数,有的时候得到无限循环小数。此题目要求你对给定的两个整数做除法,如果是有限小数,直接表达。如果是无限循环小数,用方括号标出它的循环节。例如,1/7:0.[142857]再例如,12345/1700:7.26[1764705882352941]分析:通过手算除法的过程,我们可以看出:下一位的商决定于当前的余数。只要当前的余...原创 2019-10-15 15:49:34 · 1747 阅读 · 0 评论 -
python3 题解(29 祖冲之割圆法求圆周率)
祖冲之割圆法【问题】我们可能都 听说过祖冲之用割圆法把圆周率计算到小数后7位。但具体是怎么操作的,可能就不太清楚了。其实从今天看来,原理很简单。圆的内接正多边形的周长,比较接近圆的周长。边数越多,越接近。如果已知了正 n 边形的边长,可如下图,把它变成正 2n 边形(每条边分裂为两条)。图中,红色为原来的边。蓝色为分裂后的新边。已知了半径,原来的边长,根据勾股定理,很容易求出蓝边的长...原创 2019-10-14 09:45:05 · 5975 阅读 · 2 评论 -
python3 题解(28 级数法求圆周率)
级数法求圆周率【问题】圆周率是十分重要的常数。它是个无理数,无法表示为有限小数的形式。但,我们可以表示它的近似值。可以用无穷级数去逼近它。π\piπ的级数公式十分多。下面给出3个较简单的:π26=112+122+132+... \frac{\pi^2}{6} = \frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} + ... 6π2=121+2...原创 2019-10-12 12:56:21 · 6267 阅读 · 0 评论 -
python3 题解(12)字母金字塔
字母金字塔【问题】在控制台上打印输出一个字母组成的金字塔。比如7层的塔如下:这问题应该有很多可行的解法。下面的解法强调的是:小函数风格。把每个函数做得足够小,功能足够单一。这样出现的错误好发现,将来好维护。更重要的是,小函数的组合会爆发出极强的灵活性。#已知当前行比如ABA,求下一行ABCBAdef ne(x): t = [chr(ord(i)+1) for i in x] ...原创 2019-09-12 10:13:12 · 1179 阅读 · 0 评论 -
python3 题解(11)打印金字塔
打印金字塔2【问题】在控制台上,打印用星号组成的金字塔。当 n = 10 的时候,效果如下:这与【问题10】有点类似。我不想仔细去计算,第 i 行的前边到底要补几个空格。下面提供两个思路:空格肯定是从很多一直到没有。每行差一个。星号从1个到n,每行差一个。知道这些信息就足够了。我们可以做两个列表,然后把它们 zip 起来。def ta(n): a = [ ' ' * i fo...原创 2019-09-11 11:44:50 · 349 阅读 · 0 评论 -
python3 题解(10)打印金字塔1
打印金字塔1【问题】用星号在控制台上输出一个金字塔的形状。 * *** ***** ******* ********* *********** ************* *************** ***************** *******************可以看...原创 2019-09-09 11:52:47 · 1157 阅读 · 0 评论 -
python3 题解(9)一年中的第几天
一年中的第几天【问题】给定年、月、日,求这一天是该年份中的第几天。这个问题的关键是算出一年中的每个月份有几天。因为有闰年,2月份,有的时候有28天,有的时候有29天。def daysInYear(year, month, day): isLeap = False if year % 4 == 0: isLeap = True if year % 100 == 0: isLeap = ...原创 2019-09-06 10:48:37 · 223 阅读 · 0 评论 -
python3 题解(8)水仙花数
水仙花数【问题】取一个三位数。如果它的每个位上的数字的立方和与自身相等,则称之为水仙花数。请编程求出所有的水仙花数。这个问题比较容易解。只要对每一个三位数进行实验,符合要求的就输出。def is_shui_xian(n): if n < 100 or n > 999: return False sum = 0 for i in str(n): sum += int(i...原创 2019-09-05 11:49:06 · 514 阅读 · 0 评论 -
python3 题解(7)杨辉三角
杨辉三角【问题】杨辉三角形(如下图)由许多有趣的性质,很多基础公式中可以看到它的影子。比如:(x+y)n(x+y)^n(x+y)n 的展开式的系数就是三角形的某一行。下一行的每个数字是上一行的两个数字之和。请编程输出 杨辉三角形的前 n 行。如果把三角形左对齐,其规律就十分明显了。下一行的第 i 个数 = 上一行的 第 i 个与 第 i-1 个数之和。对于在边缘的数字,上一行的 a[...原创 2019-09-04 12:07:31 · 434 阅读 · 0 评论 -
python3 题解(6)完全数
完全数【问题】如果一个正整数的所有因子的和是自身的2倍(也可以描述为:除了自身之外的因子之和正好等于自身),则称之为完全数。比如: 6, 28 就是前2个完全数。请找出10000以内的所有完全数。这个定义很容易理解,解法也很明显:从1开始向上搜索,每遇到一个因子,就累加起来。最后看看是不是符合条件。def is_wan_quan(n): sum = 0 for i in range(1...原创 2019-09-03 13:11:22 · 325 阅读 · 0 评论 -
python3 题解(5)分解质因数
分解质因数【问题】给定一个正整数,例如:90,求它的质因数乘积形式。90 = 2 * 3 * 3 * 5特别地,如果给定的是一个素数,则分解就是它自身。17 = 17这个问题很基础,也很重要。首先,从题面的意思看,是要检索所有的素数,看哪个能除尽给定的整数,则它就是因子,然后除掉这个因子,再继续这个过程。实际上,不必用素数来试除,从2开始,用整数依次试除就可以了。因为合数不可能有机会...原创 2019-09-02 11:10:21 · 1189 阅读 · 1 评论