笔试

█ 1.双指针

04. 二维数组中的查找 <有序的,while>

22. 链表中倒数第k个节点 《输出为链表》 双指针 让中间差着 k , (i=1 i<k)

24. 反转链表 《真正实现了翻转》 cur next reverhead_0 while(cur!=null)

  1. 最长不含重复字符的子字符串 《 定义一个hashmap<Character,Index>, 双指针 》
  1. 丑数 《 多指针 定义 2,3,5变量》

59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》

59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》

  1. 包含min函数的栈 《 一直出栈,但是找到当前栈中最小的数 》 用两个栈 s1是正常的 s2用来存最小值



█ 2.滑动窗口

  1. 连续子数组的最大和 《这个甚至 不用滑动窗口,直接max比较就行,sum<0==>sum=0 》
  1. 和为s的两个数字 《 递增的数组,两头找两个数字 》

57 - II. 和为s的连续正数序列 《 递增的数组是1,2,3,4,5,6 和不限制大小 》 滑动窗口,sum小 右边界向右; sum大 左边界向右

59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》

59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》




█ 3.二分查找 & 排序

二分查找的特点: while(i<j){m=(i+j)/2; if}

  1. 旋转数组的最小数字 《先把尾部消掉,之后传统二分lr,mid来比》

53 - I. 在排序数组中查找数字 I 出现的次数 《 直接二分 ,两个相邻数 相减 》

53 - II. 0~n-1中缺失的数字 《 直接二分,到最后不等的那个》

  1. 和为s的两个数字 《 递增的数组,两头找两个数字 》
  1. 构建乘积数组 《 把数组中的每个元素乘起来,但是不包含第i个,每个元素都是,,for i左边的乘积 for i右边的乘积 在相乘》
  1. 把数组排成最小的数 《 把这些数 拼接起来 看最小值 》 快速排序 快排



█ 4.搜索 & 遍历 & 递归

  1. 矩阵中的路径《有无此路径,启动点不定》 for_i(for_j dfs) 递归 dfs(上下左右)
  1. 机器人的运动范围《启动点定》 递归 dfs(上下左右)
  1. 礼物的最大价值 《 加了 0行0列 两个for嵌套 求这个路径上经历的值的和最大》



█ 5.动态规划

10- I. 斐波那契数列 (fn-2 + fn-1)

10- II. 青蛙跳台阶问题 (fn-2 + fn-1)

14- I. 剪绳子《剪出来的 乘积最大》 for_n(for 剪) -> dp[i] = Math.max(Math.max(jdp[i-j], j(i-j)), dp[i]);

14- II. 剪绳子 II n很大,用3取%

  1. 丑数 《 多指针 定义 2,3,5变量》
  1. 股票的最大利润 《 找到低点买入 高点卖出,,但是要先min买入 后max卖出》



█ 6.分治




█ 7.位运算 & 数学

  1. 二进制中1的个数 《while(n!=0) n = n & (n-1);》
  1. 数值的整数次方 《pow(x, n) & >> 》
  1. 打印从1到最大的n位数 《n=9 就是打印到9个n位 & >> 》
  1. 求1+2+…+n 《 不能用。。。》boolean && 短路 + 递归。
  1. 不用加减乘除做加法 《 用& << ^ 做 两个数的加法 》


56 - I. 数组中数字出现的次数 《 寻找 每个num[i] 出现的次数 中 只出现1次 一次的数字 》 通过 & ^ while来实现的。
56 - II. 数组中数字出现的次数 II 《 相比于 上一个,也是找只出现1一次的数字,但是没有复杂度要求 》 存到HashMap中<num, index> !map.containsKey(key)
43. 1~n 整数中 1 出现的次数 《 所有的数字 找规律的数学题 》
44. 数字序列中某一位的数字 《0123...111213 找第几位上 对应的数字, 找规律的数学题》

  1. 构建乘积数组 《 把数组中的每个元素乘起来,但是不包含第i个,每个元素都是,,for i左边的乘积 for i右边的乘积 在相乘》



█ 8.栈 stack

  1. 用两个栈实现队列 《 一个栈push( pop())实现插入队列 和 删除队列元素 操作 》
  1. 栈的压入、弹出序列 《 根据压入顺序和出栈顺序,判断出栈顺序 正确否 》
  1. 包含min函数的栈 《 一直出栈,但是找到当前栈中最小的数 》 用两个栈 s1是正常的 s2用来存最小值

数组模拟栈 P76




█ 9.计算器

栈实现模拟计算器 《一个数栈 + 一个符号栈》
中缀 后缀 逆波兰计算器 有对应的题目还有

z 227. 基本计算器 II
z 770. 基本计算器 IV
z 991. 坏了的计算器 《通过*2 -1 得到结果Y,所花费的最小操作次数。 反向,递归 或者不递归》




█ 10.队列 queue

  1. 最小的k个数 《 用 PriorityQueue 》 + queue.size() > k 就往外poll()

59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》

59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》

数组模拟队列,定义front和rear进行操作,在 P32 3.2

数组模拟环形队列 rear=(rear+1)%maxSize; P34 添删都在rear 第一个




