初级编程通关练习题 #9 – 矩阵几字形遍历

给定一个NxN的矩阵,从左上角索引(0,0)开始遍历矩阵的数值,先后经过右上角(N-1,0),右下角(N-1,N-1),最后到左下角(N-1,0)结束遍历,要求按照这样的顺序一次遍历矩阵里所有的数值。譬如一个4x4的矩阵如下图,按照几字型来遍历,得到的数值列表为:[1,2,3,4,8,12,16,15,11,7,6,5,9,10,14,13]。 输入样例: matrix = [[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]] 输出样例: [1, 2, 3, 4,…

初级编程通关练习题 #8 – 超大数字幂运算

给定两个大数字A和B,求AB的个位数字。如果是普通数字,AB幂运算的个位数字就可以很容易计算出来:A ** B % 10。但是如果A和B都是超级大数字,这样的方法就不可行,譬如下面的例子: 数字 a 是 2200,数字 b 是 2300,这时如果直接计算 ab 是无法在普通电脑上得出结果的。需要采取更快捷的算法来得出两个超级大数字做幂运算后的个位数。 输入样例: A = 2200,B = 2300 输出样例: 6 算法思路: 无论 A 和 B 是多大的数字,幂运算后个位数只和 A 的个位数相关。检查数字1-9的2次幂运算到9次幂运算的结果,我们可以找到个位数出现的规律:…

初级编程通关练习题 #7 – 约瑟夫环

约瑟夫环问题是一个著名的倒数游戏,规则如下:给定N个游戏者,从第一个人开始计数,每K个人出局一人,继续从当前位置倒数,一直到最后剩下一个人为止。计算最后一个人在N个人中的位置。 譬如我们现在有八个人,每数三人就出局一人: [ 1,2,3,4,5,6,7,8 ] - 初始数列[ 1,2,4,5,6,7,8 ] => 3号出局[ 1,2,4,5,7,8 ] => 6号出局[ 2,4,5,7,8 ] => 1号出局[ 2,4,7,8 ] => 5号出局[ 4,7,8 ] => 2号出局[ 4,7 ] =>…

初级编程通关练习题 #6 – 斐波那契数列和DP算法

斐波那契数列中第N个数值的标准计算方式如下: def fibonacci(n): if n in [0, 1]: return n return fibonacci(n - 1) + fibonacci(n - 2) 上面的代码最大的缺陷是运行效率低下,因为存在太多重复计算。现在我们可以借助动态规划算法(Dynamic Programming)的两种方式Dp Tablulation 和 Dp Memoization 来改善上面代码的问题。 输入样例: N = 70 输出样例:…

初级编程通关练习题 #5 – 文本对齐

给定一个字符串和一个单行长度N(20 < N < 80),按照下面的规则来把字符串做自动换行和文本对齐。 每一行的头尾都需要是以单词开始和结束,也就是头尾对齐。单词之间使用空格来分隔。在不切割单词的情况下,每一行需要容纳尽可能多的单词。每一行使用换行符 '\n' 来表示该行结束,该换行符不算入每一行的长度。单词之间的空格数量差异不能大于1,也就是空格需要尽量平均分配。空格多的分隔需要放在前面,少的放在后面。譬如:”a---b---c--d--e\n“,'-'表示空格。最后一行不需要调整空格的数量,每个单词之间只需要一个空格。同时也不需要换行符'\n'。如果单行是一个单词则不需要空格。 下面的图案是一段文字按照每行30个字符来进行文本对齐后的结果: 输入样例: data = 'ABC EFG HI J', width = 8 输出样例: 'ABC EFG\nHI J' 算法思路: 方法一:使用递归算法,每次通过搜索空格来取单行最大数字符串来进行排版,一直到最后一行。方法二:使用for循环,每次也是取一行来做排版。单行排版时需要计算空格如何均匀分配,可以采用字符串函数 replace 来进行。

初级编程通关练习题 #4 – 寻找缺失数字

按照下面的格式给定一个仅包括加法符 +、减法符 - 和乘法符 * 的数学公式字符串: [数字] [操作符] [数字] = [数字] 算式中包括若干个问号?都代表同样的单个数字(0-9),而且该数字和算式中其他数字不重复。如果问号位于一个数字的首位,该问号不能为0。请找出符合要求的最小数字。譬如:"?*11=??",该问号是 2, 数字1已经存在,所以数字2是符合要求的最小值:2 * 11 = 22。 输入样例: "??*??=435?" 输出样例: 6 66 * 66 = 4356,所以问号代表的数字是 6。 算法思路: 要点:比较字符串算式是否成立,可以使用函数…

初级编程通关练习题 #3 – 数列区间

给定一组整数数列,返回用逗号分隔这些数字的字符串格式,如果有连续三个数字或以上的区间,则用 - 代替中间的数字,譬如 1,2,3,4 替换为 1-4。 输入样例: [-5, -3, -2, -1, 0, 3, 15, 16, 18, 19, 20, 21] 输出样例: "-5,-3-0,3,15,16,18-21" 算法思路: 可以使用两个指针 prev 和 curr,prev为区间头,curr为区间尾,根据当前数值来决定如何把 prev 和 curr格式成字符串。prev 和…

初级编程通关练习题 #2 – 时间格式

给定一个整数N代表秒数,把它按照下面的规则转换成时间字符串:如果秒数为零,则返回字符串"now"。如果秒数大于零,则返回用年、日、时、分、秒表达的时间字符串,中间用逗号分隔,最后两个时间段用 and 连接。譬如秒数 123456需要转换为:1 day, 10 hours, 17 minutes and 36 seconds。 输入样例: 987654321 输出样例: 31 years, 116 days, 4 hours, 25 minutes and 21 seconds 算法思路: 首先用每年的总秒数整除输入数值得到年数,然后用同样的总秒数mod输入数值得到剩余秒数。然后用每天的总秒数整除剩余秒数得到天数,再用这个总秒数mod剩余秒数得到下一步的剩余秒数。接着用同样的逻辑操作剩余秒数得到小时数、分钟数,最后剩下的就是秒数。根据上面计算出来的年数、天数、小时数、分钟数和秒数来格式化一个时间字符串并返回。

初级编程通关练习题 #1 – 矩阵回形遍历

给定一个NxN二维数组,返回从最外层元素到中间元素顺时针排列的数组元素,如下图所示。 上面这个5x5的矩阵,按照回形遍历的方法得到的结果为:1,2,3,4,5,10,15,20,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13。 输入样例: array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 输出样例: [1, 2, 3, 4, 8, 12, 16, 15,…