中级编程通关练习题 #10 – 递增数列

给定一个全部是数字的字符串,检查里面的数字是否包含一个递增数列。一个递增数列就是从第三个数字开始,每个数字都是前面两个数字之和。譬如,字符串 “123581321”里面就包含一个递增数列:1、2、3、5、8、13、21,因为 1+2 = 3, 2+3 = 5,5+8 = 13, 8+13 = 21。 输入样例: "230326294156250" 输出样例: True 上面的输入样例的数字可以分割成下面的数列:2,30,32,62,94,156,250。从第三个数字开始,每个数字都是前面两个数字相加之和。所以输出结果是 True。 算法思路: 可以采用递归回溯(backtrack)算法,从第三个数字开始检查,前面两个数字相加是否等于后面数字的开始数字。如果相等,则递归继续检查。如果不相等,则增加前面两个数字的长度,然后再次做检查。

中级编程通关练习题 #8 – 矩阵区域最大值

给定一个 MxN 的矩阵,里面的数值都是 1 和 0,一个有效区域是数值为 1 的位置上下左右连接而成。矩阵内部可能有多个有效区域,请找出区域最大的那一个。譬如下面的图案代表一个 12 x 7 的矩阵,黑色格子代表 0,黄色格子代表 1,矩阵里面总共有五个有效区域,最大的一个是8(八个黄色格子连接在一起)。 输入样例: matrix = [[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0,…

中级编程通关练习题 #7 – 有效IP地址组合

给定一个字符串里面都是数字,按照IP地址的格式来进行分隔,找出所有合法的点分十进制IP地址组合。 IP地址由32位二进制数组成,为便于使用,常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数,该表示方法称为点分十进制。 例如 CodeGuru.Academy的IP地址是: 162.241.244.103。更多关于IP地址的信息,可以查看维基百科https://zh.wikipedia.org/wiki/IP%E5%9C%B0%E5%9D%80。 输入样例: "1010235" 输出样例: ['1.0.10.235', '1.0.102.35', '10.1.0.235', '10.10.2.35', '10.10.23.5', '10.102.3.5', '101.0.2.35', '101.0.23.5'] 上面的输入样例字符串"1010235",总共可以分隔为八个不同的有效IP地址。 算法思路: 首先需要定义一个函数来检查一个点分十进制是否是合法的IP地址。然后可以采用下面两种方法来进行字符串分隔:方法一:使用递归函数进行深度优先搜索方法二:多重内嵌for循环来穷举所有的可能,并逐一检查

中级编程通关练习题 #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循环,用数据结构栈来记录每次找到的位置和相关数字选择,如果发现有找不到可填数字的位置,和方法一一样需要回退,从栈顶弹出上一个位置的信息重新进行填写。

初级编程通关练习题 #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 ] =>…

初级编程通关练习题 #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 来进行。