《剑指offer-day1》
"Being angry never solves anything."- Catherine Pulsifer
11.链表中倒数第K个结点
输入一个链表,输出该链表中倒数第k个结点。
用Python规避了很多东西,所有总感觉有点作弊的样子,这里方法一:使用的python标准解法。方法二:使用的类似于C语言中指针的方法来解决
方法一:
方法二:
利用两个指针,一个指针先跑K步,然后另一个指针再跑,(技术不行,有点问题)
2.反转链表
****
输入一个链表,反转链表后,输出新链表的表头。
方法如下:
主要是一个保存实力的结点,然后一个继续前进
13.合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
方法如下:
顺便说一下:这种东西在这里调试非常痛苦,所以我们可以选择自己构建出链表。通过以下方法:
14.二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。。
方法如下:
直接交换左右子树即可
主要在于边界条件的判断
15.旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组为的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法如下:
直接利用min返回最小值即可。(显然题目不是要我们这样玩的。)
先找到最小值对应的索引,然后通过切片将最小值前面放到后面去,输出重新组合的列表的首项即可。
16.顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
方法如下:
想的用递归的方法因为第一次完成顺时针跟第二次完成顺时针操作只是矩阵的大小不同
主要在于二维列表的切片,如果不使用numpy、pandas等包的话。可用以下代码实现:
在py3.x上测试没有出现问题,在py2.7[[1,2],[3,4]]就出现了问题,不知道原因
17.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
方法如下:
反正都是一些列表的相关操作
18.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
方法如下:
借用一个辅助的栈,遍历压栈顺序
先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等
这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
19.二叉搜索树的后序遍历序列
****
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
方法如下:
后序遍历的序列中,最后一个数字是树的根节点,数组中前面的数字可以分为两部分:第一部分是左子树节点的值,都比根节点的值小;第二部分是右子树节点的值,都比根节点的值大,后面用递归分别判断前后两部分是否符合以上原则
10.二叉树中某一和为某值的路径
****
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
方法如下:
主要是递归,要变化的东西必须写在函数输入变量中去。
类似于动态规划的写法
领取专属 10元无门槛券
私享最新 技术干货