- 博客(126)
- 资源 (1)
- 收藏
- 关注
原创 刷 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
124
原创 HashMap原理
Q0:HashMap是如何定位下标的?A:先获取Key,然后对Key进行hash,获取一个hash值,然后用hash值对HashMap的容量进行取余,实际上不是真的取余 (取余可能会造成重复),而是使用按位与操作,原因参考Q6,最后得到下标。Q1:HashMap由什么组成?A:数组+单链表,key 和对应的 value 为 entry 对象的属性,一组键值对为一个 entry 对象,再存储到数组中。jdk1.8以后又加了红黑树,当链表节点个数超过8个(m默认值)以后,开始使用红黑树,使用红黑树一个综
2021-03-29 17:44:01
89
原创 面试题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
70
原创 面试题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
236
原创 面试题60、61、62、63
面试题60.n个骰子的点数动态规划1、状态定义分析问题的状态时,不要分析整体,只分析最后一个阶段即可!因为动态规划问题都是划分为多个阶段的,各个阶段的状态表示都是一样,而我们的最终答案在就是在最后一个阶段。通过题目我们知道一共投掷 n 枚骰子,那最后一个阶段很显然就是:当投掷完 n 枚骰子后,各个点数出现的次数。注意,这里的点数指的是前 n 枚骰子的点数和,而不是第 n 枚骰子的点数,下文同理。找出了最后一个阶段,那状态表示就简单了。首先用数组的第一维来表示阶段,也就是投掷完了几枚骰
2021-03-20 14:42:10
107
原创 面试题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
91
原创 面试题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
60
原创 面试题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
74
原创 面试题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
71
原创 面试题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
105
原创 面试题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
77
原创 面试题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
101
原创 面试题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
114
原创 面试题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
60
原创 面试题20、21、22、23
面试题20.表示数值的字符串有限状态自动机起初,这个自动机处于「初始状态」。随后,它顺序地读取字符串中的每一个字符,并根据当前状态和读入的字符,按照某个事先约定好的「转移规则」,从当前状态转移到下一个状态;当状态转移完成后,它就读取下一个字符。当字符串全部读取完毕后,如果自动机处于某个「接受状态」,则判定该字符串「被接受」;否则,判定该字符串「被拒绝」。用「当前处理到字符串的哪个部分」当作状态的表述,则本题目的所有状态:0.起始的空格1.符号位,如 +/-2.整数部分3.左侧有整数的小数点
2021-03-09 13:49:31
91
原创 面试题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
251
原创 面试题12、13、14、15
面试题12.矩阵中的路径本题使用回溯算法。DFS:通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推剪枝:在搜索中,遇到这条路不可能和目标字符串匹配成功的情况(例如:此矩阵元素和目标字符不同、此元素已被访问过),则应立即返回。递归参数:当前元素在矩阵 board 中的行列索引 i 和 j,当前目标字符word中的索引 k终止条件:1.返回false:(1)行或列索引越界;(2)当前矩阵元素与目标字符不同;(3)当前矩阵元素已访问过;2.返回true:
2021-03-07 17:39:24
89
原创 面试题8、9、10、11
面试题8.二叉树的下一个节点题目描述:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并返回。注意,树中的节点不仅包括左右子节点,同时包含指向父节点的指针。1、暴力法可以先依据已给的节点找到根节点,再对根节点所在的树进行中序遍历,最后根据中序遍历结果找到给定节点的下一节点/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null;
2021-03-05 17:41:56
47
原创 面试题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
100
1
原创 2021.3.3 每日复习 139.单词拆分(动态规划)+ 142.环形链表II(双指针)
139.单词拆分(动态规划)142.环形链表II(双指针)
2021-03-04 17:34:25
37
原创 面试题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
157
1
转载 面试题2:实现单例模式
题目:设计一个类,只能生成该类的一个实例。单例模式分为懒汉式(需要才去创建对象)和饿汉式(创建类的实例时就去创建对象)饿汉式属性实例化对象public class HugerSingletonTest { //该对象的引用不可修改 private static final HugerSingletonTest ourInstance = new HugerSingletonTest(); public static HugerSingletonTest getInstance() {
2021-03-04 11:07:18
87
1
原创 2021.3.2 每日复习 137.只出现一次的数字II(位运算)+ 138.复制带随机指针的链表(指针法 + HashMap)
137.只出现依次的数字II(位运算)138.复制带随机指针的链表(指针法 + HashMap)
2021-03-03 13:15:56
33
原创 动态规划
1.最长回文子串分析一个回文去掉两头以后,剩下的部分依然是回文如果一个字符串的头尾两个字符都不相等,则这个字符串一定不是回文串;如果一个字符串的头尾两个字符相等,才有必要继续判断下去:如果里面的子串是回文,整体就是回文;如果里面的子串不是回文,整体就不是回文;即:在头尾字符相等的情况下,里面子串的回文性质决定了整个子串的回文性质,这就是状态转移。因此可以把状态定义为原字符串的一个子串是否为回文子串。第一步:定义状态dp[i][j] 表示子串 s[i…j] 是否为回文子串,这里
2021-03-01 17:44:35
238
原创 2021.1.28每日复习 130.被围绕的区域(DFS+BFS)+ 131.分割回文串(回溯)
130.被围绕的区域(DFS+BFS)131.分割回文串(回溯)
2021-02-03 15:53:39
69
原创 2021.1.23每日复习 120.三角形最小路径和(动态规划)+ 129.求根到叶子节点数字之和(递归)
120.三角形最小路径和(动态规划)129.求根到叶子节点数字之和(递归)
2021-02-03 14:59:16
43
原创 2021.1.22每日复习 116.填充每个节点的下一个右侧节点指针(递归+迭代)+ 117.填充每个节点的下一个右侧节点指针II(递归+迭代)
116.填充每个节点的下一个右侧节点指针(递归+迭代)117.填充每个节点的下一个右侧节点指针II(递归+迭代)
2021-01-23 17:33:21
54
原创 回溯算法题(二)
9.子集II分析“去重”操作是在同层中进行的,不同层的相同元素不能“去重”。class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> res = new ArrayList<>(); if(nums.length < 1) return res; Deque<Integer&g
2021-01-22 17:28:12
119
原创 2021.1.21每日复习 113.路径总和II(回溯)+ 114.二叉树展开为链表(递归)
113.路径总和II(回溯)114.二叉树展开为链表(递归)
2021-01-22 13:49:04
68
原创 2021.1.20每日复习 106.从中序与后序遍历序列构造二叉树(递归)+ 109.有序链表转换二叉搜索树(快慢指针 + 中序遍历(递归))
106.从中序与后序遍历序列构造二叉树(递归)109.有序链表转换二叉搜索树(快慢指针 + 中序遍历)
2021-01-21 13:48:58
54
原创 2021.1.19每日复习 103.二叉树的锯齿形层序遍历(BFS+DFS)+ 105.从前序与中序遍历序列构造二叉树(递归+迭代)
103.二叉树的锯齿形层序遍历(BFS+DFS)105.从前序与中序遍历序列构造二叉树(递归+迭代)
2021-01-20 16:57:52
56
原创 2021.1.18每日复习 98.验证二叉搜索树(中序遍历)+102.二叉树的层序遍历(递归(dfs)+迭代(bfs))
98.验证二叉搜索树(中序遍历)102.二叉树的层序遍历(递归(dfs)+迭代(bfs))
2021-01-19 13:35:27
68
原创 回溯算法题(一)
1.括号生成分析当前左右括号都有大于 0 个可以使用的时候,才产生分支;产生左分支的时候,只看当前是否还有左括号可以使用;产生右分支的时候,还受到左分支的限制,右边剩余可以使用的括号数量一定得在严格大于左边剩余的数量的时候,才可以产生分支;在左边和右边剩余的括号数都等于 0 的时候结算。class Solution { public List<String> generateParenthesis(int n) { List<String> res =
2021-01-18 19:05:03
266
原创 回溯算法+例子:全排列和八皇后问题
一、什么叫回溯算法回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程汇总寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。二、回溯算法思想回溯法一般都用在要给出多个可以实现最终条件的解的最终形式。要解决回溯问题,只需考虑三个问题:1、路径:也就是已经做出的选择2、选择列表:也就是当前可以做的选择3、
2021-01-18 17:03:31
75
原创 2021.1.16每日复习 93.复原IP地址(回溯算法)+ 96.不同的二叉搜索树(动态规划)
93.复原IP地址(回溯算法)96.不同的二叉搜索树(动态规划)
2021-01-18 15:40:18
62
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人