█ 11.字符串

  1. 替换空格 《charAt》
  1. 字符串的排列 《 当成 字符串的 排列组合 输出全部的结果 》 s.toCharArray(); HashSet去重,各种交换
  1. 把数字翻译成字符串 《 0-a 》
  1. 最长不含重复字符的子字符串 《 定义一个hashmap<Character,Index>, 双指针 》 map.containsKey(key)
  1. 丑数 《 多指针 定义 2,3,5变量》
  1. 把字符串转换成整数 《 可以有+- “ ”,截止到不是数字的位置 还有各种 字符串转化 拼接》字符串转换
  1. 第一个只出现一次的字符 《 用hashmap来存 Chara,Boolean包含不 》 !dic.containsKey(c)
    相似
    56 - II. 数组中数字出现的次数 II 《 相比于 上一个,也是找只出现一次的数字,但是没有复杂度要求 》 存到HashMap中<num, index> !map.containsKey(key)

58 - I. 翻转单词顺序 《 一句话,直接 split 》
58 - II. 左旋转字符串 《 字符串,charAt() 》




█ 12.链表

  1. 从尾到头打印链表 《反向》 stack || 数组i=tail

24. 反转链表 《真正实现了翻转》 《 新链表head_0 cur next 》 while(cur!=null)

22. 链表中倒数第k个节点 《输出为链表》 双指针 让中间差着 k , (i=1 i<k)

18. 删除链表的节点 《res.next = head 》+《 temp = res》+ 《temp.next = temp.next.next》

25. 合并两个排序的链表 《 排序 新链表head_0 cur同_用来返回 》 while(两个都不为空)

35. 复杂链表的复制 《next + random》 HashMap(node, node.val)

52. 两个链表的第一个公共节点 《 定义两个node, 会重逢 》

双向链表 P60删除 P57添加 先next再pre,需要一个temp

  1. 圆圈中最后剩下的数字 《 约瑟夫环Josephu ArrayList移除第m个 ; index = (index + m - 1) % n; 》 P69环形链表出圈

36. 二叉搜索树与双向链表 《树循环排序双向链表 把左右节点 当成 双向 》




█ 13.树 递归

  1. 重建二叉树 《 前序遍历+中序 》 递归 前序第一个是根 中序中间的是根
  1. 二叉搜索树的后序遍历序列 最后一个是根 后序最后一个是根
  1. 二叉搜索树的第k大节点 《 中序遍历存到ArrayList get就行 》
  1. 树的子结构 《 b是a的子树 》 两层递归 ( 查左右树 && 树的左=左 右=右 )
  1. 二叉树的镜像 《 建 一个新的 镜像 树 》 同样是递归不用想那么多 系列
  1. 对称的二叉树 《 树本身是对称 》同样是递归不用想那么多 系列

32 - I. 从上到下打印二叉树 《层序遍历 一个数组》 队列只管移除 + 进左右 需要 Queue(LinkedList) + ArrayList + int[]

32 - II. 从上到下打印二叉树 II 《层序遍历 一层一个》 队列需要单开for来移除 + 进左右 需要 Queue(LinkedList) + ArrayList

32 - III. 从上到下打印二叉树 III 《层序遍历 一层一个,还要反方向》 flag tmp.add(0, node.val); //从头部插入

  1. 序列化二叉树 《同样的 层序遍历》《 层序遍历 生成 树 》
  1. 二叉搜索树与双向链表 《 把左右节点 当成 双向 》

55 - I. 二叉树的深度 《 递归的出奇 》

55 - II. 平衡二叉树 《 通过递归每个树的 深度 不大于1 》

68 - I. 二叉搜索树的最近公共祖先 《 递归 找父节点 》
68 - II. 二叉树的最近公共祖先 《 没有排序了,父节点 》

  1. 二叉树中和为某一值的路径 《 节点值的和为输入整数的所有路径。 从头到尾 》

最短路径例题讲解
LeetCode 1162. As Far from Land as Possible 离开陆地的最远距离(Medium)
层序遍历的一些变种题目:

LeetCode 199. Binary Tree Right Side View 找每一层的最右结点
LeetCode 515. Find Largest Value in Each Tree Row 计算每一层的最大值
LeetCode 637. Average of Levels in Binary Tree 计算每一层的平均值
对于最短路径问题,还有两道题目也是求网格结构中的最短路径,和我们讲解的距离岛屿的最远距离非常类似:

LeetCode 542. 01 Matrix
LeetCode 994. Rotting Oranges
还有一道在真正的图结构中求最短路径的问题:

LeetCode 310. Minimum Height Trees

█ 14.递归

  1. 正则表达式匹配 《* . 》

z 991. 坏了的计算器 《通过*2 -1 得到结果Y,所花费的最小操作次数。 反向,递归 或者不递归》




█ 15.堆

  1. 最小的k个数 《 用 PriorityQueue 小顶堆 》 + queue.size() > k 就往外poll()
  2. 数据流中的中位数 《 小顶堆 + 大顶堆 》 min.add(max.poll()); 大顶堆的个数 >= 小顶堆的个数 max.add(min.poll());



█ 16.图




█ 17.其他数据结构

  1. 数组中重复的数字

█ 18.逻辑题

  1. 表示数值的字符串 《是不是 +-e ?? 设置 Boolean开关》
  1. 顺时针打印矩阵 《顺时针打印出 每个数 逻辑》
  1. 数组中出现次数超过一半的数字 《 投票题 判断 过半的 》
  1. 扑克牌中的顺子 《 这个 进行了 排序sort,所以可以统计joker nums[4]-nums[joker<5 》
  1. 把字符串转换成整数 《 可以有+- “ ”,截止到不是数字的位置 还有各种 字符串转化 拼接》字符串转换

读取文件的题:

读取文件的题:读取一篇英文文章,输出其中出现单词的次数最多的5个,写java函数

posted @ 2021-03-25 15:54  千面鬼手大人  阅读(49)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css