剑指offer刷题
一大碗恩希玛
这个作者很懒,什么都没留下…
展开
-
24: 反转链表
输入一链表头节点,输出反转后的链表头节点原创 2020-02-11 16:49:16 · 100 阅读 · 0 评论 -
19: 正则表达式的匹配
实现一个函数,用来匹配包含. 和*的正则表达式匹配。.匹配任意一个字符 ,而* 表示当前字符的0次或多次原创 2019-04-20 15:16:40 · 194 阅读 · 0 评论 -
21: 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分原创 2019-04-20 15:22:27 · 92 阅读 · 0 评论 -
22: 链表中的倒数第k个节点
输出链表的倒数第k个节点 (链表的尾节点是倒数第1个节点)原创 2019-04-20 15:24:55 · 88 阅读 · 0 评论 -
23: 链表中环的入口节点
如果一个链表中包含环,找出环的入口节点原创 2019-04-20 15:27:06 · 108 阅读 · 0 评论 -
25: 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。原创 2019-04-20 15:29:36 · 114 阅读 · 0 评论 -
27:二叉树的镜像
输入一棵二叉树,输出它的镜像首先想到的是,可以用递归来完成递归到一个节点时,交换左右子树位置,再分别对左右子树操作原创 2019-05-07 09:17:54 · 80 阅读 · 0 评论 -
28:对称的二叉树
判断一棵二叉树是否是对称的。如果一课二叉树和它的镜像是一样的,那么就是对称的。原创 2019-05-11 12:25:06 · 140 阅读 · 0 评论 -
26: 树的子结构
输入两棵二叉树A, B,判断B是不是A的子结构原创 2019-05-07 09:15:25 · 93 阅读 · 0 评论 -
4: 替换空格
首先计算空格数量 spaceNum, 再增加StringBuffer长度, 注意要 * 2 不是 *3之后双指针遍历字符串数组 public static String replaceSpace(StringBuffer str) { int spaceNum = 0; for (int i = 0; i < str.length(); i++) { ...原创 2019-07-13 22:12:28 · 112 阅读 · 0 评论 -
18: O(1)时间下删除链表的节点
O(1)删除链表中的节点给出一个链表的节点,要求 O(1) 时间复杂度下在链表中删除该节点要分三种情况toBeDeleted 是头节点,更改head = head.next;toBeDeleted 是尾节点,此时要遍历找到尾节点的前驱节点pre, 让pre = nulltoBeDelted 是中间节点,复制 pre 到toBeDeleted, 越过pre指向pre.next这样...原创 2019-04-20 09:53:27 · 120 阅读 · 0 评论 -
24: 单链表反转
反转链表,输出反转后的链表头节点基本思路是依次改变指针指向,注意只有头结点的处理,以及遇到尾节点的处理。public static Node reverse(Node head) { if (head == null) return null; Node curr = head; Node pre = null; Node next = n...原创 2019-04-23 21:20:37 · 118 阅读 · 0 评论 -
17: 打印从1到最大的n位数
按顺序打印从1到最大的n位十进制数按照回溯法,树根是最高位,树叶是最低位。递归方式解决问题时,脑中要模拟好递归树。public static void print(int n) { if ( n <= 0) return; char[] number = new char[n]; print1ToMax(number, 0);}//digit代表位数p...原创 2019-04-18 20:16:58 · 135 阅读 · 0 评论 -
面试题9:用两个栈实现队列
描述:用两个栈实现一个队列。队列的声明如下,请实现他的两个函数 enqueue() 和 dequeue.思路:由于栈先进后出,队列先进先出的性质,一段数据先进入A栈,之后出A栈进B栈,再从B栈弹出的顺序就是先进先出enqueue时(直接用java集合不用判断满不满)dequeue时,判断B栈如果空,则把A栈所有数据入B栈。 如果A栈空,则队空public Stack<Int...原创 2019-03-29 14:54:39 · 176 阅读 · 0 评论 -
面试题4:二维数组中的查找
描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。输入一个二维数组和一个数val,判断数组中是否包含这个数思路:从右上角开始查找:如果右上角的值arr小于val,则表示arr左边的数都小于val,缩小查找范围,行数+1,继续寻找;如果右上角的值arr大于val,则表示arr所在的列都大于val,所有范围,列数-1,继续寻找;如果一直找不到,...原创 2019-03-29 18:22:31 · 103 阅读 · 0 评论 -
3:找出数组中重复的数字
3. 找出数组中重复的数字在一个长度为 n 的数组里的所有数字都在 0 到 n-1 范围内,其中某些数字是重复的。但不知道有几个数字重复,也不知道每个数字重复几次。找出数组中任意一个重复的数字首先,可以考虑用HashSet来保存数字,时间复杂度O(n), 空间复杂度O(n)注意到数字范围特特性,和题目中的任意一个重复的数字如果无重复,数字可以按照顺序存储的(基数),如果重复,存储过程中...原创 2019-04-07 19:18:26 · 145 阅读 · 0 评论 -
面试题7:重建二叉树
给定某二叉树的前序遍历和中序遍历结果,重建该二叉树(不含重复的数字)例如:pre = {1, 2, 4, 7, 3, 5, 6, 8}in = {4, 2, 7, 1 ,5 ,3, 8, 6}思路:在前序遍历中,第一个数据1是根节点,而在中序遍历中,1左边的3个数据为左子树,右边的4个数据为右子树,因此,在先序遍历中1后边的3个数据为左子树,再向后数4个为右子树。这样可以根据左右子树...原创 2019-03-28 21:50:02 · 247 阅读 · 0 评论 -
11:旋转数组的最小数字
描述:什么是旋转数组?把一个数组最开始的 k 个元素搬移到后面。 例如 1,2,3,4 搬移1,2 之后是 3, 4, 1, 2要求输入一个增序数组的任意旋转,输出最小的元素思路1:顺序查找 O(n)思路2:注意到两个子数组的有序的特性,即第二个数组永远小于第一个数组的最小值,可以使用二分法来定位两个数组之前的分界点当arr[m] > arr[r] 时,arr[m]在左...原创 2019-04-08 14:03:38 · 89 阅读 · 0 评论 -
面试题10:斐波那契数列
f(0) = 0f(1) = 1f(n) = f(n-1) + f(n-2) , n >= 2递归求解public static long fib(int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n - 1) + fib(n - 2);}为什么说递归不好呢?递归是借助系统调用栈来实现,每...原创 2019-04-02 18:24:24 · 201 阅读 · 0 评论 -
12:矩阵中的路径
判断在一个矩阵中是否存在一条路径,该路径包含一个字符串的所有字符路径可以从矩阵中的任意一格开始,每一步可以向上下左右移动。路径中的格不允许重复.首先可以遍历矩阵找到第一个字符的位置,之后以第一个字符开始,依次向上下左右定位下一个字符的位置。如果定位失败,就回退到上一位置,继续遍历。 辅助矩阵visited 保存矩阵中的点是否被访问 public static boolean has...原创 2019-04-11 22:18:25 · 99 阅读 · 0 评论 -
13:机器人的运动范围
有一个m行n列的方格,一个机器人从坐标(0 ,0) 的格子开始移动,它每次可以向上下左右移动一格,但不能进入坐标位数和大于threshold的格子,求机器人一共能到达多少个格子机器人从(0, 0)开始移动,当要移动到(i, j) 时,先判断i, j是否满足条件,如果满足,就进入,递归执行。如果不满足,尝试其他相邻的格子。 需要一个辅助数组visited[][] 来记录移动的踪迹public...原创 2019-04-11 22:53:10 · 78 阅读 · 0 评论 -
15:二进制中1的个数
求一个整数 n 中,二进制表示中1的个数n & 1, 先判断 n 中最后一位是不是1,再将 n 右移一位,继续判断。注意到在 java 中,int数据类型固定为 32 位,可以循环判断 32 次,避免负数情况下的死循环public static int numberOf1(int n) { int count = 0; int c = 32; while...原创 2019-04-15 16:31:38 · 112 阅读 · 0 评论 -
16: 数值的整数次方
实现函数 pow(double base, int exponent)常规的思路是,循环相乘,虽然简单,也有几个要注意的地方0 的负数次方是错误的输入参数,因为负数次幂是借助除法算出,0 不能作为分母非0数的负数次幂是,先求正数次幂,再取倒数。0 的 0 次方是无意义的 (处理 or 不处理)而循环相乘的部分可以优化,a^n = a^(n/2) * a^(n/2) n为偶数a...原创 2019-04-17 20:50:33 · 107 阅读 · 0 评论 -
14:剪绳子
f(n) 为把长度为 n 的一段绳子剪成若干段后(不能不剪),各段长度乘积的最大值,求 f(n)在剪第一刀的时候,可以将绳子分为 i 和 n-i 的两段,遍历所有情况,找出 max(f(i)*f(n-i)) ,这个值就是f(n) 而最优解f(n) 又依赖于子问题 f(i) 和 f(n-i) 的最优解,子问题之间又包括大量的重复部分,所以要从下到上解决这个问题,保存子问题的解,为上层问题提供解...原创 2019-04-15 14:55:50 · 103 阅读 · 0 评论 -
面试题8:二叉树的下一个节点
描述:给定一课二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了包含指向左右子树的指针,还有一个指向父节点的指针。思路:中序遍历的顺序是 左->中->右如果该节点有右子树,则下一个节点为右子树的最左节点 while (root.left != null) {root = root.left如果该节点无右子树为父节点的左孩子,return父节点为父...原创 2019-03-29 14:36:51 · 120 阅读 · 0 评论