初级编程通关练习题 #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次幂运算的结果,我们可以找到个位数出现的规律:…

中级编程通关练习题 #4 – 字符串排列寻址

给定一个全部是大写字母的字符串,计算在该字符串的所有字母所组成的全部排列序列中,当前字符串按照字母顺序所处的位置。譬如:字符串 CODE 四个字母总共可能的排列总数为 4!= 24,按照字母顺序来计算,CODE位于第五位,在CODE之前的四个排列分别是:CDEO,CDOE,CEDO 和 CEOD。 最简单的计算方法是使用函数 permutations来把当前字符串所有可能的排列都找出来,然后寻址就可以得到结果,下面是代码样例: 上面这个方法的缺陷是效率低下,如果字符串的长度超过15个就会非常耗时,如果长度达到25个基本上电脑就要宕机。主要原因是函数permutations在搜索大量排列的场景下极其耗时,字符串长度增加一个,相对应的运算时间呈指数级增长。 所以我们需要采用其他方法来为字符串的排列寻址,要求是字符串长度在25位以内时,寻址的时间不能超过0.5秒。 输入样例: word = 'CODEGURUACADEMY' 输出样例: 9066420841 算法思路: 方法一:循环字符串正推 - 上面的输入样例字符串分拆然后按照字母排序后的列表是:['A', 'A', 'C', 'C', 'D', 'D', 'E', 'E', 'G', 'M',…

中级编程通关练习题 #3 – Sudoku 数独九宫格游戏

数独九宫格(Sudoku)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。下图是一个数独的范例,图片来自Wikipedia。 实现一个函数来自动解决Sudoku的问题。函数的参数是一个9x9的二维数组,数字零代表未知数。 输入样例: puzzle = [[5,3,0,0,7,0,0,0,0], [6,0,0,1,9,5,0,0,0], [0,9,8,0,0,0,0,6,0], [8,0,0,0,6,0,0,0,3], [4,0,0,8,0,3,0,0,1], [7,0,0,0,2,0,0,0,6], [0,6,0,0,0,0,2,8,0], [0,0,0,4,1,9,0,0,5], [0,0,0,0,8,0,0,7,9]] 输出样例: [[5,3,4,6,7,8,9,1,2], [6,7,2,1,9,5,3,4,8], [1,9,8,3,4,2,5,6,7], [8,5,9,7,6,1,4,2,3], [4,2,6,8,5,3,7,9,1], [7,1,3,9,2,4,8,5,6], [9,6,1,5,3,7,2,8,4], [2,8,7,4,1,9,6,3,5], [3,4,5,2,8,6,1,7,9]] 算法思路: 方法一:采用递归算法中的backtrack方法,从九宫格中寻找数字选择最少的一个位置开始填数字,每填一个数字后重复寻找下一个选择最少的位置,如果发现没有数字可选的位置则说明需要回退到上一个有多个选择的位置重新开始。如此反复进行一直到整个九宫格都填满为止。方法二:采用while循环加for循环,用数据结构栈来记录每次找到的位置和相关数字选择,如果发现有找不到可填数字的位置,和方法一一样需要回退,从栈顶弹出上一个位置的信息重新进行填写。

入门级编程通关练习题 #17 – 字符串操作

给定一个字符串,根据下面的规则创建一个新的字符串:如果该字符串的结尾是数字,则把当前数字加一;如果结尾不是数字,那么把数字1添加到结尾。 输入样例: codeguru099 输出样例: codeguru100 算法思路: 方法一:可以借助正则表达式(regular expression)来匹配字符串结尾的数字,然后做修改。方法二:可以使用字符串函数 str.rstrip()来把结尾的数字剥离,然后做处理。

初级编程通关练习题 #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。 算法思路: 要点:比较字符串算式是否成立,可以使用函数…