《剑指Offer》

1. 数组中重复的元素

  1. 直接排序
  2. 使用HashSet

2. 二维数组搜索目标值

  1. 判断空
  2. 从右上角开始搜索

3. 替换空格

  1. replace()
  2. 使用StringBuffer存

4. 从尾到头打印链表

  1. 先遍历链表统计长度,重新遍历,从数组的尾部开始存
  2. 用栈存链表,然后出栈,用List存

5. 根据前序和中序重建二叉树

  1. 前序用数组存
  2. 中序用Map存

6. 双栈实现队列

  1. stack1直接push
  2. 出栈时stack2存入stack1的弹出实现倒置

7. 旋转数组的最小值(有重复)

  1. 双指针,旋转数组,左半比右半大,升序
  2. while循环,提取middle
  3. 如果nums[middle] < nums[right],在右半,旋转点在middle左边,right=middle
  4. 如果nums[middle] > nums[right],在左半,旋转点在middle右边,left=middle+1
  5. 如果nums[middle] == nums[right],right--

8. 矩阵路径(单词搜索)

  1. 直接遍历矩阵,如果dfs()为true,返回true,否则返回false
  2. dfs
    1. false出口:不能匹配、越界
    2. true出口:全部匹配
    3. 提取当前字符,替换为"/",dfs上下左右,恢复当前字符
    4. 返回结果

9. 机器人运动范围

  1. 从[0,0]开始搜索,到[m,n],需要visited判断重复搜索
  2. dfs:符合继续递归右和下的情况,result++,visited置为true

10. 剪绳子(整数分割)

  1. 如果n小于4,返回n-1
  2. 初始化result=1,当n大于等于4时,n -= 3,result *= 3
  3. 返回result*n

11. 二进制中1的个数

  1. 初始化temp=1,for循环遍历32次,如果n&temp != 0,count计数++,temp<<=1

12. 打印从1到最大的n位数

  1. Math.pow(10,n)计算len
  2. 创建len长度的数组
  3. for循环从0到len,存入元素

13. 删除链表的节点

  1. 如果head为空,返回空
  2. 如果head.val == val,返回head.next
  3. 提取head节点,while循环,如果cur.next.val == val,跳过cur.next,返回head。否则cur = cur.next

14. 使奇数位于偶数前

  1. 双指针
  2. while循环,left指针控制奇数往后移动,right指针控制偶数往前移动,然后交换

15. 链表的倒数第K个节点

  1. 快慢指针,快指针先走k步,然后快慢一起走,当快指针走到尾部时,跳出循环,返回慢指针就是倒数第k个节点

16. 反转链表

  1. 双指针:pre和next指针,
  2. 尾递归:尾递归,head.next递归,递归结束后head节点为倒数第二个节,head.next.next指向head实现反转,head.next置空,返回node

17. 合并两个有序链表

  1. 新建链表存储
  2. while循环
  3. if补录
  4. 返回新链表.next

18. 树的子结构

  1. 如果B在A的左右子树中或者A和B的节点能够全部匹配

19. 二叉树镜像

  1. 递归左右子树,交换

20. 对称二叉树

  1. 递归左右子树
  2. true出口:能够同时到底部
  3. false出口:不能同时到底部,或者节点值不匹配
  4. 否则继续递归左右子树

21. 最小栈

  1. 双栈实现
  2. 存入时,min栈顶维护最小值
  3. 弹出时,如果stack栈弹出的元素和min栈顶的元素相同,min栈顶弹出

22. 栈的压入和弹出

  1. 使用单调栈存入栈序列
  2. while循环,先入栈,然后弹出跟出栈序列比较,如果相同就弹出
  3. 返回栈是否为空

23. 从上到下打印二叉树

  1. ArrayList、LinkedList、addLast、pollFirst、先左后右

24. Z字形打印二叉树

  1. ArrayList、LinkedList、addLast、pollFirst、LinkedList、奇数addFirst、偶数addLast

25. BST的后序遍历

  1. 单调栈,初始化root为MAX_VALUE,倒序遍历,找到第一个比栈顶小的元素,弹出栈顶为root节点

