本工程用于剑指offer书籍的编程练习,语言是Java,环境是idea。
感兴趣的同学自行从master分支或者develop分支新建一个新的分支。命名方式为:branch-自己的英文名
- 每个人在自己的分支上开发
- 每周同步自己的分支一次,把这周学习的三道题目更新
- __不要__把自己分支的代码合并到master分支或者develop分支
- 每周五晚上查看大家的完成程度
- 孰能生巧,多写代码,少打游戏
剑指虐我千百遍,我待剑指如初恋
- 赋值运算符函数
- 实现Singleton模式(设计模式,参考)
- 二维数组中的查找(数组)
- 替换空格(不使用自带函数)(字符串)
- 从尾到头打印链表(栈、递归)(链表)
- 重建二叉树(前序、中序、后序遍历特点、递归)(树)
- 用两个栈实现对列(入队和出队)(栈和对列)
- 旋转数组的最小数字(二分查找变种)(查找和排序)
- 斐波那契数列(递归和循环,递归解法的弊端)
- 二进制中1的个数(位运算,减1求与的次数)
- 数值的整数次方(指数为负、数值为0等边界情况,递归解法)
- 打印1到最大的n位数(数组模拟、全排列、递归)
- 在O(1)时间删除链表节点(链表空、删除节点为头节点、尾节点等)
- 调整数组顺序使奇数位于偶数前面(两个指针)
- 链表中倒数第k个结点(链表空,k小于1,k大于链表长度,两个指针)
- 反转链表(链表空、只有一个节点)
- 合并两个排序的链表(某个链表为空)
- 树的子结构(两步:根节点是否相等,是否是子结构)
- 二叉树的镜像(递归,交换左右节点)
- 顺时针打印数组(循环条件,每圈打印数组的边界条件)
- 包含min函数的栈(利用辅助栈保存最小值)
- 栈的压入、弹出序列(熟悉入栈和出栈的过程)
- 从上往下打印二叉树(对列,先进先出)
- 二叉搜索树的后序遍历序列(二叉搜索树:左子树比根节点小,右子树比根节点大。后序遍历数组的特点)
- 二叉树中和为某一值的路径(递归、栈、举例模拟计算过程)
- 复杂链表的复制(三步:复制节点的next,复制节点的sibling,拆分链表)
- 二叉搜索树和双向链表(中序遍历、递归)
- 字符串的排列(全排列、递归、回溯)
- 数组中出现次数超过一半的数字(快排能改变数组O(n)、快速解法O(n))
- 最小的k个数(快排能改变数组O(n)、最大堆和额外k空间O(nlogk))
- 连续子数组的最大和(举例分析数组规律、动态规划)
- 从1到n整数中1出现的次数(最高位为1、其余位1、递归)
- 把数组排成最小的数(排序规则、快排、比较器)
- 丑数(数组保存已找到的数组、四个指针)
- 第一个只出现一次的字符(TreeMap保存字符及其出现次数、保证顺序)
- 数组中的逆序对(归并排序、辅助数组保存排序元素)
- 两个链表的第一个公共节点(辅助栈、先求长度差然后同时走直到第一次相遇)
- 数字在排序数组中出现的次数(二分查找得到第一个k的下标和最后一个k的下标)
- 二叉树的深度+是否为平衡二叉树(递归遍历)
- 数组中只出现一次的数字(异或、根据结果位1分成两个数组再求异或)
- 和为s的两个数字+和为s的连续正数序列(两个指针、首尾、首首)
- 翻转单词顺序VS左旋转字符串(整体旋转、部分旋转)
- n个骰子的点数(递归求解每种情况的次数)
- 扑克牌的顺子(判断大小王的数量是否不小于需要补上大小王的数量)
- 圆圈中最后剩下的数字(链表每次删除第m个元素得到最后一个元素、数学推导)
- 求1+2+...+n(函数递归调用)
- 不用加减乘除做加法(位运算、异或和与运算加循环、异或实现无进位加+与运算实现求进位+再循环求两个结果的和)
- 不能被继承的类(C相关,省略)
- 把字符串转换为整数(考虑字符串中存在非法字符、第一个字符为'+'或'-'或数字的情况等)
- 树中两个结点的最低公共祖先(四种场景:a. 二叉搜索树->二分搜索法; b. 普通树+指向父节点指针->两个链表第一个相交的节点; c. 普通树->递归左右子树判断 d. 普通树->辅助空间、两个链表保存根节点到指定节点的路径,最后一个相同的节点就是最低公共祖先节点)
- 冒泡排序(稳定;时间复杂度:最好为 O(n),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1),选择排序的一种)
- 选择排序(不稳定;时间复杂度:最好为 O(n^2),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1))
- 插入排序(稳定;时间复杂度:最好为 O(n),最差为 O(n^2),平均为 O(n^2);空间复杂度:O(1))
- 快速排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(n^2),平均为 O(nlogn);空间复杂度:O(logn),基于冒泡排序 + 二分 + 递归分治)
- 堆排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(1),基于选择排序)
- 希尔排序(不稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(1),基于插入排序)
- 归并排序(稳定;时间复杂度:最好为 O(nlogn),最差为 O(nlogn),平均为 O(nlogn);空间复杂度:O(n),基于递归分治)
- 计数排序(稳定;时间复杂度:最好为 O(n+k),最差为 O(n+k),平均为 O(n+k);空间复杂度:O(n+k))
- 桶排序(稳定;时间复杂度:最好为 O(n),最差为 O(nlogn),平均为 O(n+c);空间复杂度:O(n+m))
- 基数排序(稳定;时间复杂度:最好为 O(d(n+r)),最差为 O(d(n+r)),平均为 O(d(n+r));空间复杂度:O(r))
- 最长公共子序列(动态规划)
- 最长公共子串(动态规划)
- 链表相关的考题:单链表反转,是否有环等等