();
38 |
39 | while(!leftToRight.isEmpty() || !rightToLeft.isEmpty()){
40 | if(flag){
41 | //从左到右
42 | Node temp = leftToRight.pop();
43 | System.out.print(temp.data+" ");
44 | if(temp.lnode!=null){
45 | rightToLeft.add(temp.lnode);
46 | }
47 | if(temp.rnode!=null){
48 | rightToLeft.add(temp.rnode);
49 | }
50 |
51 | if(leftToRight.isEmpty()){
52 | System.out.println();
53 | flag=false;
54 | }
55 | }else{
56 | //从右到左
57 | Node temp = rightToLeft.pop();
58 | System.out.print(temp.data+" ");
59 | if(temp.lnode!=null){
60 | leftToRight.add(temp.rnode);
61 | }
62 | if(temp.rnode!=null) {
63 | leftToRight.add(temp.lnode);
64 | }
65 |
66 | if(rightToLeft.isEmpty()){
67 | System.out.println();
68 | flag=true;
69 | }
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/src/main/java/第五章_优化时间和空间效率/数组中出现次数超过一半的数字.java:
--------------------------------------------------------------------------------
1 | package 第五章_优化时间和空间效率;
2 |
3 | /**
4 | * 即然这个数字超过了一半,那么排序后,它一定是在数组中间位置 排序最快时间复杂度为nlogn
5 | *
6 | * 如果要求时间复杂度为O(n)话,上面这种方式就不合适了
7 | */
8 | public class 数组中出现次数超过一半的数字 {
9 |
10 | public static void main(String[] args) {
11 | int[] arr = {7, 6, 4, 7, 4, 3, 6, 7, 7, 7, 3, 7, 4, 7, 6, 7};
12 | int moreNum = findNumByPartition(arr);
13 | System.out.println(moreNum);
14 | }
15 |
16 | /**
17 | * 第一种 基于partition快排函数,partition位于函数的数组,
18 | */
19 | public static int findNumByPartition(int[] arr){
20 | if(arr==null || arr.length<=0){
21 | throw new RuntimeException("空的");
22 | }
23 | int partition = partition(arr, 0, arr.length - 1);
24 | while(partition!=arr.length/2){
25 | if(partition>arr.length/2){
26 | partition = partition(arr, 0, partition-1);
27 | }else{
28 | partition = partition(arr, partition+1, arr.length-1);
29 | }
30 | }
31 | if(partition==arr.length/2){
32 | return arr[partition];
33 | }
34 | return -1;
35 | }
36 | public static int partition(int[] arr, int left, int right) {
37 | int key = arr[left];
38 | while (left < right) {
39 | while (left < right && arr[right] >= key) {
40 | right--;
41 | }
42 | arr[left] = arr[right];
43 | while (left < right && arr[left] <= key) {
44 | left++;
45 | }
46 | arr[right]=arr[left];
47 | }
48 | arr[left]=key;
49 | return left;
50 | }
51 |
52 | /**
53 | * 第二种 记录元素的次数,相同+1,不同则减1
54 | *
55 | * @param arr
56 | * @return
57 | */
58 | public static int findMoreNum(int[] arr) {
59 | if (null == arr || arr.length <= 0) {
60 | return -1;
61 | }
62 | int result = arr[0];
63 | int times = 1;
64 | for (int i = 0; i < arr.length; i++) {
65 | if (times == 0) {
66 | result = arr[i];
67 | times = 1;
68 | } else if (arr[i] == result) {
69 | times++;
70 | } else {
71 | times--;
72 | }
73 | }
74 | return result;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/main/java/第四章_解决面试的思路/思考题_8个数字在正方体上三组相对的面上的4个顶点的和都相等.java:
--------------------------------------------------------------------------------
1 | package 第四章_解决面试的思路;
2 |
3 | import java.util.ArrayList;
4 | import java.util.Collections;
5 |
6 | /**
7 | * 与全排列相关的题目:
8 | * 输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和都相等。
9 | *
10 | * 其思路:
11 | * 先得到这8个数字的全排列,然后三个面的和相等即可.
12 | * a1+a2+a3+a4=a5+a6+a7+a8
13 | * a1+a3+a5+a7=a2+a4+a6+a8
14 | * a1+a2+a5+a6=a3+a4+a7_a8
15 | *
16 | */
17 | public class 思考题_8个数字在正方体上三组相对的面上的4个顶点的和都相等 {
18 |
19 | public static void main(String[] args) {
20 |
21 | String str = "12345678";
22 | // 得到全排列的结果
23 | ArrayList list = permutation(str);
24 | System.out.println("组合结果:"+list);
25 | // 判断是否有满足条件的
26 | isTrue(list);
27 | }
28 |
29 | private static void isTrue(ArrayList list) {
30 | if(list==null || list.size()<=0){
31 | return ;
32 | }
33 | for (String str:list) {
34 | char[] c = str.toCharArray();
35 | if((c[0]+c[1]+c[2]+c[3])==(c[4]+c[5]+c[6]+c[7]) &&
36 | (c[0]+c[2]+c[4]+c[6])==(c[1]+c[3]+c[5]+c[7]) &&
37 | (c[0]+c[1]+c[4]+c[6])==(c[2]+c[3]+c[6]+c[7])){
38 | System.out.println(String.valueOf(str));
39 | }
40 | }
41 | }
42 |
43 | public static ArrayList permutation(String str){
44 | if(str==null || str.length()<=0){
45 | return null;
46 | }
47 | ArrayList list = new ArrayList();
48 | char[] chars = str.toCharArray();
49 | permutation(chars,0,list);
50 | Collections.sort(list);
51 | return list;
52 | }
53 |
54 | public static void permutation(char[] str,int i,ArrayList list){
55 | if(str==null){
56 | return ;
57 | }
58 | if(i==str.length-1){
59 | //判断当前排列是否已经包含在列表中
60 | if(!list.contains(String.valueOf(str))){
61 | list.add(String.valueOf(str));
62 | }else{
63 | return;
64 | }
65 | }else{
66 | for(int j=i;j preOrderTraverse(Node node){
37 | List list = new ArrayList();
38 | if(node.lnode!=null){
39 | list.addAll(preOrderTraverse(node.lnode));
40 | }if(node.rnode!=null){
41 | list.addAll(preOrderTraverse(node.rnode));
42 | }
43 | return list;
44 | }
45 |
46 |
47 | /**
48 | * 先序式非递归式的
49 | * 思路:对于任意节点T,访问这个节点并压入栈中,然后访问节点的左子树,
50 | * 遍历完左子树后,取出栈顶的节点T,再先序遍历T的右子树
51 | * @param node
52 | */
53 | public void printBinaryTreePreUnrecur(Node node) {
54 | Node p=node;
55 | LinkedList nodes = new LinkedList();
56 | while(p!=null || !nodes.isEmpty()){
57 | if(p!=null){
58 | nodes.add(p);
59 | System.out.println(p.data);
60 | p=p.lnode;
61 | }else{
62 | p = nodes.poll();
63 | p = p.rnode;
64 | }
65 | }
66 | }
67 |
68 | /**
69 | * 非递归的中序
70 | *
71 | */
72 | public void printBinaryTreeMidUnrecur(Node node){
73 | Node p=node;
74 | LinkedList nodes = new LinkedList();
75 | while(p!=null || !nodes.isEmpty()){
76 | if(p!=null){
77 | nodes.add(p);
78 | p=p.lnode;
79 | }else{
80 | p = nodes.poll();
81 | System.out.println(p.lnode);
82 | p = p.rnode;
83 | }
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/src/main/java/第二章_面试需要的基础知识/重建二叉树.java:
--------------------------------------------------------------------------------
1 | package 第二章_面试需要的基础知识;
2 |
3 | import java.util.Stack;
4 |
5 | public class 重建二叉树 {
6 | // public static void main(String[] args) {
7 | // int [] preorder={1,2,4,7,3,5,6,8};
8 | // int [] inorder={4,7,2,1,5,3,8,6};
9 | // BinaryTreeNode root=constructCore(preorder,inorder);
10 | // print(root);
11 | // }
12 | //
13 | // private static BinaryTreeNode constructCore(int[] preorder, int[] inorder) {
14 | // if(null==preorder || null==inorder || (preorder.length!=inorder.length && preorder.length<=0)){
15 | // return null;
16 | // }
17 | //
18 | // return constructCore2(preorder,inorder);
19 | // }
20 | // private static BinaryTreeNode constructCore2(int[] preorder,int[] inorder) {
21 | // //根
22 | // BinaryTreeNode root = new BinaryTreeNode(preorder[0],null,null);
23 | // if(preorder.length==1){
24 | // return root;
25 | // }
26 | // //在中序遍历中找根结点
27 | // int index = getIndex(inorder, root.key);
28 | //
29 | // }
30 | //
31 | // //再先序输出该二叉树,递归的形式
32 | // private static void print(BinaryTreeNode root) {
33 | // if(root!=null){
34 | // System.out.println(root.key);
35 | // print(root.left);
36 | // print(root.right);
37 | // }
38 | // }
39 | // //非递归的形式
40 | // private static void printWhile(BinaryTreeNode root){
41 | // if(null==root){
42 | // return;
43 | // }
44 | // Stack nodes=new Stack();
45 | // nodes.add(root);
46 | //
47 | // while(nodes.isEmpty()){
48 | // BinaryTreeNode pop = nodes.pop();
49 | // if(null!=pop){
50 | // System.out.println(pop.key);
51 | // if(null!=pop.left){
52 | // nodes.push(pop.left);
53 | // }
54 | // if(null!=pop.right){
55 | // nodes.push(pop.right);
56 | // }
57 | // }
58 | // }
59 | //
60 | // }
61 | //
62 | // public static int getIndex(int[] array,int temp){
63 | // int index = -1;
64 | // for (int i = 0; i < array.length; i++) {
65 | // if (array[i]==temp) {
66 | // index = i;
67 | // return index;
68 | // }
69 | // }
70 | // return index;
71 | // }
72 | }
73 |
74 | /**
75 | * 树节点
76 | */
77 | class BinaryTreeNode{
78 | int key;
79 | BinaryTreeNode left;
80 | BinaryTreeNode right;
81 | public BinaryTreeNode(int key,BinaryTreeNode left,BinaryTreeNode right){
82 | this.key=key;
83 | this.left=left;
84 | this.right=right;
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # jzoffer
2 | java版剑指offer代码,包含剑指offer所有算法代码,统一用java语言进行了实现
3 | 对算法感兴趣的同学可以一起学习一下,或者将要找工作面试笔试的可以参考一下
4 |
5 | ## 算法口决
6 | * 难题首选动归
7 | * 受阻贪心暴力
8 | * 考虑分治思想
9 | * 配合排序哈希
10 |
11 | ## 第二章 面试需要的基础知识
12 | [面试题2.实现Singleton模式](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/Singleton%E6%A8%A1%E5%BC%8F.java)
13 | [面试题3.二维数组中的查找](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%9F%A5%E6%89%BE.java)
14 | [面试题4.替换空格](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.java)
15 | [面试题5.从尾到头打印链表](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E4%BB%8E%E5%B0%BE%E5%88%B0%E5%A4%B4%E6%89%93%E5%8D%B0%E9%93%BE%E8%A1%A8.java)
16 | [面试题6.重建二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E9%87%8D%E5%BB%BA%E4%BA%8C%E5%8F%89%E6%A0%91.java)
17 | [面试题7.用两个栈实现队列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.java)
18 | [面试题7.思考题-用两个队列实现栈](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E7%94%A8%E4%B8%A4%E4%B8%AA%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E6%A0%88.java)
19 | [面试题8.旋转数组的最小数字](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E6%97%8B%E8%BD%AC%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%B0%8F%E6%95%B0.java)
20 | [面试题9.斐波那契数列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97.java)
21 | [面试题9.青蛙跳台阶与变态跳台阶](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E8%B7%B3%E5%8F%B0%E9%98%B6%E4%B8%8E%E5%8F%98%E6%80%81%E8%B7%B3%E5%8F%B0%E9%98%B6.java)
22 | [面试题10.二进制中1的个数](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%8C%E7%AB%A0_%E9%9D%A2%E8%AF%95%E9%9C%80%E8%A6%81%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%AD1%E7%9A%84%E4%B8%AA%E6%95%B0.java)
23 | ## 第三章 高质量的代码
24 | [面试题11.数值的整数次方](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E6%95%B0%E5%80%BC%E7%9A%84%E6%95%B4%E6%95%B0%E6%AC%A1%E6%96%B9.java)
25 | [面试题12.打印1到最大的n位数 -](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E6%89%93%E5%8D%B01%E8%87%B3%E6%9C%80%E5%A4%A7%E7%9A%84n%E4%BD%8D%E6%95%B0.java)
26 | [面试题13.在O(1)时间删除链表结点](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E5%9C%A8O1%E6%97%B6%E9%97%B4%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%BB%93%E7%82%B9.java)
27 | [面试题14.调整数组顺序使奇数位于偶数前面](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E8%B0%83%E6%95%B4%E6%95%B0%E7%BB%84%E9%A1%BA%E5%BA%8F%E4%BD%BF%E5%A5%87%E6%95%B0%E4%BD%8D%E4%BA%8E%E5%81%B6%E6%95%B0%E5%89%8D%E9%9D%A2.java)
28 | [面试题14.调整数组顺序使奇数位于偶数前面且保持顺序](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E5%A5%87%E6%95%B0%E4%BD%8D%E4%BA%8E%E5%89%8D%E9%9D%A2%E5%81%B6%E6%95%B0%E4%BD%8D%E4%BA%8E%E5%90%8E%E9%9D%A2%E5%B9%B6%E4%B8%94%E4%B8%8D%E6%94%B9%E5%8E%9F%E5%9C%A8%E5%8E%9F%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E9%A1%BA%E5%BA%8F.java)
29 | [面试题15.链表中倒数第k个结点](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E9%93%BE%E8%A1%A8%E4%B8%AD%E5%80%92%E6%95%B0%E7%AC%ACk%E4%B8%AA%E7%BB%93%E7%82%B9.java)
30 | [面试题16.反转链表](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8.java)
31 | [面试题17.合并两个排序的链表](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%8E%92%E5%BA%8F%E7%9A%84%E9%93%BE%E8%A1%A8.java)
32 | [面试题18.树的子结构](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/%E6%A0%91%E7%9A%84%E5%AD%90%E7%BB%93%E6%9E%84.java)
33 | ## 第四章 解决面试题的思路
34 | [面试题19.二叉树的镜像](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%95%9C%E5%83%8F.java)
35 | [面试题20.顺时针打印矩阵](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E9%A1%BA%E6%97%B6%E9%92%88%E6%89%93%E5%8D%B0%E7%9F%A9%E9%98%B5.java)
36 | [面试题21.包含min函数的栈](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E5%8C%85%E5%90%ABmin%E5%87%BD%E6%95%B0%E7%9A%84%E6%A0%88.java)
37 | [面试题22.栈的压入、弹出序列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E6%A0%88%E7%9A%84%E5%8E%8B%E5%85%A5%E5%8F%8A%E5%BC%B9%E5%87%BA%E5%BA%8F%E5%88%97.java)
38 | [面试题23.从上往下打印二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BB%8E%E4%B8%8A%E5%BE%80%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91.java)
39 | [面试题23.从上往下打印二叉树按行打印](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BB%8E%E4%B8%8A%E5%BE%80%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91_%E6%8C%89%E8%A1%8C%E6%89%93%E5%8D%B0.java)
40 | [面试题23.之字打印二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%B9%8B%E5%AD%97%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91.java)
41 | [面试题24.二叉搜索树的后序遍历序列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97.java)
42 | [面试题25.二叉树中和为某一值的路径](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%92%8C%E4%B8%BA%E6%9F%90%E4%B8%80%E5%80%BC%E7%9A%84%E8%B7%AF%E5%BE%84.java)
43 | [面试题26.复杂链表的复制-](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E5%A4%8D%E6%9D%82%E9%93%BE%E8%A1%A8%E7%9A%84%E5%A4%8D%E5%88%B6.java)
44 | [面试题27.二叉搜索树与双向链表-]()
45 | [面试题28.字符串的排列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%8E%92%E5%88%97.java)
46 | [面试题28.字符串的组合](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E7%BB%84%E5%90%88.java)
47 | [面试题28.字符串的排列去重](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%85%A8%E6%8E%92%E5%88%97_%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D.java)
48 | [思考题 8个数字在正方体上三组相对的面上的4个顶点的和都相等](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E6%80%9D%E8%80%83%E9%A2%98_8%E4%B8%AA%E6%95%B0%E5%AD%97%E5%9C%A8%E6%AD%A3%E6%96%B9%E4%BD%93%E4%B8%8A%E4%B8%89%E7%BB%84%E7%9B%B8%E5%AF%B9%E7%9A%84%E9%9D%A2%E4%B8%8A%E7%9A%844%E4%B8%AA%E9%A1%B6%E7%82%B9%E7%9A%84%E5%92%8C%E9%83%BD%E7%9B%B8%E7%AD%89.java)
49 |
50 | ## 第五章 优化时间和空间效率
51 | [面试题29.数组中出现次数超过一半的数字](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%94%E7%AB%A0_%E4%BC%98%E5%8C%96%E6%97%B6%E9%97%B4%E5%92%8C%E7%A9%BA%E9%97%B4%E6%95%88%E7%8E%87/%E6%95%B0%E7%BB%84%E4%B8%AD%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0%E8%B6%85%E8%BF%87%E4%B8%80%E5%8D%8A%E7%9A%84%E6%95%B0%E5%AD%97.java)
52 | [面试题30.最小的k个数](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%94%E7%AB%A0_%E4%BC%98%E5%8C%96%E6%97%B6%E9%97%B4%E5%92%8C%E7%A9%BA%E9%97%B4%E6%95%88%E7%8E%87/%E6%9C%80%E5%B0%8F%E7%9A%84k%E4%B8%AA%E6%95%B0.java)
53 | [面试题31.连续子数组的最大和](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E4%BA%94%E7%AB%A0_%E4%BC%98%E5%8C%96%E6%97%B6%E9%97%B4%E5%92%8C%E7%A9%BA%E9%97%B4%E6%95%88%E7%8E%87/%E8%BF%9E%E7%BB%AD%E5%AD%90%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%A4%A7%E5%92%8C.java)
54 | ## 第六章 面试中的各项能力
55 | [面试题38.数字在排序数组中出现的次数](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E6%95%B0%E5%AD%97%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0.java)
56 | [面试题39.二叉树的深度](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6.java)
57 | [面试题39.判断二叉树是否平衡二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E5%88%A4%E6%96%AD%E4%BA%8C%E5%8F%89%E6%A0%91%E6%98%AF%E5%90%A6%E4%B8%BA%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.java)
58 | [面试题40.数组中只出现一次的数字](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E6%95%B0%E7%BB%84%E4%B8%AD%E5%8F%AA%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1%E7%9A%84%E6%95%B0%E5%AD%97.java)
59 | [面试题41.和为s的两个数](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E5%92%8C%E4%B8%BAs%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%95%B0.java)
60 | [面试题41.和为s的连续正数序列](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E5%92%8C%E4%B8%BAs%E7%9A%84%E8%BF%9E%E7%BB%AD%E6%AD%A3%E6%95%B0%E5%BA%8F%E5%88%97.java)
61 | [面试题42.翻转单词顺序](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E7%BF%BB%E8%BD%AC%E5%8D%95%E8%AF%8D%E9%A1%BA%E5%BA%8F.java)
62 | [面试题42.左旋字符串](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%85%AD%E7%AB%A0_%E9%9D%A2%E8%AF%95%E4%B8%AD%E7%9A%84%E5%90%84%E9%A1%B9%E8%83%BD%E5%8A%9B/%E5%AD%97%E7%AC%A6%E5%8F%8D%E8%BD%AC.java)
63 | ## 第八章 英文版新增面试题
64 | [面试题51.数组中重复的数字](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%95%B0%E7%BB%84%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E5%AD%97.java)
65 | [面试题56.链表中环的入口结点](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%8E%AF%E7%9A%84%E5%85%A5%E5%8F%A3%E7%BB%93%E7%82%B9.java)
66 | [面试题57.删除链表中重复的结点](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E7%BB%93%E7%82%B9.java)
67 | [面试题58.二叉树的下一个结点](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E4%B8%8B%E4%B8%80%E4%B8%AA%E7%BB%93%E7%82%B9.java)
68 | [面试题59.对称的二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E5%AF%B9%E7%A7%B0%E7%9A%84%E4%BA%8C%E5%8F%89%E6%A0%91.java)
69 | [面试题60.把二叉树打印成多行](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC8%E7%AB%A0_%E8%8B%B1%E6%96%87%E7%89%88%E6%96%B0%E5%A2%9E%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%A0%91%E6%89%93%E5%8D%B0%E6%88%90%E5%A4%9A%E8%A1%8C.java)
70 | [面试题61.按之字形顺序打印二叉树](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E7%AC%AC%E5%9B%9B%E7%AB%A0_%E8%A7%A3%E5%86%B3%E9%9D%A2%E8%AF%95%E7%9A%84%E6%80%9D%E8%B7%AF/%E4%BB%8E%E4%B8%8A%E5%BE%80%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91_%E6%8C%89%E8%A1%8C%E6%89%93%E5%8D%B0.java)
71 | ## 扩展——动态规划
72 | [不能相邻的两个数的最大和](https://github.com/lvCmx/jzoffer/tree/master/src/main/java/%E6%89%A9%E5%B1%95_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/%E4%B8%8D%E8%83%BD%E7%9B%B8%E9%82%BB%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%9A%84%E6%9C%80%E5%A4%A7%E5%92%8C)
73 | [最大的利益](https://github.com/lvCmx/jzoffer/tree/master/src/main/java/%E6%89%A9%E5%B1%95_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/%E6%9C%80%E5%A4%A7%E7%9A%84%E5%88%A9%E7%9B%8A)
74 | [求数组中的数之和为指定的数](https://github.com/lvCmx/jzoffer/tree/master/src/main/java/%E6%89%A9%E5%B1%95_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/%E6%B1%82%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%95%B0%E4%B9%8B%E5%92%8C%E4%B8%BA%E6%8C%87%E5%AE%9A%E7%9A%84%E6%95%B0)
75 | [连续子数组的最大和](https://github.com/lvCmx/jzoffer/blob/master/src/main/java/%E6%89%A9%E5%B1%95_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/%E8%BF%9E%E7%BB%AD%E5%AD%90%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%A4%A7%E5%92%8C/Main.java)
76 |
--------------------------------------------------------------------------------