剑指Offer
文章平均质量分 82
weixin_44460781
这个作者很懒,什么都没留下…
展开
-
刷 HOT100
4.寻找两个正序数组的中位数5.最长回文子串动态规划回文天然具有「状态转移」性质:一个长度严格大于 2 的回文去掉头尾字符以后,剩下的部分依然是回文。反之,如果一个字符串头尾两个字符都不相等,那么这个字符串一定不是回文。1.状态定义dp[i][j] 表示:子串 s[i…j] 是否为回文子串,这里子串 s[i…j] 定义为左闭右闭区间,即可以取到 s[i] 和 s[j]2.状态转移方程dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]如dp[0原创 2021-04-08 16:07:47 · 93 阅读 · 0 评论 -
剑指还是不会的题
13、17、原创 2021-03-24 11:01:36 · 60 阅读 · 0 评论 -
面试题68-Ⅰ、68-Ⅱ
面试题68-Ⅰ.二叉搜索树的最近公共祖先最近公共祖先的定义:设节点 root 为节点 p、q 的某公共祖先,若其左子节点 root.left 和右子节点 root.right 都不是 p、q 的公共祖先,则称 root 是最近的公共祖先根据以上定义,若 root 是 p、q 的最近公共祖先,则只可能为以下情况之一:1、p 和 q 在 root 的子树中,且分列 root 的异侧(即分别在左、右子树中);2、p = root,且 q 在 root 的左或右子树中;3、q = root,且 p 在原创 2021-03-22 10:24:38 · 53 阅读 · 0 评论 -
面试题64、65、66、67
面试题64.求1+2+…+n本题使用暴力法和迭代法都必须借助乘除或者条件判断语句,所以这两种方法都不可取。那如果使用递归,有没有除了 if 等判断语句之外的其他方法来终止递归?Java 中,为构成语句,需加一个辅助布尔量 x ,否则会报错;Java 中,开启递归函数需改写为 sumNums(n - 1) > 0 ,此整体作为一个布尔量输出,否则会报错;class Solution { int res = 0; public int sumNums(int n) {原创 2021-03-21 13:56:42 · 214 阅读 · 0 评论 -
面试题60、61、62、63
面试题60.n个骰子的点数动态规划1、状态定义分析问题的状态时,不要分析整体,只分析最后一个阶段即可!因为动态规划问题都是划分为多个阶段的,各个阶段的状态表示都是一样,而我们的最终答案在就是在最后一个阶段。通过题目我们知道一共投掷 n 枚骰子,那最后一个阶段很显然就是:当投掷完 n 枚骰子后,各个点数出现的次数。注意,这里的点数指的是前 n 枚骰子的点数和,而不是第 n 枚骰子的点数,下文同理。找出了最后一个阶段,那状态表示就简单了。首先用数组的第一维来表示阶段,也就是投掷完了几枚骰原创 2021-03-20 14:42:10 · 95 阅读 · 0 评论 -
面试题58-Ⅰ、58-Ⅱ、59-Ⅰ、59-Ⅱ
面试题58-Ⅰ.翻转单词顺序双指针倒序遍历字符串 s ,记录单词左右索引边界 i , j ;每确定一个单词的边界,则将其添加至单词列表 res ;最终,将单词列表拼接为字符串,并返回即可。class Solution { public String reverseWords(String s) { s = s.trim(); //删除首尾空格 int i = s.length() - 1, j = i; StringBuilder res原创 2021-03-19 12:52:12 · 67 阅读 · 0 评论 -
面试题56-Ⅰ、面试题56-Ⅱ、57-Ⅰ、57-Ⅱ
面试题56-Ⅰ.数组中数字出现的次数设整型数组 nums 中出现一次的数字为 x ,出现两次的数字为 a, a, b, b, …,即:nums = [a, a, b, b, …, x]异或运算有个重要的性质,两个相同数字异或为 0 ,即对于任意整数 a 有 a⊕a=0 。因此,若将 nums 中所有数字执行异或运算,留下的结果则为 出现一次的数字 x ,即:a ⊕ a ⊕ b ⊕ b ⊕ … ⊕ x = 0 ⊕ 0 ⊕ … ⊕ x = x由于数组中存在着两个数字不重复的情况,我们将所有的数字异或原创 2021-03-18 10:36:09 · 49 阅读 · 0 评论 -
面试题53、54、55-Ⅰ、55-Ⅱ
面试题53-Ⅱ.0~n-1中缺失的数字根据题意,数组可以按照以下规则划分为两部分。左子数组: nums[i] = i;右子数组: nums[i] ≠ i;缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素” 。class Solution { public int missingNumber(int[] nums) { if(nums.length < 1) return -1; int i = 0, j原创 2021-03-17 11:00:55 · 56 阅读 · 0 评论 -
面试题38、39、40、41
面试题38.字符串的排列原创 2021-03-16 15:46:12 · 83 阅读 · 0 评论 -
面试题50、51、52、53-Ⅰ
面试题50.第一次只出现一次的字符方法一:哈希表遍历字符串,记录个字符数量是否 > 1,若为1,则 value 值为true,若大于1,则 value 值为 falseclass Solution { public char firstUniqChar(String s) { Map<Character, Integer> map = new HashMap<>(); char[] sc = s.toCharArray(); for(char c原创 2021-03-16 13:23:52 · 64 阅读 · 0 评论 -
面试题46、47、48、49
面试题46.把数字翻译成字符串本题使用动态规划1、状态定义:设动态规划列表 dp,dp[i] 代表以 xi 为结尾的数字的翻译方案数量2、状态转移方程:若 xi 和 xi-1 组成的两位数字可以被翻译,则 dp[i] = dp[i-1] + dp[i-2];否则 dp[i] = dp[i-1]。可被翻译的两位数:当 xi-1 = 0,组成的两位数是无法被翻译的(例如 00, 01, 02,⋯ ),因此区间为 [10, 25]。3、初始状态:dp[0] = dp[1] = 1,即无数字和第原创 2021-03-15 11:26:46 · 98 阅读 · 0 评论 -
面试题42、43、44、45
面试题42.连续子数组的最大和原创 2021-03-14 14:53:28 · 53 阅读 · 0 评论 -
面试题34、35、36、37
面试题34.二叉树中和为某一值的路径/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/public class Solution { List<List<Integer>> res; Deque<Integer> path;原创 2021-03-12 15:22:58 · 71 阅读 · 0 评论 -
面试题32、32-Ⅱ、32-Ⅲ、33
面试题32.从上到下打印二叉树二叉树的从上至下打印(即按层打印),又称为二叉树的 广度优先搜索class Solution { public int[] levelOrder(TreeNode root) { if(root == null) return new int[0]; Queue<TreeNode> queue = new LinkedList<>(); List<Integer> list = new ArrayList<&g原创 2021-03-12 09:25:14 · 94 阅读 · 0 评论 -
面试题28、29、30、31
面试题28.对称的二叉树递归对于二叉树定义,一定有:L.val = R.val:即此两对称节点值相等L.left.val = R.right.val:即 L 的左子节点和 R 的右子节点对称L.right.val = R.left.val:即 L 的右子节点和 R 的左子节点对称根据以上规律,考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树class Solution { public boolean isSymmetric(TreeNode root) {原创 2021-03-11 11:05:57 · 100 阅读 · 0 评论 -
面试题24、25、26、27
面试题24.反转链表双指针迭代定义两个指针,pre 和 cur,pre 在前 cur 在后定义一个暂存节点 temp,存放 pre 的下一个节点每次让 pre 的 next 指向 cur,实现一次局部反转局部反转完成后,pre 和 cur 同时向前移动一个位置循环上述过程,直至 pre 到达链表尾部class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.原创 2021-03-10 13:12:59 · 52 阅读 · 0 评论 -
面试题20、21、22、23
面试题20.表示数值的字符串有限状态自动机起初,这个自动机处于「初始状态」。随后,它顺序地读取字符串中的每一个字符,并根据当前状态和读入的字符,按照某个事先约定好的「转移规则」,从当前状态转移到下一个状态;当状态转移完成后,它就读取下一个字符。当字符串全部读取完毕后,如果自动机处于某个「接受状态」,则判定该字符串「被接受」;否则,判定该字符串「被拒绝」。用「当前处理到字符串的哪个部分」当作状态的表述,则本题目的所有状态:0.起始的空格1.符号位,如 +/-2.整数部分3.左侧有整数的小数点原创 2021-03-09 13:49:31 · 83 阅读 · 0 评论 -
面试题16、17、18、19
面试题16.数值的整数次方二分法推导:xn = xn/2 × xn/2 = (x2)n/2 ,令 n/2 为整数,则需要分为奇偶两种情况:当 n 为偶数:xn = (x2)n/2 ;当 n 为奇数:xn = x(x2)n/2 ,即会多出一项 x;幂结果获取:根据推导,可通过循环 x = x2 操作,每次把幂从 n 降至 n/2,直至将幂降为 0;设 res = 1,则初始状态 xn = xn × res。在循环二分时,每当 n 为奇数时,将多出的一项 x 乘入 res,则最终可化至原创 2021-03-09 10:19:59 · 222 阅读 · 0 评论 -
面试题12、13、14、15
面试题12.矩阵中的路径本题使用回溯算法。DFS:通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推剪枝:在搜索中,遇到这条路不可能和目标字符串匹配成功的情况(例如:此矩阵元素和目标字符不同、此元素已被访问过),则应立即返回。递归参数:当前元素在矩阵 board 中的行列索引 i 和 j,当前目标字符word中的索引 k终止条件:1.返回false:(1)行或列索引越界;(2)当前矩阵元素与目标字符不同;(3)当前矩阵元素已访问过;2.返回true:原创 2021-03-07 17:39:24 · 81 阅读 · 0 评论 -
面试题8、9、10、11
面试题8.二叉树的下一个节点题目描述:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并返回。注意,树中的节点不仅包括左右子节点,同时包含指向父节点的指针。1、暴力法可以先依据已给的节点找到根节点,再对根节点所在的树进行中序遍历,最后根据中序遍历结果找到给定节点的下一节点/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null;原创 2021-03-05 17:41:56 · 37 阅读 · 0 评论 -
面试题4、5、6、7
面试题4:二维数组中的查找以 matrix 中的左下角元素为标志数 flag,则有:若 flag > target,则 target 一定在 flag 所在行的上方,即 flag 所在行可被消去。若 flag < target,则 target 一定在 flag 所在列的右方,即 flag 所在列可被消去。class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) {原创 2021-03-05 13:49:46 · 72 阅读 · 1 评论 -
面试题3:数组中的重复数字
1).找出数组中重复的数字题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。排序法class Solution { public int findRepeatNumber(int[] nums) { Arrays.sort(nums); for(int i = 0; i < nums.length - 1; i++) { if(nums[i原创 2021-03-04 13:56:02 · 116 阅读 · 1 评论 -
面试题2:实现单例模式
题目:设计一个类,只能生成该类的一个实例。单例模式分为懒汉式(需要才去创建对象)和饿汉式(创建类的实例时就去创建对象)饿汉式属性实例化对象public class HugerSingletonTest { //该对象的引用不可修改 private static final HugerSingletonTest ourInstance = new HugerSingletonTest(); public static HugerSingletonTest getInstance() {转载 2021-03-04 11:07:18 · 80 阅读 · 1 评论