中级编程通关练习题 #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,…

初级编程通关练习题 #17 – 数组合并区间

给定一个数组,里面的每个元素都是一个区间,即两个数值组成的子数组,第一个数值代表区间低值,第二个数值代表区间高值。实现一个函数检查数组里面的每一个区间,如果两个区间有重合的部分则合并为一个区间,返回合并后的区间列表。 输入样例: array = [[-2, 3], [10, 13], [2, 5], [7, 10], [15, 17]] 输出样例: [[-2, 5], [7, 13], [15, 17]] 算法思路: 首先将数组按照区间的低值由小到大排序从第二个区间开始,检查每一个区间的低值和它前面的区间的高值是否有重合如果有重合则合并两个区间,如果没有重合则把该区间添加到返回列表中。

初级编程通关练习题 #16 – 面积最大值

给定一组整数数组,数组里的每一个数值都代表长方形的边长,另外一边的边长为数值之间的距离(每个数值和相邻数值之间的距离都为 1)请找出该长方形的最大面积。 输入样例: [6, 16, 9, 12, 16, 7, 13, 10, 15, 17] 输出样例: 128 在上面的输入样例中,面积最大值为第二个数值16到最后数值17之间的区域,如下图所示。两个数值之间的距离为8,16 x 8 = 128。 算法思路: 需要准备两个指针,一个从头往后移动,另外一个从尾往前移动。每次移动指针时检查当前指针指向的两个数值所组成的面积,如果比已经找到的最大值要大,则替换最大值。每次只能移动两个指针其中的一个,当前数值最大的那个指针保持不动,移动另外一个指针。每次移动指针后,需要再次比较两个数值来决定下次移动哪一个指针。

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

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

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

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