26. 二叉树路径总和

  1. dfs
  2. 前序遍历:根左右,先添加当前节点,sum递减当前节点值,当sum递减到0并且到达树底部时,添加这条路径

27. 字符串排序

  1. 全排列类型,需要visited判断重复搜索
  2. dfs
  3. 出口:长度一致时
  4. 从0开始遍历数组,如果visited[i]=true,跳过,判断重复,visited置为true,d'f's

28. 数组中出现次数超过一半的元素

  1. 摩尔投票法:出现相同就相消,最终无法相消的元素就是目标元素

29. 最小的k个数

30. 连续子数组的最大和

  1. 从1开始遍历,叠加前一个元素和0的比较结果的最大值,提取最大值

31. 把数字排成最小的数

  1. 将数字转化为字符串
  2. 自动义compareTo()排序

32. 把数字翻译成字符串

  1. 将数字转化为字符串
  2. 定义dp数组,初始化0和1为1,数字只有0位和1位时,只有一种翻译方式
  3. 从2开始遍历,截取前两位字符,compareTo(10)和compareTo(25),如果成立,等于前两个字符的dp叠加,否则等于前一个字符的dp

33. 礼物的最大价值

  1. 直接遍历矩阵,如果是左上角,跳过,如果是上边界,当前等于左边叠加当前。如果是左边界,当前等于上边叠加当前。

34. 最长无重复字符串

  1. 使用哈希表,双指针控制。
  2. 如果map中有right,更新left为max,存入,result提取right-left+1

35. 丑数

36. 第一个只出现一次的字符:使用LinkedHashMap或HashMap

37. 数组逆序对:归并排序

38. 两个链表的第一个公共节点

  1. 双指针,while循环
  2. 如果l1为null,l1指向headB,l2同理
  3. 返回双指针中任意一个

39. 元素在排序数组中出现的次数(二分查找找左右边界)

40. 0到n-1中缺失的元素

  1. 双指针查找,如果nums[middle] == middle,left=middle+1,否则right=middle-1
  2. 返回left

41. BST的第K大节点

  1. 反中序递归,当count=k时,提取节点值,return

42. 二叉树深度:递归左右子树,提取最大值+1

43. 平衡二叉树

  1. 左右子树高度一致,左右子树高度差不超过1

44. 有序数组中和为s的两个数字

  1. 双指针
  2. 计算左右指针的sum,如果sum==target,返回

45. 和为s的连续正序序列

  1. 定义slow、fast、end
  2. while循环,当slow<=end时
  3. 如果sum < target,sum+=fast,fast++。如果sum > target,sum-=slow,slow++,如果sum == target,存入

46. 翻转单词顺序:倒序遍历字符串

47. 左旋转字符串

  1. substring()
  2. Stringbuilder

48. 滑动窗口的最大值

  1. 用LinkedList,创建窗口数组
  2. 遍历数组,队列尾部控制最大值,如果队尾比当前元素小,弹出队尾索引,存入当前元素索引
  3. 如果左边界i-k等于队首,说明队列已满,弹出队首
  4. 如果i>=k-1,存入队首

49. 队列的最大值

  1. 双队列实现,max队列的尾部维护最大值,如果比当前元素小,弹出,然后存入

50. 股票一次购买最大利润

  1. 定义profit和cost
  2. 从1开始遍历,cost提取最小,profit提取最大

51. BST、二叉树的最近公共节点

  1. 递归左右子树,如果为空,返回另一个子树递归的结果
全部评论

相关推荐

05-28 23:26
河南大学 Java
双非本,刚学完Redis,项目只有外卖和点评,八股没准备,算法只有lqb省一,感觉敲的项目也是一言难尽没怎么吸收。怎么你们都有实习了
大牛之途:27急个锤子,你投日常实习最好的时间就是9,10月份,那时候暑期实习都结束了,正是缺人的时候。这份日常又能给你的暑期实习增加竞争力,暑期找的好了秋招也不怕了,都是环环相扣的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务