中级编程通关练习题 #11 – 数列中值

给定两个已经从小到大排好序的整数数列 A 和 B,长度分别为 a 和 b。在时间复杂度为 O (log (a+b)) 的前提下,找出两个数列的中间值。也就是两个数列各自都只能遍历一次,找出它们的中值。所谓中值是指位置在两个数列中间的数值,如果 a+b的长度是9,那么中值就是两个数列合并后第五位置的数值,如果a+b的长度是10,那么中值就是第五和第六两个位置之和的一半。 输入样例: A = [3, 5, 7, 9, 11] B = [4, 6, 8, 10, 12] 输出样例: 7.5 在上面的输入样例中,两个数列合并后的数列是:[3,…

中级编程通关练习题 #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循环来穷举所有的可能,并逐一检查

中级编程通关练习题 #6 – 二进制操作符做加法

给定两个正整数 a 和 b,使用二进制操作符而不是加法操作符来计算它们的和。 输入样例: a = 105,b = 201 输出样例: 306 算法思路: 方法一:从低位到高位逐一计算每个bit相加之后的结果。当两个bit都是1时,使用 & 操作符可以得到进位bit值。否则,使用 ^ 操作符可以得到两个bit的和。进位bit的值使用左移操作符<<可以继续和下一个bit来计算。方法二:使用^ 操作符得到两位数值不包含同位bit都是1的相加之和 A。使用& 操作符加左移操作符<<得到进位数值 B。如果进位数值B为零,则返回前面的相加之和A,否则用A和B重复上述操作,直到B为零。

中级编程通关练习题 #5 – 二项展开式

给定一个字符串包含数学算式(ax + b)^ n,a 和 b都是整数,n 为正整数。实现一个函数把它做二项式展开。譬如,字符串"(-2x-3)^5" 做二项式展开后的结果是: -32x^5-240x^4-720x^3-1080x^2-810x-243。 输入样例: "(-3y+5)^7" 输出样例: -2187y^7+25515y^6-127575y^5+354375y^4-590625y^3+590625y^2-328125y+78125 算法思路: 首先使用正则表达式把字符串中需要的数值和数学符合提取出来然后按照二项式的计算公式将它展开,注意下面的特殊情况如果 n 是 0,那么返回值是 1如果 n 是 1, 那么返回值是 ax + b如果 b 是 0, 那么返回值是…

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