1、字节跳动
https://www.nowcoder.com/discuss/453852?type=post&order=jing&pos=&page=3&channel=-2&source_id=search_post&subType=2 主JVM、zk、redis等
https://www.nowcoder.com/discuss/445316?type=post&order=time&pos=&page=1&channel=-2&source_id=search_post&subType=2 主网络、数据库
https://www.cnblogs.com/flyingcr/p/10428280.html 主网络tcp、三次握手、Java
https://www.nowcoder.com/discuss/317487?order=0&page=1&pos=6&type=0 主JVM、GC 、线程、秒杀
https://blog.csdn.net/weixin_33805152/article/details/106618948 主网络、线程池、事务、redis
https://www.sohu.com/a/404254709_463974 主MySQL、redis、kafka、zset的实现和源码
https://www.nowcoder.com/discuss/476824?type=post&order=time&pos=&page=1&channel=-2&source_id=search_post&subType=2 主http、三次握手、Java内存、netty、redis、四次挥手、os内存模型
https://leetcode-cn.com/circle/discuss/A0YstA/ 主锁、分布式锁、数据库的实现B、redis的实现、集群保证数据一致性、网络拥塞控制、kafka如何保证顺序
2、华为
概念
注意:
问题
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src\\person.txt")); oos.writeObject(new Person("小美女",18));
new ObjectMapper().writeValueAsString(new Reassignment(partitionListFilterDownBroker));
2、MQ
3、数据库
4、Redis
5、网络
6、多线程
7、GO语言
8、反问
您觉得经过这一小时的交流,我整体怎么样?应该向什么方向去深入学习和思考比较好呢?
存储引擎
联合查询/多表查询
索引
SELECT id, age FROM user WHERE status = 0 and age > 12;
这条语句,怎样建立索引比较好?优化
事务
集群
分库分表
其他:
Mysql 用的是什么数据结构
MySQL字段类型的长短会对性能有影响吗
如何分析一条语句的执行过程。delete from t1 limit 3和delete from t1的区别?
Mysql 集群在保证强一致性的情况下,如何保证高并发
res = Math.max(dp(nums, start + 1),nums[start] + dp(nums, start + 2)
int do_it = root.val + (root.left == null ? 0 : rob(root.left.left) + rob(root.left.right)) + (root.right == null ? 0 : rob(root.right.left) + rob(root.right.right)); int res = Math.max(do_it, not_do); memo.put(root, res);
输入:S = "qqe" 输出:["eqq","qeq","qqe"] public String[] permutation(String S)
class Solution { Set<String> res = new HashSet<>(); boolean[] visit; public String[] permutation(String S) { char[] arr = S.toCharArray(); visit = new boolean[arr.length]; dfs(arr, 0, ""); return res.toArray(new String[0]); } void dfs(char[] arr, int idx, String path) { if (idx == arr.length) { res.add(String.valueOf(path)); return; } for (int i = 0; i < arr.length; i++) { if (!visit[i]) { visit[i] = true; dfs(arr, idx + 1, path + arr[i]); visit[i] = false; } } } }
static void arrange(int a[], int start, int end) { if (start == end) { for (int i : a) { System.out.print(i); } System.out.println(); return; } for (int i = start; i <= end; i++) { swap(a, i, start); arrange(a, start + 1, end); swap(a, i, start); } } static void swap(int arr[], int i, int j) { int te = arr[i]; arr[i] = arr[j]; arr[j] = te; }
import java.util.*; // 1 2 3 螺旋 1 2 3 6 9 8 7 4 5 // 4 5 6 // 7 8 9 public class Solution { public ArrayList<integer> spiralOrder(int[][] matrix) { ArrayList<integer> res = new ArrayList<>(); if(matrix.length == 0) return res; // 定义四个指针,并且充当边界限制的作用 int top = 0, bottom = matrix.length-1; int left = 0, right = matrix[0].length-1; while( top < (matrix.length+1)/2 && left < (matrix[0].length+1)/2 ){ //上面 左到右 for(int i = left; i <= right; i++){ res.add(matrix[top][i]); } //右边 上到下 for(int i = top+1; i <= bottom; i++){ res.add(matrix[i][right]); } //下面 右到左 for(int i = right-1; top!=bottom && i>=left; i--){ res.add(matrix[bottom][i]); } //左边 下到上 for(int i = bottom-1; left!=right && i>=top+1; i--){ res.add(matrix[i][left]); } // 遍历完一圈之后,所有往里面靠 ++top; --bottom; ++left; --right; } return res; } }
/* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } */ class Solution { public Node copyRandomList(Node head) { } }
class Solution { public Node copyRandomList(Node head) { if(head == null){ return head; } // map方法,空间复杂度O(n) Node node = head; // 使用hash表存储旧结点和新结点的映射 Map<Node,Node> map = new HashMap<>(); while(node != null){ Node clone = new Node(node.val,null,null); map.put(node,clone); node = node.next; } node = head; while(node != null){ map.get(node).next = map.get(node.next); map.get(node).random = map.get(node.random); node = node.next; } return map.get(head); } }
class Solution { public ListNode swapPairs(ListNode head) { //终止条件:链表只剩一个节点或者没节点了,没得交换了。返回的是已经处理好的链表 if(head == null || head.next == null){ return head; } //一共三个节点:head, next, swapPairs(next.next) //下面的任务便是交换这3个节点中的前两个节点 ListNode next = head.next; head.next = swapPairs(next.next); next.next = head; //根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分 return next; } }
//迭代 public ListNode swapPairs(ListNode head) { ListNode newHead = new ListNode(0); ListNode cur = newHead; newHead.next = head; while(cur.next != null && cur.next.next != null){ ListNode a = cur.next; ListNode b = a.next; cur.next = b; a.next = b.next; b.next = a; cur = a; } return newHead.next; }
class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode prev = null; ListNode cur = head; ListNode next = null; ListNode check = head; int canProceed = 0; int count = 0; // 检查链表长度是否满足翻转 while (canProceed < k && check != null) { check = check.next; canProceed++; } // 满足条件,进行翻转 if (canProceed == k) { while (count < k && cur != null) { next = cur.next; cur.next = prev; prev = cur; cur = next; count++; } if (next != null) { // head 为链表翻转后的尾节点 head.next = reverseKGroup(next, k); } // prev 为链表翻转后的头结点 return prev; } else { // 不满住翻转条件,直接返回 head 即可 return head; } } }
import java.util.*; public class Solution { public ListNode reverseKGroup (ListNode head, int k) { if(head==null||head.next==null||k==1) return head; ListNode res = new ListNode(0); res.next = head; int length = 0; ListNode pre = res, cur = head, temp = null; while(head!=null){ length++; head = head.next; } //分段使用头插法将链表反序 for(int i=0; i<length/k; i++){ //pre作为每一小段链表的头节点,负责衔接 for(int j=1; j<k; j++){ temp = cur.next; cur.next = temp.next; //相当于头插法,注意: //temp.next = cur是错误的,temp需要连接的不是前一节点,而是子序列的头节点 temp.next = pre.next; pre.next = temp; } //每个子序列反序完成后,pre,cur需要更新至下一子序列的头部 pre = cur; cur = cur.next; } return res.next; } }
class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null, cur = head, next = null; while(cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } }
class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null) { return head; } ListNode node = reverseList(head.next); head.next.next = head; head.next = null; return node; } }
public String removeOccurrences(String s, String part) { StringBuffer sub = new StringBuffer(s); while (sub.indexOf(part) != -1) { int index = sub.indexOf(part); sub.delete(index, index + part.length()); } return sub.toString(); }
class Solution { public String removeOccurrences(String s, String part) { if(!s.contains(part)){ return s; } int i = s.indexOf(part); s = s.substring(0, i) + s.substring(i + part.length()); return removeOccurrences(s,part); } }
public List<String> stringMatching(String[] words) { List<String> res = new ArrayList<>(); for (String word : words) { for (int i = 0; i < words.length; i++) { if (word.length() >= words[i].length()) continue; if (words[i].contains(word)) { res.add(word); break; } } } return res; }
动态规划递推式:前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
class Solution { public int maxProfit(int[] prices) { if(prices.length <= 1) return 0; int min = prices[0], max = 0; for(int i = 1; i < prices.length; i++) { max = Math.max(max, prices[i] - min); min = Math.min(min, prices[i]); } return max; }}
class Solution { public int maxProfit(int[] prices) { int ans=0; for(int i=1;i<=prices.length-1;i++) { if(prices[i]>prices[i-1]) { ans+=prices[i]-prices[i-1]; } } return ans; } }
class Solution { public int maxProfit(int[] prices) { int max = 0; for (int i = 0; i < prices.length; i++) { max = Math.max(max, func(prices, 0, i) + func(prices, i, prices.length)); } return max; } private int func(int[] prices, int start, int end) { int min = prices[start]; int profit = 0; for (int i = start; i < end; i++) { profit = Math.max(prices[i] - min, profit); min = Math.min(min, prices[i]); } return profit; } }
class Solution { public int maxProfit(int[] prices) { /** 对于任意一天考虑四个变量: fstBuy: 在该天第一次买入股票可获得的最大收益 fstSell: 在该天第一次卖出股票可获得的最大收益 secBuy: 在该天第二次买入股票可获得的最大收益 secSell: 在该天第二次卖出股票可获得的最大收益 分别对四个变量进行相应的更新, 最后secSell就是最大 收益值(secSell >= fstSell) **/ int fstBuy = Integer.MIN_VALUE, fstSell = 0; int secBuy = Integer.MIN_VALUE, secSell = 0; for(int p : prices) { fstBuy = Math.max(fstBuy, -p); fstSell = Math.max(fstSell, fstBuy + p); secBuy = Math.max(secBuy, fstSell - p); secSell = Math.max(secSell, secBuy + p); } return secSell; } }
class Solution { public boolean canJump(int[] nums) { int reach = 0; for(int i = 0; i < nums.length; i ++) { if(reach < i) { return false; } reach = Math.max(reach, i + nums[i]); } return reach >= nums.length - 1; } }
class Solution { public int jump(int[] nums) { int steps = 0, start = 0, end = 0; while(end < nums.length - 1) { int max = end; for(int i = start; i <= end; i++) { if(nums[i] + i > max) { max = nums[i] + i;//寻找能跳跃到的最大位置处作为end } } start = end; end = max; steps ++; } return steps; } }
14、输入n,k,输出n的字典序的第k位数字,若n=15,k=7,1 10 11 12 13 14 15 2 3 4 5 6 7 8 9,输出15(dfs、tri树)
15、给定一个升序数组 1,元素有重复,对每个元素算一下平方后得到新的数组 2,问数组 2 中不相同的元素共有多少个?给出时间复杂度和空间复杂度,要求尽量优化。 [-13, -13, -13, 17, 17, 17]
16、给定 m 个不重复字符(如:[a, b, c]),以及一个长度为 n 的字符串 (如:tbbacbctsafsg),问能否在这个字符串中找到一个长度为 m 的连续子串。要求子串由给定的 m 个字符组成,顺序不要求(如:bac)。
17、有两个表示正整数的字符串,写一个函数求的两个整数相加的结果对应的字符串。(力扣415)
18、单链表的反转,不用递归的方法
19、有序数组存在某个值,查找这个值的下标,有则输出,无则输出-1
20、力扣394:给定一个经过编码的字符串,返回它解码后的字符串(编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次),如s = "3[a]2[bc]", 返回 "aaabcbc".
21、力扣213:打家劫舍求偷窃到的最高金额
22、给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。
23、取出数组中第k大的数字
24、求二叉树中和为K的所有路径
25、求一个有序整数数组中和为K的数的对数。
26、递增递减数列(不考虑附近重复),找出最大的数,如int[] arr = {1, 2, 3, 4, 5, 7, 8,10,5,3,2,1};
27、两个单向链表,返回求和后的链表结构,例如2->3->1->5,和3->6,结果返回2->3->5->1
28、两个排序数组找中位数
29、求数字n的平方根
30、跳台阶
31、数组中奇数个元素
32、一栋楼有n层,不知道鸡蛋从第几层扔下去会碎,用最少的次数找出刚好会碎的楼层
33、连续整数求和(leetcode 第 829 题),要求时间复杂度小于O(N)
34、链表表示的两个数相加。
35、算法题是股票买卖,一次和无限次两种。
36、反转链表::给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
37、三数之和=0
38、链表求和
39、最小覆盖子串
40、最大交换670:给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
41、把一个方程式设计成树以及很多的 follow up
42、LRU缓存