Skip to content

xjtu-e-learning/jianzhioffer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

说明

本工程用于剑指offer书籍的编程练习,语言是Java,环境是idea。

感兴趣的同学自行从master分支或者develop分支新建一个新的分支。命名方式为:branch-自己的英文名

规范

  1. 每个人在自己的分支上开发
  2. 每周同步自己的分支一次,把这周学习的三道题目更新
  3. __不要__把自己分支的代码合并到master分支或者develop分支
  4. 每周五晚上查看大家的完成程度
  5. 孰能生巧,多写代码,少打游戏

剑指offer --- 知识处理小组刷题工程

剑指虐我千百遍,我待剑指如初恋

题目列表

第2章:面试需要的基本知识

编程语言 C++/C/Java

  1. 赋值运算符函数
  2. 实现Singleton模式(设计模式,参考)

数据结构

  1. 二维数组中的查找(数组)
  2. 替换空格(不使用自带函数)(字符串)
  3. 从尾到头打印链表(栈、递归)(链表)
  4. 重建二叉树(前序、中序、后序遍历特点、递归)(树)
  5. 用两个栈实现对列(入队和出队)(栈和对列)

算法和数据操作

  1. 旋转数组的最小数字(二分查找变种)(查找和排序)
  2. 斐波那契数列(递归和循环,递归解法的弊端)
  3. 二进制中1的个数(位运算,减1求与的次数)

第3章:高质量的代码

代码的完整性

  1. 数值的整数次方(指数为负、数值为0等边界情况,递归解法)
  2. 打印1到最大的n位数(数组模拟、全排列、递归)
  3. 在O(1)时间删除链表节点(链表空、删除节点为头节点、尾节点等)
  4. 调整数组顺序使奇数位于偶数前面(两个指针)

代码的鲁棒性

  1. 链表中倒数第k个结点(链表空,k小于1,k大于链表长度,两个指针)
  2. 反转链表(链表空、只有一个节点)
  3. 合并两个排序的链表(某个链表为空)
  4. 树的子结构(两步:根节点是否相等,是否是子结构)

第4章:解决面试题的思路

面试官谈面试思路

  1. 二叉树的镜像(递归,交换左右节点)

画图让抽象问题形象化

  1. 顺时针打印数组(循环条件,每圈打印数组的边界条件)

举例让抽象问题具体化

  1. 包含min函数的栈(利用辅助栈保存最小值)
  2. 栈的压入、弹出序列(熟悉入栈和出栈的过程)
  3. 从上往下打印二叉树(对列,先进先出)
  4. 二叉搜索树的后序遍历序列(二叉搜索树:左子树比根节点小,右子树比根节点大。后序遍历数组的特点)
  5. 二叉树中和为某一值的路径(递归、栈、举例模拟计算过程)

分解让复杂问题简单化(题目较为复杂,需要多加理解练习)

  1. 复杂链表的复制(三步:复制节点的next,复制节点的sibling,拆分链表)
  2. 二叉搜索树和双向链表(中序遍历、递归)
  3. 字符串的排列(全排列、递归、回溯)

第5章:优化时间和空间效率(题目较为复杂,需要多加理解练习)

时间效率

  1. 数组中出现次数超过一半的数字(快排能改变数组O(n)、快速解法O(n))
  2. 最小的k个数(快排能改变数组O(n)、最大堆和额外k空间O(nlogk))
  3. 连续子数组的最大和(举例分析数组规律、动态规划)
  4. 从1到n整数中1出现的次数(最高位为1、其余位1、递归)
  5. 把数组排成最小的数(排序规则、快排、比较器)

时间效率与空间效率的平衡

  1. 丑数(数组保存已找到的数组、四个指针)
  2. 第一个只出现一次的字符(TreeMap保存字符及其出现次数、保证顺序)
  3. 数组中的逆序对(归并排序、辅助数组保存排序元素)
  4. 两个链表的第一个公共节点(辅助栈、先求长度差然后同时走直到第一次相遇)

第6章:面试中的各项技能(题目较为复杂,需要多加理解练习)

知识迁移能力

  1. 数字在排序数组中出现的次数(二分查找得到第一个k的下标和最后一个k的下标)
  2. 二叉树的深度+是否为平衡二叉树(递归遍历)
  3. 数组中只出现一次的数字(异或、根据结果位1分成两个数组再求异或)
  4. 和为s的两个数字+和为s的连续正数序列(两个指针、首尾、首首)
  5. 翻转单词顺序VS左旋转字符串(整体旋转、部分旋转)

抽象建模能力

  1. n个骰子的点数(递归求解每种情况的次数)
  2. 扑克牌的顺子(判断大小王的数量是否不小于需要补上大小王的数量)
  3. 圆圈中最后剩下的数字(链表每次删除第m个元素得到最后一个元素、数学推导)

发散思维能力

  1. 求1+2+...+n(函数递归调用)
  2. 不用加减乘除做加法(位运算、异或和与运算加循环、异或实现无进位加+与运算实现求进位+再循环求两个结果的和)
  3. 不能被继承的类(C相关,省略

第7章:两个面试案例

  1. 把字符串转换为整数(考虑字符串中存在非法字符、第一个字符为'+'或'-'或数字的情况等)
  2. 树中两个结点的最低公共祖先(四种场景:a. 二叉搜索树->二分搜索法; b. 普通树+指向父节点指针->两个链表第一个相交的节点; c. 普通树->递归左右子树判断 d. 普通树->辅助空间、两个链表保存根节点到指定节点的路径,最后一个相同的节点就是最低公共祖先节点)

附加1:排序算法/查找算法(chapter_sort)

基本算法(时间复杂度为 n^2)

  1. 冒泡排序(稳定;时间复杂度:最好为 O(n),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1),选择排序的一种)
  2. 选择排序(不稳定;时间复杂度:最好为 O(n^2),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1))
  3. 插入排序(稳定;时间复杂度:最好为 O(n),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1))

快速算法(时间复杂度为 nlogn)

  1. 快速排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(n^2),平均为 O(nlogn);空间复杂度:O(logn),基于冒泡排序 + 二分 + 递归分治)
  2. 堆排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(1),基于选择排序)
  3. 希尔排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(1),基于插入排序)
  4. 归并排序(稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(n),基于递归分治)

高级算法(时间复杂度为 n)

  1. 计数排序(稳定;时间复杂度:最好为 O(n+k),最差为 O(n+k),平均为 O(n+k);空间复杂度:O(n+k))
  2. 桶排序(稳定;时间复杂度:最好为 O(n),最差为 O(nlogn),平均为 O(n+c);空间复杂度:O(n+m))
  3. 基数排序(稳定;时间复杂度:最好为 O(d(n+r)),最差为 O(d(n+r)),平均为 O(d(n+r));空间复杂度:O(r))

附加2:数据结构相关算法题(chapter_ds)

  1. 最长公共子序列(动态规划)
  2. 最长公共子串(动态规划)
  3. 链表相关的考题:单链表反转,是否有环等等

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages