04 2021 档案
摘要:1.反转链表 双指针法,先存cur.next,然后cur.next指向pre,接着往后移。 206. 反转链表 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;
阅读全文
摘要:Synchronized锁升级过程 首先,每个对象都有一把锁。 对象的结构有三个部分:对象头,实例数据,对其填充字节(保证对象大小为8字节的倍数) 对象头由两部分组成:1.classpointer(指向当前对象在方法区中的类型数据) 2.Markword存储和当前对象运行时状态有关的数据 锁的信息就
阅读全文
摘要:不好返回的是时候,就用void,然后在主函数中返回。 思路是在快排中只增加了一句话: if(k == i) return;如果基准数的下标,和k相等,就return。 假如k=7,数组下标为7的时候是第 8个数,第8个数前的数都比第8个数小。 其实在像解答里在arr[i] = pivot;之后判断,
阅读全文
摘要:思路很简单,首先输出res.next可以避免链表头结点是0的问题。 然后不能在第一个while循环结束后直接把剩下的链表接上来,因为可能存在进位,仍然需要一步一步递加。 最后一位也有可能产生进位,如果有进位直接new ListNode(1)即可。 面试题 02.05. 链表求和 /** * Defi
阅读全文
摘要:1.状态定义 dp[i]表示组成面额 i,有多少种方案。 2.状态转移方程 int[] coins = new int[]{1,5,10,25}; for(int coin: coins) { dp[k] += dp[k - coin]; } 比如dp[36] = dp[36-1] + dp[36
阅读全文
摘要:1.状态定义 dp[i]代表凑齐总价值 i 需要的最少硬币个数; 2.状态转移方程 for(int coin : coins) dp[i] = Math.min(dp[i], dp[i - coin] + 1); 322. 零钱兑换 class Solution { public int coinC
阅读全文
摘要:应该不用写啥。 也可以用有序哈希表LinkedHashMap,第二遍遍历哈希表。 剑指 Offer 50. 第一个只出现一次的字符 class Solution { public char firstUniqChar(String s) { Map<Character, Boolean> dic =
阅读全文
摘要:思路一: 利用小根堆。 小根堆弹出的数是堆里最小的,于是弹出一个x。 就将2*x,3*x,5*x加入set去重,然后重新加入小根堆。 弹出的第n个数就是第n个丑数。 class Solution { public int nthUglyNumber(int n) { int[] factors =
阅读全文
摘要:charAt返回指定索引处的字符。 转为字符数组toCharArray() 剑指 Offer 48. 最长不含重复字符的子字符串 class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, I
阅读全文
摘要:dp三步走: 1.状态定义 dp[i]表示到第i位能形成的方案数量(从1开始) 2.状态转移方程 当第i-1位,i位组合起来能被翻译:dp[i] = dp[i - 1] + dp[i - 2] 不能被连起来翻译:dp[i] = dp[i - 1] //指加上了这一位,方案数量没有改变 3.边界处理
阅读全文
摘要:length是数组的属性,单独String用.length(),数组的属性就用.length。 这道题也只是知道策略,不知道怎么证明。 剑指 Offer 45. 把数组排成最小的数 class Solution { public String minNumber(int[] nums) { //这里
阅读全文
摘要:原文链接:https://blog.csdn.net/bytxl/article/details/40920165 hashmap为什么用红黑二叉树而不用B+树? hashMap的元素是动态修改的,红黑树修改元素,不用移动元素的位置,因为直接修改左右父指针的值就好了,但是B+树的同一个块内的元素,没
阅读全文
摘要:reverseOrder() 方法用于获取一个比较有否就实现Comparable接口的对象的集合的自然顺序相反。 剑指 Offer 40. 最小的k个数 class Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k ==
阅读全文
摘要:感觉是比较难的一道题了,写一下思路以及运行流程。 举例 s = "abc" 1.首先将字符串s存入字符数组便于操作,进入dfs(0) 2.进入循环,交换‘a’和‘a’(相当于没变),进入dfs(1) 3.进入循环,交换‘b’和‘b’,进入dfs(2) 4.触发终止条件,把此时的字符串c转为Strin
阅读全文
摘要:思路:中序遍历依次修改左右连接。 剑指 Offer 36. 二叉搜索树与双向链表 /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node()
阅读全文
摘要:思路:用hashmap存储新老节点对应关系。 剑指 Offer 35. 复杂链表的复制 /* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val
阅读全文
摘要:思路:后序遍历则数组末尾为根节点。 二叉搜索树左子节点值 < 根节点值 <右子节点值 因子划分左右子树,递归判断。 剑指 Offer 33. 二叉搜索树的后序遍历序列 class Solution { public boolean verifyPostorder(int[] postorder) {
阅读全文
摘要:思路一: 加了一句: if(res.size() % 2 == 1) Collections.reverse(tmp);如果res.size()为奇数,当前层为偶数,反转tmp之后再存入res。 class Solution { public List<List<Integer>> levelOrd
阅读全文
浙公网安备 33010602011771号