diff --git a/.gitignore b/.gitignore
index 84afd6d..8091138 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,5 +11,3 @@ production
 
 #System
 .DS_Store
-
-Main.java
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Deque.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Deque.java
deleted file mode 100644
index 3ad9b22..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Deque.java	
+++ /dev/null
@@ -1,111 +0,0 @@
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 28/7/2017
- * @Description: 算法第四版-1.3.33
- */
-
-
-public class Deque<Item> implements Iterable<Item> {
-
-    private Node head = null;
-    private Node tail = null;
-    private int size = 0;
-
-    private class Node {
-
-        public Item item;
-        public Node pre;
-        public Node next;
-    }
-
-    public boolean isEmpty() {
-        return head == null;
-    }
-
-    public void pushLeft(Item item) {
-        Node node = new Node();
-        node.item = item;
-        node.pre = null;
-        if (isEmpty()) {
-            head = tail = node;
-            node.next = null;
-        } else {
-            head.pre = node;
-            node.next = head;
-            head = node;
-        }
-    }
-
-    public void pushRight(Item item) {
-        Node node = new Node();
-        node.item = item;
-        node.next = null;
-        if (isEmpty()) {
-            head = tail = node;
-            node.pre = null;
-        } else {
-            tail.next = node;
-            node.pre = tail;
-            tail = node;
-        }
-        size++;
-    }
-
-    public Item popLeft() {
-        if (isEmpty()) {
-            return null;
-        } else {
-            Item item = head.item;
-            if (this.size == 1) {
-                head = tail = null;
-            } else {
-                head = head.next;
-                head.pre.next = null;
-                head.pre = null;
-            }
-            size--;
-            return item;
-        }
-    }
-
-    public Item popright(){
-        if (isEmpty()) {
-            return null;
-        }else {
-            Item item = tail.item;
-            if (size == 1){
-                head = tail = null;
-            }else {
-                tail = tail.pre;
-                tail.next.pre = null;
-                tail.next = null;
-            }
-            size--;
-            return item;
-        }
-    }
-
-    @Override
-    public Iterator<Item> iterator(){
-        return new Iter();
-    }
-
-    private class Iter implements Iterator<Item>{
-        private Node current = head;
-
-        @Override
-        public boolean hasNext(){
-            return current != null;
-        }
-
-        @Override
-        public Item next(){
-            Item item = current.item;
-            current = current.next;
-            return item;
-        }
-    }
-
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/JosephusQueue.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/JosephusQueue.java
deleted file mode 100644
index 403e318..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/JosephusQueue.java	
+++ /dev/null
@@ -1,101 +0,0 @@
-import edu.princeton.cs.algs4.StdOut;
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 30/7/2017
- * @Description: 算法第四版-1.3.37
- */
-
-public class JosephusQueue<Item> implements Iterable<Item> {
-
-    private Node first;
-    private Node last;
-    private int N;
-
-    class Node {
-
-        private Node next;
-        private Item item;
-    }
-
-    public JosephusQueue() {
-        first = null;
-        last = null;
-    }
-
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public void enqueue(Item item) {
-        Node x = new Node();
-        x.item = item;
-        if (first == null) {
-            first = x;
-            last = x;
-        } else {
-            last.next = x;
-            last = last.next;
-        }
-        N++;
-    }
-
-    private Item dequeue() {
-        if (isEmpty()) {
-            throw new RuntimeException("Empty JosephusQueue");
-        }
-        Item temp = first.item;
-        first = first.next;
-        N--;
-        if (isEmpty()) {
-            last = null;
-        }
-        return temp;
-    }
-
-    @Override
-    public Iterator<Item> iterator() {
-        return new queueIterator();
-    }
-
-    public class queueIterator implements Iterator<Item> {
-
-        private Node current = first;
-        private Node temp;
-
-        @Override
-        public boolean hasNext() {
-            return current != null;
-        }
-
-        @Override
-        public Item next() {
-            temp = current;
-            current = current.next;
-            return temp.item;
-        }
-    }
-
-
-    public static void main(String[] args) {
-        JosephusQueue<Integer> queue = new JosephusQueue<>();
-        int N = Integer.parseInt(args[0]);   //人数为N
-        int M = Integer.parseInt(args[1]);   //报到M的人出列
-
-        for (int i = 0; i < N; i++) {
-            queue.enqueue(new Integer(i));
-        }
-
-
-
-        //每次将M前面的人重新入列,生成了从M+1开始的队列.
-        while (!queue.isEmpty()) {
-            for (int i = 0; i < M -1 ; i++) {
-                queue.enqueue(queue.dequeue());
-            }
-            StdOut.print(queue.dequeue() + " ");
-        }
-        StdOut.println();
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/List.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/List.java
deleted file mode 100644
index a9e9d13..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/List.java	
+++ /dev/null
@@ -1,109 +0,0 @@
-import edu.princeton.cs.algs4.StdIn;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @User: Changle
- * @Date: 27/7/2017
- * @Description: 算法第四版-1.3.30
- */
-
-
-public class List<Item> implements Iterable<Item> {
-
-    private int N;
-    private Node first;
-    private Node last;
-
-    private class Node {
-
-        private Item item;
-        private Node next;
-    }
-
-    public List() {
-        first = null;
-        last = null;
-    }
-
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public int size() {
-        return N;
-    }
-
-    public void append(Item item) {
-        Node x = new Node();
-        x.item = item;
-        if (isEmpty()) {
-            first = x;
-            last = x;
-        } else {
-            last.next = x;
-            last = x;
-        }
-        N++;
-    }
-
-    @Override
-    public Iterator<Item> iterator() {
-        return new ListIterator();
-    }
-
-    private class ListIterator implements Iterator<Item> {
-
-        private Node current = first;
-
-        public boolean hasNext() {
-            return current != null;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        public Item next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            Item item = current.item;
-            current = current.next;
-            return item;
-        }
-    }
-
-
-    public void reverseRec() {
-        first = reverseRec(first);
-    }
-
-    private Node reverseRec(Node node) {
-        return reverseRec(node, null);
-    }
-
-    private Node reverseRec(Node srcFirst, Node destFirst) {
-        if (srcFirst == null) {
-            return destFirst;
-        } else {
-            Node next = srcFirst.next;
-            srcFirst.next = destFirst;
-            return reverseRec(next, srcFirst);
-        }
-    }
-
-    public static void main(String[] args) {
-        List<String> list1 = new List<>();
-        while (!StdIn.isEmpty()) {
-            String s = StdIn.readString();
-            list1.append(s);
-        }
-
-        list1.reverseRec();
-        for (String s : list1) {
-            System.out.print(s + " ");
-        }
-    }
-}
\ No newline at end of file
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Queue.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Queue.java
deleted file mode 100644
index b63dd09..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Queue.java	
+++ /dev/null
@@ -1,108 +0,0 @@
-import edu.princeton.cs.algs4.StdIn;
-import edu.princeton.cs.algs4.StdOut;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-
-/**
- * @User: Changle
- * @Date: 26/7/2017
- * @Description: 算法第四版-1.3.29
- */
-
-
-public class Queue<Item> implements Iterable<Item> {
-
-    private Node last;
-    private int N;
-
-    public Queue() {
-        last = null;
-    }
-
-    public boolean isEmpty() {
-        return N == 0;
-    }
-
-    public int size() {
-        return N;
-    }
-
-    public void enqueue(Item item) {
-        Node x = new Node();
-        x.item = item;
-        if (isEmpty()) {
-            x.next = x;
-        } else {
-            x.next = last.next;
-            last.next = x;
-        }
-        last = x;
-        N++;
-    }
-
-    public Item dequeue() {
-        if (isEmpty()) {
-            throw new RuntimeException("Queue is Empty!");
-        }
-        Item item = last.next.item;
-        if (last.next == last) {
-            last = null;
-        } else {
-            last.next = last.next.next;
-        }
-        N--;
-        return item;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder s = new StringBuilder();
-        for (Item i : this) {
-            s.append(i + "");
-        }
-        return s.toString();
-    }
-
-    class Node {
-        private Node next;
-        private Item item;
-    }
-
-
-    @Override
-    public Iterator iterator() {
-        return new ListIterator();
-    }
-
-    public class ListIterator implements Iterator<Item> {
-        private int n = N;
-        private Node current = last;
-
-        public boolean hasNext() {
-            return n > 0;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        public Item next() {
-            if (!hasNext()) throw new NoSuchElementException();
-            Item item = current.next.item;
-            current = current.next;
-            n--;
-            return item;
-        }
-    }
-
-    public static void main(String[] args) {
-        Queue<String> q = new Queue<>();
-        while (!StdIn.isEmpty()) {
-            String item = StdIn.readString();
-            if (!item.equals("-")) q.enqueue(item);
-            else if (!q.isEmpty()) StdOut.print(q.dequeue() + " ");
-        }
-        StdOut.println("(" + q.size() + " left on queue: [ " + q + "])");
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomBag.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomBag.java
deleted file mode 100644
index f05dc95..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomBag.java	
+++ /dev/null
@@ -1,90 +0,0 @@
-import edu.princeton.cs.algs4.StdOut;
-import edu.princeton.cs.algs4.StdRandom;
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 29/7/2017
- * @Description: 算法第四版-1.3.34
- */
-
-public class RandomBag<Item> implements Iterable<Item> {
-
- private Item[] item;
- private int N;
-
- @SuppressWarnings("unchecked")
- public RandomBag(int cap) {
-  if (cap <= 0) {
-   throw new RuntimeException("背包不存在");
-  }
-  item = (Item[]) new Object[cap];
- }
-
- public boolean isEmpty() {
-  return N == 0;
- }
-
- public boolean isFull() {
-  return N == item.length;
- }
-
- @SuppressWarnings("unchecked")
- public void resize(int n) {
-  Item[] temp = (Item[]) new Object[n];
-  for (int i = 0; i < N; i++) {
-   temp[i] = item[i];
-  }
-  item = temp;
- }
-
- public int size() {
-  return N;
- }
-
- public void add(Item data) {
-  if (isFull()) {
-   resize(2 * N);
-  }
-  item[N++] = data;
- }
-
- public Iterator<Item> iterator() {
-  return new RandomBagIterator();
- }
-
- private class RandomBagIterator implements Iterator<Item> {
-
-  private int current = 0;
-
-  //随机打乱数组(洗牌算法)
-  public RandomBagIterator() {
-   for (int i = 0; i < N; i++) {
-    int r = i + StdRandom.uniform(N - i);
-    Item temp = (Item) item[i];
-    item[i] = item[r];
-    item[r] = temp;
-   }
-  }
-
-  @Override
-  public boolean hasNext() {
-   return current != N;
-  }
-
-  @Override
-  public Item next() {
-   return (Item) item[current++];
-  }
- }
-
-
- public static void main(String[] args) {
-  RandomBag<Integer> rb = new RandomBag<>(6);
-  for (int i = 0; i < 10; i++) {
-   rb.add(i);
-  }
-  for (Integer t : rb)
-   StdOut.print(t + " ");
- }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueue.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueue.java
deleted file mode 100644
index 28c2c7e..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueue.java	
+++ /dev/null
@@ -1,124 +0,0 @@
-import edu.princeton.cs.algs4.StdRandom;
-
-/**
- * @User: Changle
- * @Date: 29/7/2017
- * @Description: 算法第四版-1.3.35
- */
-
-public class RandomQueue<Item> {
-
- private Item[] item;
- private int N;
-
- public RandomQueue() {
-  item = (Item[]) new Object[10];
- }
-
- public boolean isEmpty() {
-  return N == 0;
- }
-
- @SuppressWarnings("unchecked")
- public void resize(int n) {
-  Item[] temp = (Item[]) new Object[n];
-  for (int i = 0; i < N; i++) {
-   temp[i] = item[i];
-  }
-  item = temp;
- }
-
- public void enqueue(Item data) {
-  if (N == item.length) {
-   resize(2 * N);
-  }
-  item[N++] = data;
- }
-
- public Item dequeue() {
-  if (isEmpty()) {
-   return null;
-  }
-  int r = StdRandom.uniform(N);
-  Item temp = item[r];
-  item[r] = item[--N];
-  item[N] = null;
-  return temp;
- }
-
- public Item sample() {
-  if (isEmpty()) {
-   return null;
-  }
-  int r = StdRandom.uniform(N);
-  Item ret = item[r];
-  return ret;
- }
-
- public int size() {
-  return N;
- }
-
- //分发牌,根据enqueue方法可以确定不会发出两张相同的牌
- public RandomQueue<Item> sendCard(){
-  RandomQueue<Item> queue = new RandomQueue<>();
-  for (int i = 0; i < 13;i++){
-   queue.enqueue(this.dequeue());
-  }
-  return queue;
- }
-
- //展示每个人获得的牌
- public void display(){
-  for (int i = 0; i < 13; i++) {
-   System.out.print(this.dequeue() + " ");
-  }
-  System.out.println();
- }
-
- public static void main(String[] args) {
-  RandomQueue<Card>  cardQueue = new RandomQueue<>();
-
-  String[] fget = {"黑桃", "红桃", "梅花", "方块"};
-  String[] nget = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
-
-
-  //将牌放入容器内
-  for (int i = 0; i < fget.length ; i++) {
-   for (int j = 0; j < nget.length ; j++) {
-    cardQueue.enqueue(new Card(fget[i],nget[j]));
-   }
-  }
-
-  //将牌分发到四个玩家手中并展示四个玩家的牌
-  for (int i = 0;i < 4;i++){
-   cardQueue.sendCard().display();
-  }
-
-
- }
-
-}
-
-class Card {
-
- private String num;
- private String flowercolor;
- private String cardName;
-
-
-
- public Card(String flowercolor, String num) {
-
-  cardName = flowercolor + num;
-
- }
-
- @Override
- public String toString() {
-  return cardName;
- }
-
-
-
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueueIterator.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueueIterator.java
deleted file mode 100644
index abb1b32..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/RandomQueueIterator.java	
+++ /dev/null
@@ -1,105 +0,0 @@
-import edu.princeton.cs.algs4.In;
-import edu.princeton.cs.algs4.StdOut;
-import edu.princeton.cs.algs4.StdRandom;
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 30/7/2017
- * @Description: 算法第四版-1.3.36
- */
-
-public class RandomQueueIterator<Item> implements Iterable<Item> {
-
-    private Item[] arr = (Item[]) new Object[1];
-    private int N;
-
-    public boolean isEmpty() {
-        return N == 0;
-    }
-
-    public int size() {
-        return N;
-    }
-
-    private void resize(int cap) {
-        Item[] temp = (Item[]) new Object[cap];
-        for (int i = 0; i < N; i++) {
-            temp[i] = arr[i];
-        }
-        arr = temp;
-    }
-
-    public void enqueue(Item item) {
-        if (N == arr.length) {
-            resize(2 * arr.length);
-        }
-        arr[N++] = item;
-    }
-
-    public Item dequeue() {
-        int index = StdRandom.uniform(N);
-        Item indexTemp = arr[index];
-        arr[index] = arr[--N];
-        arr[N] = indexTemp;
-        Item temp = arr[N];
-        arr[N] = null;
-        if (N == arr.length / 4) {
-            resize(arr.length / 2);
-        }
-        return temp;
-    }
-
-    public Item sample() {
-        int index = StdRandom.uniform(N);
-        return arr[index];
-    }
-
-    @Override
-    public Iterator<Item> iterator() {
-        return new RandomIterator();
-    }
-
-    public class RandomIterator implements Iterator<Item> {
-
-        int[] randomArray = randomIntArray(N);
-        int size = N;
-
-        @Override
-        public boolean hasNext() {
-            return size > 0;
-        }
-
-        @Override
-        public Item next() {
-            return arr[randomArray[--size]];
-        }
-    }
-
-    //随机打乱数组
-    private int[] randomIntArray(int N) {
-        int[] tmp = new int[N];
-
-        for (int i = 0; i < N; i++) {
-            tmp[i] = i;
-        }
-        for (int i = N; i > 0; i--) {
-            int index = StdRandom.uniform(i);
-
-            int temp = tmp[index];
-            tmp[index] = tmp[i - 1];
-            tmp[i - 1] = temp;
-        }
-        return tmp;
-    }
-
-    public static void main(String[] args) {
-        RandomQueueIterator<Integer> queue = new RandomQueueIterator<>();
-        for (int i = 0; i < 7; i++) {
-            queue.enqueue(i);
-        }
-
-        for (int i : queue)
-            StdOut.print(i + " ");
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/ResizingArrayDeque.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/ResizingArrayDeque.java
deleted file mode 100644
index d81213b..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/ResizingArrayDeque.java	
+++ /dev/null
@@ -1,127 +0,0 @@
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 28/7/2017
- * @Description: 算法第四版-1.3.33
- */
-
-public class ResizingArrayDeque<Item> implements Iterable<Item> {
-
-    private int head;
-    private int tail;
-    private Item[] deque;
-
-    @SuppressWarnings("unchecked")
-    public ResizingArrayDeque() {
-        deque = (Item[]) new Object[3];
-        head = 1;
-        tail = 1;
-    }
-
-    public boolean isEmpty() {
-        return head == tail;
-    }
-
-    public int size() {
-        return tail - head;
-    }
-
-    public void pushLeft(Item item) {
-        if (head == 0) {
-            resize(3 * size());
-        }
-        deque[--head] = item;
-    }
-
-    public void pushRight(Item item) {
-        if (tail == deque.length) {
-            resize(3 * size());
-        }
-        deque[tail++] = item;
-    }
-
-    public Item popLeft() {
-        if (isEmpty()) {
-            return null;
-        }
-        if (size() * 6 < deque.length) {
-            resize(size() * 3);
-        }
-        return deque[head++];
-    }
-
-    public Item popRight() {
-        if (isEmpty()) {
-            return null;
-        }
-        if (size() * 6 < deque.length) {
-            resize(size() * 3);
-        }
-        return deque[--tail];
-    }
-
-    @SuppressWarnings("unchecked")
-    private void resize(int size) {
-        if (size < 3) {
-            size = 3;
-        }
-        Item tmp[] = (Item[]) new Object[size];
-        int j = size / 3;
-        for (int i = head; i < tail; i++) {
-            tmp[j++] = deque[i];
-        }
-        deque = tmp;
-        head = size / 3;
-        tail = j;
-    }
-
-    @Override
-    public Iterator<Item> iterator() {
-        return new Iter();
-    }
-
-    private class Iter implements Iterator<Item> {
-
-        private int current = head;
-
-        @Override
-        public boolean hasNext() {
-            return current < tail;
-        }
-
-        @Override
-        public Item next() {
-            Item item = deque[current++];
-            return item;
-        }
-
-
-    }
-
-    public static void main(String[] args) {
-        ResizingArrayDeque<String> deque = new ResizingArrayDeque<>();
-        deque.pushLeft("c");
-        deque.pushLeft("b");
-        deque.pushRight("d");
-        deque.pushRight("e");
-        System.out.println("deque size: " + deque.size());
-        for (String string:deque){
-            System.out.println(string);
-        }
-        System.out.println("Pop up from right: ");
-        while (!deque.isEmpty()) {
-            System.out.println(deque.popRight());
-        }
-
-        deque.pushLeft("c");
-        deque.pushLeft("b");
-        deque.pushRight("d");
-        deque.pushRight("e");
-        System.out.println("Pop up from left: ");
-        while (!deque.isEmpty()){
-            System.out.println(deque.popLeft());
-        }
-    }
-
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Steque.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Steque.java
deleted file mode 100644
index c980d4e..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/Steque.java	
+++ /dev/null
@@ -1,101 +0,0 @@
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 28/7/2017
- * @Description: 算法第四版-1.3.32
- */
-
-
-public class Steque<Item> implements Iterable<Item> {
-
-    private Node first;
-    private Node last;
-
-    private class Node {
-
-        public Item item;
-        public Node next;
-    }
-
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public void enqueue(Item item) {
-        Node node = new Node();
-        node.item = item;
-        node.next = null;
-        if (isEmpty()) {
-            first = node;
-            last = node;
-        } else {
-            last.next = node;
-            last = node;
-        }
-    }
-
-    public void push(Item item) {
-        Node node = new Node();
-        node.item = item;
-        node.next = null;
-        if (isEmpty()) {
-            first = node;
-            last = node;
-        } else{
-            node.next = first;
-            first = node;
-        }
-    }
-
-    public Item pop(){
-        if (isEmpty()){
-            return null;
-        }
-        else {
-            Item e = first.item;
-            first = first.next;
-            return e;
-        }
-    }
-
-    @Override
-    public Iterator<Item> iterator(){
-        return new Iter();
-    }
-
-    private class Iter implements Iterator<Item>{
-        private Node current = first;
-
-        @Override
-        public boolean hasNext(){
-            return current != null;
-        }
-
-        @Override
-        public Item next(){
-            Item item = current.item;
-            current = current.next;
-            return item;
-        }
-    }
-
-    public static void main(String[] args) {
-        Steque<String> s = new Steque<>();
-        s.enqueue("d");
-        s.enqueue("e");
-        s.enqueue("f");
-        s.push("c");
-        s.push("b");
-        s.push("a");
-        System.out.println("Steque is:");
-        for (String string:s){
-            System.out.println(string);
-        }
-
-        System.out.println("pop up:");
-        while (!s.isEmpty()){
-            System.out.println(s.pop());
-        }
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/doubleLinkedList.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/doubleLinkedList.java
deleted file mode 100644
index 24921f3..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/doubleLinkedList.java	
+++ /dev/null
@@ -1,198 +0,0 @@
-import edu.princeton.cs.algs4.StdOut;
-import java.util.Iterator;
-
-/**
- * @User: Changle
- * @Date: 27/7/2017
- * @Description: 算法第四版-1.3.31
- */
-
-
-public class doubleLinkedList<Item> {
-
-    private DoubleNode first;
-    private DoubleNode last;
-    private DoubleNode temp;
-
-    class DoubleNode {
-
-        private DoubleNode next;
-        private DoubleNode pre;
-        private Item item;
-    }
-
-    public doubleLinkedList() {
-        first = null;
-        last = null;
-    }
-
-    private boolean isEmpty() {
-        return first == null;
-    }
-
-    private void addFirst(Item item) {
-        DoubleNode x = new DoubleNode();
-        x.item = item;
-        if (this.isEmpty()) {
-            first = x;
-            last = x;
-        } else {
-            x.next = first;
-            first.pre = x;
-            first = x;
-        }
-    }
-
-    private void addLast(Item item) {
-        DoubleNode x = new DoubleNode();
-        x.item = item;
-        if (this.isEmpty()) {
-            first = x;
-            last = x;
-        } else {
-            x.pre = last;
-            last.next = x;
-            last = x;
-        }
-    }
-
-    private void deleteFirst() {
-        if (isEmpty()) {
-            throw new RuntimeException("Unsupport Operator!");
-        }
-        if (first.next == null) {
-            temp = first;
-            first = null;
-            last = null;
-
-        } else {
-            temp = first;
-            first.next.pre = null;
-            first = first.next;
-            temp.next = null;
-        }
-    }
-
-    private void deleteLast() {
-        if (isEmpty()) {
-            throw new RuntimeException("Unsupport Operator!");
-        }
-        if (last.pre == null) {
-            temp = last;
-            first = null;
-            last = null;
-        } else {
-            temp = last;
-            last.pre.next = null;
-            last = last.pre;
-            temp.pre = null;
-        }
-
-    }
-
-    private void insertBefore(DoubleNode dbNode, DoubleNode pos) {
-        if (dbNode == null) {
-            throw new RuntimeException("ERROR!");
-        }
-        if (pos == first) {
-            first.pre = dbNode;
-            dbNode.next = first;
-            first = dbNode;
-        } else {
-            dbNode.next = pos;
-            pos.pre.next = dbNode;
-            dbNode.pre = pos.pre;
-            pos.pre = dbNode;
-        }
-    }
-
-    private void insertAfter(DoubleNode dbNode, DoubleNode pos) {
-        if (dbNode == null) {
-            throw new RuntimeException("ERROR!");
-        }
-        if (pos == last) {
-            last.next = dbNode;
-            dbNode.pre = last;
-            last = dbNode;
-        } else {
-            dbNode.next = pos.next;
-            pos.next = dbNode;
-            dbNode.pre = pos;
-            pos.next.pre = dbNode;
-        }
-
-    }
-
-    private void deleteTheNode(DoubleNode dbNode) {
-        if (dbNode == null) {
-            throw new RuntimeException("ERROR!");
-        }
-        if (dbNode == first) {
-            deleteFirst();
-        } else if (dbNode == last) {
-            deleteLast();
-        } else {
-            temp = dbNode;
-            dbNode.pre.next = dbNode.next;
-            dbNode.next.pre = dbNode.pre;
-            dbNode = null;
-        }
-    }
-
-    private void display() {
-        if (first == null) {
-            return;
-        }
-        DoubleNode current = first;
-        while (current != null) {
-            StdOut.print(current.item + " ");
-            current = current.next;
-        }
-        StdOut.println();
-    }
-
-    public DoubleNode getPos(int i)
-    {
-        if (first == null)
-            return null;
-        if (i == 1)
-            return first;
-        int count = 1;
-        DoubleNode current = first;
-        while (current.next != null)
-        {
-            current = current.next;
-            if (++count == i)
-                return current;
-        }
-        return null;
-    }
-
-    public DoubleNode getNode(Item data)
-    {
-        DoubleNode ret = new DoubleNode();
-        ret.item = data;
-        return ret;
-    }
-
-
-    public static void main(String[] args) {
-        doubleLinkedList<Integer> dl = new doubleLinkedList<>();
-        for (int i = 1; i <= 10; ++i) {
-            dl.addLast(i);
-        }
-        dl.addFirst(0);
-        dl.display();
-        dl.deleteLast();
-        dl.deleteFirst();
-        dl.display();
-        dl.deleteTheNode(dl.getPos(2));
-        dl.deleteTheNode(dl.getPos(3));
-        dl.display();
-        dl.insertBefore(dl.getNode(1), dl.getPos(1));
-        dl.insertAfter(dl.getNode(5), dl.getPos(4));
-        dl.display();
-
-    }
-
-}
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/maxList.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/maxList.java
deleted file mode 100644
index 647789b..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/maxList.java	
+++ /dev/null
@@ -1,134 +0,0 @@
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @User: Changle
- * @Date: 25/7/2017
- * @Description: 算法第四版-1.3.27
- */
-
-public class maxList<Item> implements Iterable<Item> {
-
-    private Node first;
-    private Node last;
-    private int N;
-
-    private class Node {
-
-        private Node next;
-        private Item item;
-    }
-
-    public maxList() {
-        first = null;
-        last = null;
-    }
-
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public void append(Item item) {
-        Node x = new Node();
-        x.item = item;
-        if (isEmpty()) {
-            first = x;
-            last = x;
-        } else {
-            last.next = x;
-            last = x;
-        }
-        N++;
-    }
-
-
-    public String toString() {
-        StringBuilder s = new StringBuilder();
-        for (Item item : this) {
-            s.append(item + " ");
-        }
-        return s.toString();
-    }
-
-    @Override
-    public Iterator<Item> iterator() {
-        return new ListIterator();
-    }
-
-    private class ListIterator implements Iterator<Item> {
-
-        private Node current = first;
-
-        public boolean hasNext() {
-            return current != null;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        public Item next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            Item item = current.item;
-            current = current.next;
-            return item;
-        }
-    }
-
-
-    //  1.3.27 接受一个结点作为参数,返回链表中键的最大的结点的值.
-    public Item max(Node first) throws Exception {
-        Item max;
-        Node current = first;
-
-        if (first == null) {
-            return (Item) new Integer(0);
-        } else {
-            max = first.item;
-            while (current.next != null) {
-                current = current.next;
-                if (((Comparable) max).compareTo(current.item) < 0) {
-                    max = current.item;
-                }
-            }
-        }
-        return max;
-    }
-
-    // 1.3.28 用递归实现1.3.27
-  /*  public Item max(Node node) {
-        if (node == null)
-            return (Item) new Integer(0);
-        if (node.next == null)
-            return node.item;
-        else {
-            Item maxItem = max(node.next);
-            return ((Comparable) node.item).compareTo(maxItem) > 0 ? node.item : maxItem;
-        }
-    }*/
-
-    public static void main(String[] args) throws Exception {
-        maxList<Integer> list = new maxList<>();
-        list.append(1);
-        list.append(3);
-        list.append(5);
-        list.append(5);
-        list.append(3);
-        list.append(4);
-        list.append(7);
-        list.append(2);
-        for (Integer i : list) {
-            System.out.println(i);
-        }
-
-        System.out.println();
-
-        int max = list.max(list.first);
-
-        System.out.println(max);
-
-    }
-}
-
diff --git a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/removeItemEqualsKey.java b/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/removeItemEqualsKey.java
deleted file mode 100644
index e8dc6f8..0000000
--- a/Algorithm4th/1-Fundamentals/1.3 BagsQueuesStacks/src/removeItemEqualsKey.java	
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @User: Changle
- * @Date: 25/7/2017
- * @Description: 算法第四版—1.3.26
- */
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-public class removeItemEqualsKey extends LinkedList<String> {
-    public removeItemEqualsKey() {
-    }
-
-    private static LinkedList<String> remove(LinkedList<String> list, String key) {
-        ListIterator iterator = list.listIterator();
-        while(iterator.hasNext()) {
-            String current = (String)iterator.next();
-            if (current.equals(key)) {
-                iterator.remove();
-            }
-        }
-
-        return list;
-    }
-
-    public static void main(String[] args) {
-        LinkedList<String> list = new LinkedList<>();
-        list.add("a");
-        list.add("b");
-        list.add("c");
-        list.add("d");
-        list.add("d");
-        list.add("c");
-        list.add("b");
-        list.add("b");
-
-        for (String s:list){
-            System.out.println(s);
-        }
-        System.out.println();
-
-        LinkedList<String> newList = remove(list, "c");
-
-        for (String ss:newList) {
-
-            System.out.println(ss);
-        }
-
-    }
-}
-
diff --git a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickFindUF.java b/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickFindUF.java
deleted file mode 100644
index 3ae640f..0000000
--- a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickFindUF.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-15 00:33
- */
-public class QuickFindUF {
-
-    /**
-     *  并查集中结点的个数
-     */
-    private int[] id;
-
-    public QuickFindUF(int N) {
-        id = new int[N];
-        for (int i = 0; i < id.length; i++) {
-            id[i] = i;
-        }
-    }
-
-    /**
-     * 联通 p 和 q 结点
-     */
-    public void union(int p, int q) {
-        int pid = id[p];
-        int qid = id[q];
-        for (int index : id) {
-            if (id[index] == pid) {
-                id[index] = qid;
-            }
-        }
-    }
-
-    /**
-     * p 和 q 是否联通
-     */
-    public boolean connected(int p, int q) {
-        return id[p] == id[q];
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickUnionUF.java b/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickUnionUF.java
deleted file mode 100644
index f0a0351..0000000
--- a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/QuickUnionUF.java	
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-15 01:12
- */
-public class QuickUnionUF {
-
-    private int[] id;
-
-    public QuickUnionUF(int N) {
-        id = new int[N];
-        for (int i = 0; i < N; i++) {
-            id[i] = i;
-        }
-    }
-
-    /**
-     * 寻找结点 i 的根节点
-     */
-    private int root(int i) {
-        while (i != id[i]) {
-            i = id[i];
-        }
-        return i;
-    }
-
-    public boolean connected(int p, int q) {
-        return root(p) == root(q);
-    }
-
-    public void union(int p, int q) {
-        int i = root(p);
-        int j = root(q);
-        id[i] = j;
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/WeightedQuickUnionUF.java b/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/WeightedQuickUnionUF.java
deleted file mode 100644
index 523064e..0000000
--- a/Algorithm4th/1-Fundamentals/1.5 Union-Find/src/WeightedQuickUnionUF.java	
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-15 01:35
- */
-public class WeightedQuickUnionUF {
-
-    private int[] id;
-    private int[] sz;
-    private int count;
-
-    public WeightedQuickUnionUF(int N) {
-        count = N;
-        id = new int[N];
-        for (int index : id) {
-            id[index] = index;
-        }
-        sz = new int[N];
-        for (int index : sz) {
-            sz[index] = 1;
-        }
-    }
-
-    public boolean connected(int p, int q) {
-        return find(p) == find(q);
-    }
-
-    private int find(int p) {
-        while (p != id[p]) {
-            p = id[p];
-        }
-        return p;
-    }
-
-    public void union(int p, int q) {
-        int i = find(p);
-        int j = find(q);
-        if (i == j) {
-            return;
-        }
-        if (sz[i] < sz[j]) {
-            id[i] = j;
-            sz[j] += sz[i];
-        } else {
-            id[j] = i;
-            sz[i] += sz[j];
-        }
-        count--;
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/FindLargestUF.java b/Algorithm4th/1-Fundamentals/InterviewQuestions/src/FindLargestUF.java
deleted file mode 100644
index 57e06b9..0000000
--- a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/FindLargestUF.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-16 02:07 description： Add a method find() to the union-find data type so that
- * find(i) returns the largest element in the connected component containing i. The operations,
- * union(),connected(), and find() should all take logarithmic time or better. For example, if one
- * of the connected components is {1, 2, 6, 9}, then find() method should return 99 for each of the
- * four elements in the connected components.
- */
-public class FindLargestUF {
-
-    private int[] id;
-    private int[] sz;
-    private int[] max;
-    private boolean[] isRemove;
-
-    public FindLargestUF(int N) {
-        id = new int[N];
-        sz = new int[N];
-        max = new int[N];
-        isRemove = new boolean[N];
-        for (int i = 0; i < N; i++) {
-            id[i] = i;
-            sz[i] = 1;
-            max[i] = i;
-            isRemove[i] = false;
-        }
-    }
-
-    private int root(int i) {
-        while (i != id[i]) {
-            i = id[i];
-        }
-        return i;
-    }
-
-    /**
-     * 找到包含 i 的连通分量中最大值
-     */
-    public int find(int i) {
-        return max[root(i)];
-    }
-
-    public boolean connected(int p, int q) {
-        return root(p) == root(q);
-    }
-
-    public void union(int p, int q) {
-        if (connected(p, q)) {
-            return;
-        }
-        int rootOfP = root(p);
-        int rootOfQ = root(q);
-        if (sz[rootOfP] > sz[rootOfQ]) {
-            id[rootOfQ] = rootOfP;
-            sz[rootOfP] += sz[rootOfQ];
-            max[rootOfP] = Math.max(max[rootOfP], max[rootOfQ]);
-        } else {
-            id[rootOfP] = rootOfQ;
-            sz[rootOfQ] += sz[rootOfP];
-            max[rootOfQ] = Math.max(max[rootOfP], max[rootOfQ]);
-        }
-    }
-
-    public void remove(int x) {
-        isRemove[x] = true;
-        if (x > 0 && isRemove[x - 1]) {
-            union(x, x - 1);
-        }
-        if (x < isRemove.length - 1 && isRemove[x + 1]) {
-            union(x, x + 1);
-        }
-    }
-
-    public int getSuccessor(int x) {
-        if (x < 0 || x > isRemove.length - 1) {
-            throw new IllegalArgumentException("访问越界!");
-        } else if (isRemove[x]) {
-            if (find(x) + 1 > isRemove.length - 1) {
-                return -1;
-            } else {
-                return find(x) + 1;
-            }
-        } else {
-            return x;
-        }
-    }
-
-}
diff --git a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/Percolation.java b/Algorithm4th/1-Fundamentals/InterviewQuestions/src/Percolation.java
deleted file mode 100644
index a8c5ba4..0000000
--- a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/Percolation.java
+++ /dev/null
@@ -1,156 +0,0 @@
-import edu.princeton.cs.algs4.WeightedQuickUnionUF;
-
-/**
- * @author: changle
- * @time: 2019-01-17 21:30
- */
-
-
-public class Percolation {
-
-    /**
-     * site打开状态
-     */
-    private final boolean[][] site;
-
-    /**
-     * 网格的边长
-     */
-    private final int n;
-    /**
-     * 开放站点的数量
-     */
-    private int count = 0;
-
-    /**
-     * 并查集
-     */
-    private final WeightedQuickUnionUF uf;
-
-    public Percolation(int n) {
-        if (n <= 0) {
-            throw new IllegalArgumentException();
-        }
-
-        this.n = n;
-        site = new boolean[n][n];
-        //    初始化网站状态
-        for (int i = 0; i < site.length; i++) {
-            for (int j = 0; j < site[0].length; j++) {
-                site[i][j] = false;
-            }
-
-        }
-        //    初始化并查集,新增的结点为头部和底部的两个虚拟结点
-        uf = new WeightedQuickUnionUF(n * n + 2);
-    }
-
-
-    /**
-     * 打开 (row,site) 的网站
-     */
-    public void open(int row, int col) {
-        if (row < 1 || row > n || col < 1 || col > n) {
-            throw new IllegalArgumentException();
-        }
-        if (isOpen(row, col)) {
-            return;
-        }
-        site[row - 1][col - 1] = true;
-        if (row == 1) {
-            uf.union(0, col);
-            if (n == 1) {
-                uf.union(col, n * n + 1);
-            }
-            if (n >= 2 && isOpen(row + 1, col)) {
-                uf.union(col, n + col);
-            }
-            count++;
-            return;
-        }
-        if (row == n) {
-            uf.union(n * n + 1, n * n - n + col);
-            if (isOpen(n - 1, col)) {
-                uf.union(n * n - n + col, n * n - 2 * n + col);
-            }
-            count++;
-            return;
-        }
-        //此时必定存在 n >= 3
-        if (col == 1) {
-            if (isOpen(row - 1, 1)) {
-                uf.union((row - 1) * n + 1, (row - 2) * n + 1);
-            }
-            if (isOpen(row + 1, 1)) {
-                uf.union((row - 1) * n + 1, row * n + 1);
-            }
-            if (isOpen(row, 2)) {
-                uf.union((row - 1) * n + 1, (row - 1) * n + 2);
-            }
-            count++;
-            return;
-        }
-        if (col == n) {
-            if (isOpen(row - 1, n)) {
-                uf.union((row - 1) * n, row * n);
-            }
-            if (isOpen(row + 1, n)) {
-                uf.union(row * n, (row + 1) * n);
-            }
-            if (isOpen(row, n - 1)) {
-                uf.union(row * n, row * n - 1);
-            }
-            count++;
-            return;
-        }
-        //    四边都是 site 的点
-        if (isOpen(row - 1, col)) {
-            uf.union((row - 1) * n + col, (row - 2) * n + col);
-        }
-        if (isOpen(row + 1, col)) {
-            uf.union((row - 1) * n + col, row * n + col);
-        }
-        if (isOpen(row, col - 1)) {
-            uf.union((row - 1) * n + col, (row - 1) * n + col - 1);
-        }
-        if (isOpen(row, col + 1)) {
-            uf.union((row - 1) * n + col, (row - 1) * n + col + 1);
-        }
-        count++;
-    }
-
-    public boolean isOpen(int row, int col) {
-        if (row < 1 || row > n || col < 1 || col > n) {
-            throw new IllegalArgumentException();
-        }
-        return site[row - 1][col - 1];
-    }
-
-    public boolean isFull(int row, int col) {
-        if (row < 1 || row > n || col < 1 || col > n) {
-            throw new IllegalArgumentException();
-        }
-        return uf.connected(0, (row - 1) * n + col);
-    }
-
-    /**
-     * 开放 site 的数量
-     */
-    public int numberOfOpenSites() {
-        return count;
-    }
-
-    /**
-     * 是否渗透
-     */
-    public boolean percolates() {
-        return uf.connected(0, n * n + 1);
-    }
-
-
-    //    public static void main(String[] args) {
-    //    Percolation percolation = new Percolation(6);
-    //    percolation.open(1, 6);
-    //    System.out.println(percolation.isFull(1,6));
-    //}
-}
diff --git a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/PercolationStats.java b/Algorithm4th/1-Fundamentals/InterviewQuestions/src/PercolationStats.java
deleted file mode 100644
index 7185c5d..0000000
--- a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/PercolationStats.java
+++ /dev/null
@@ -1,72 +0,0 @@
-import edu.princeton.cs.algs4.StdOut;
-import edu.princeton.cs.algs4.StdRandom;
-import edu.princeton.cs.algs4.StdStats;
-
-/**
- * @author: changle
- * @time: 2019-01-21 00:51
- * Source：http://coursera.cs.princeton.edu/algs4/assignments/percolation.html
- * 2019-01-21 03:05:31 score: 81%
- */
-
-public class PercolationStats {
-
-    private static final double COEFFICIENT = 1.96;
-    private final double[] perthreshold;
-    private final double mean;
-    private final double stddev;
-
-    public PercolationStats(int n, int trials) {
-        perthreshold = new double[trials];
-
-        Percolation percolation = new Percolation(n);
-
-        for (int i = 0; i < trials; i++) {
-            //打开的 site 的个数
-            int count = 0;
-            while (!percolation.percolates()) {
-                int a, b;
-                do {
-                    a = StdRandom.uniform(1, n + 1);
-                    b = StdRandom.uniform(1, n + 1);
-                } while (percolation.isOpen(a, b));
-
-                percolation.open(a, b);
-                count++;
-            }
-            perthreshold[i] = (double) count / (n * n);
-        }
-
-        mean = StdStats.mean(perthreshold);
-        stddev = StdStats.stddev(perthreshold);
-    }
-
-    public double mean() {
-        return mean;
-    }
-
-    public double stddev() {
-        return stddev;
-    }
-
-    public double confidenceLo() {
-        return mean - ((COEFFICIENT * stddev) / Math.sqrt(perthreshold.length));
-    }
-
-    public double confidenceHi() {
-        return mean + ((1.96 * stddev) / Math.sqrt(perthreshold.length));
-    }
-
-    public static void main(String[] args) {
-        int n = Integer.parseInt(args[0]);
-        int trials = Integer.parseInt(args[1]);
-        PercolationStats percolationStatsCase = new PercolationStats(n, trials);
-        StdOut.printf("%-24s", "mean");
-        StdOut.printf("= %.16f\n", percolationStatsCase.mean());
-        StdOut.printf("%-24s", "stddev");
-        StdOut.printf("= %.18f\n", percolationStatsCase.stddev());
-        StdOut.printf("%-24s", "95% confidence interval");
-        StdOut.printf("= %.16f, %.16f\n", percolationStatsCase.confidenceLo(),
-                percolationStatsCase.confidenceHi());
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SocialNetworkConnectivity.java b/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SocialNetworkConnectivity.java
deleted file mode 100644
index 4193235..0000000
--- a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SocialNetworkConnectivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-import edu.princeton.cs.algs4.StdIn;
-import edu.princeton.cs.algs4.StdOut;
-import edu.princeton.cs.algs4.WeightedQuickUnionUF;
-
-/**
- * @author: changle
- * @time: 2019-01-16 01:42
- * @description：Social network connectivity. Given a social network containing n members and a log
- * file containing m timestamps at which times pairs of members formed friendships, design an
- * algorithm to determine the earliest time at which all members are connected (i.e., every member
- * is a friend of a friend of a friend ... of a friend). Assume that the log file is sorted by
- * timestamp and that friendship is an equivalence relation. The running time of your algorithm
- * should be mlogn or better and use extra space proportional to n.
- */
-public class SocialNetworkConnectivity {
-
-    public static void main(String[] args) {
-        WeightedQuickUnionUF uf = null;
-        while (!StdIn.isEmpty()) {
-            String line = StdIn.readLine();
-            if (uf == null) {
-                uf = new WeightedQuickUnionUF(Integer.valueOf(line));
-            }
-
-            String[] arrOfLine = line.split(" ");
-            int p = Integer.parseInt(arrOfLine[1]);
-            int q = Integer.parseInt(arrOfLine[2]);
-            if (!uf.connected(p, q)) {
-                uf.union(p, q);
-            }
-            if (uf.count() == 1) {
-                StdOut.println(arrOfLine[0]);
-                return;
-            }
-        }
-    }
-}
diff --git a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SuccessorWithDelete.java b/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SuccessorWithDelete.java
deleted file mode 100644
index b687d1e..0000000
--- a/Algorithm4th/1-Fundamentals/InterviewQuestions/src/SuccessorWithDelete.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-16 02:45 description：
- */
-public class SuccessorWithDelete {
-
-    private int[] id;
-    private int[] sz;
-    private int[] max;
-
-    public SuccessorWithDelete(int N) {
-        sz = new int[N];
-        max = new int[N];
-        for (int i = 0; i < N; i++) {
-            id[i] = i;
-            sz[i] = 1;
-            max[i] = i;
-        }
-    }
-
-    private int root(int i) {
-        while (i != id[i]) {
-            i = id[i];
-        }
-        return i;
-    }
-
-    /**
-     * 找到包含 i 的连通分量中最大值
-     */
-    public int find(int i) {
-        return max[root(i)];
-    }
-
-    public boolean connected(int p, int q) {
-        return root(p) == root(q);
-    }
-
-    public void union(int p, int q) {
-        if (connected(p, q)) {
-            return;
-        }
-        int rootOfP = root(p);
-        int rootOfQ = root(q);
-        if (sz[rootOfP] > sz[rootOfQ]) {
-            id[rootOfQ] = rootOfP;
-            sz[rootOfP] += sz[rootOfQ];
-            max[rootOfP] = Math.max(max[rootOfP], max[rootOfQ]);
-        } else {
-            id[rootOfP] = rootOfQ;
-            sz[rootOfQ] += sz[rootOfP];
-            max[rootOfQ] = Math.max(max[rootOfP], max[rootOfQ]);
-        }
-    }
-
-}
diff --git a/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/BubbleSort.java b/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/BubbleSort.java
deleted file mode 100644
index 2911c0e..0000000
--- a/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/BubbleSort.java	
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-05 10:12
- * Description: 冒泡排序
- */
-
-public class BubbleSort {
-
-    public static int[] bubbleSort(int[] A) {
-        for(int i = 0;i < A.length - 1;i++){
-            for(int j = 0;j < A.length - i - 1;j++){
-                if(A[j] > A[j + 1]){
-                    int temp = A[j];
-                    A[j] = A[j + 1];
-                    A[j + 1] =temp;
-                }
-            }
-        }
-        return A;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {5, 4, 3, 2, 1};
-        bubbleSort(A);
-        for (int a : A) {
-            System.out.print(a + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/SelectionSort.java b/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/SelectionSort.java
deleted file mode 100644
index 3f3f0a1..0000000
--- a/Algorithm4th/2-Sorting/2.1 ElementarySorts/src/SelectionSort.java	
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-11-30 14:34
- * Description: 选择排序
- */
-
-public class SelectionSort {
-
-    public static void main(String[] args) {
-        int[] arr = {55, 26, 17, 48, 10, 69, 33};
-        sort(arr);
-        for (int a : arr) {
-            System.out.print(a + " ");
-        }
-    }
-
-    public static void sort(int[] a) {
-        for (int i = 0; i < a.length; i++) {
-            int min = i;
-            for (int j = i + 1; j < a.length; j++) {
-                if (a[j] < a[min]) {
-                    min = j;
-                }
-            }
-            if (min > i) {
-                exchange(a, min, i);
-            }
-        }
-    }
-
-    public static void exchange(int[] a, int x, int y) {
-        int temp = a[x];
-        a[x] = a[y];
-        a[y] = temp;
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.2 Mergesort/src/MergeSort.java b/Algorithm4th/2-Sorting/2.2 Mergesort/src/MergeSort.java
deleted file mode 100644
index 56c6756..0000000
--- a/Algorithm4th/2-Sorting/2.2 Mergesort/src/MergeSort.java	
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-08 15:26
- * Description: 归并排序
- */
-
-public class MergeSort {
-    static int[] aux = new int[0];
-
-    public static int[] mergeSort(int[] A, int n) {
-        // write code here
-        aux = new int[n];
-        mergeSort(A,0,n-1);
-        return aux;
-    }
-
-    private static void mergeSort(int[] A,int lo,int hi){
-        if(lo >= hi)
-            return;
-        int mid = (lo + hi) / 2;
-        mergeSort(A,lo,mid);
-        mergeSort(A,mid + 1,hi);
-        merge(A,lo,mid,hi);
-    }
-
-    private static void merge(int[] A,int lo,int middle,int hi){
-        int i = lo,j = middle + 1;
-
-        for (int k = lo; k <= hi; k++) {
-            aux[k] = A[k];
-        }
-        for(int k = i;k <= hi;k++){
-            if(i > middle)
-                A[k] = aux[j++];
-            else if(j > hi)
-                A[k] = aux[i++];
-            else if(aux[i] <= aux[j])
-                A[k] = aux[i++];
-            else
-                A[k] = aux[j++];
-        }
-    }
-
-
-    public static void main(String[] args) {
-        int[] a = {8,7,6,5,4,3,2,1};
-        mergeSort(a,8);
-        for (int i = 0; i <= 7; i++) {
-            System.out.print(a[i] + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort.java b/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort.java
deleted file mode 100644
index e64fc76..0000000
--- a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort.java	
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-09 10:11
- * Description: 快速排序
- */
-
-public class QuickSort {
-
-    public static int[] quickSort(int[] A, int n) {
-        quickSort(A, 0, n - 1);
-        return A;
-    }
-
-    private static void quickSort(int[] A, int lo, int hi) {
-        if (lo >= hi)
-            return;
-        int p = partition(A, lo, hi);
-        quickSort(A, lo, p - 1);
-        quickSort(A, p + 1, hi);
-    }
-
-    private static int partition(int[] A, int lo, int hi) {
-        int v = A[lo], j = lo;
-        for (int i = lo + 1; i <= hi; i++) {
-            if (A[i] < v) {
-                exch(A, i, ++j);
-            }
-        }
-        exch(A, lo, j);
-        return j;
-    }
-
-    private static void exch(int[] A, int i, int j) {
-        int temp = A[i];
-        A[i] = A[j];
-        A[j] = temp;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28};
-        quickSort(A, A.length);
-        for (int i = 0; i < A.length; i++) {
-            System.out.print(A[i] + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort2Ways.java b/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort2Ways.java
deleted file mode 100644
index 628920e..0000000
--- a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort2Ways.java	
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-09 10:52
- * Description: 双路快排
- */
-
-public class QuickSort2Ways {
-
-    private static void quickSort(int[] A, int n) {
-        quickSort(A, 0, n - 1);
-    }
-
-    private static void quickSort(int[] A, int lo, int hi) {
-        if (lo >= hi) {
-            return;
-        }
-        int p = partition(A, lo, hi);
-        quickSort(A, lo, p - 1);
-        quickSort(A, p + 1, hi);
-    }
-
-    private static int partition(int[] A, int lo, int hi) {
-        int i = lo + 1, j = hi;
-        while (true) {
-            while (i <= hi && A[i] < A[lo]) {
-                i++;
-            }
-            while (j >= lo + 1 && A[j] > A[lo]) {
-                j--;
-            }
-            if (i >= j) {
-                break;
-            }
-            exch(A, i, j);
-            i++;
-            j--;
-        }
-        exch(A, lo, j);
-        return j;
-    }
-
-    private static void exch(int[] A, int i, int j) {
-        int temp = A[i];
-        A[i] = A[j];
-        A[j] = temp;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28};
-        quickSort(A, A.length);
-        for (int aA : A) {
-            System.out.print(aA + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort3Ways.java b/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort3Ways.java
deleted file mode 100644
index b8cc81b..0000000
--- a/Algorithm4th/2-Sorting/2.3 Quicksort/src/QuickSort3Ways.java	
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-09 16:19
- * Description: 三路快排
- */
-
-public class QuickSort3Ways {
-
-    public static int[] quickSort(int[] A, int n) {
-        quickSort(A, 0, n - 1);
-        return A;
-    }
-
-    private static void quickSort(int[] A, int lo, int hi) {
-        if (lo >= hi) {
-            return;
-        }
-        int lt = lo, i = lo + 1, gt = hi + 1;
-        int v = A[lo];
-        while (i < gt) {
-            if (A[i] < v) {
-                exch(A, i, ++lt);
-                i++;
-            } else if (A[i] > v) {
-                exch(A, i, --gt);
-            } else {
-                i++;
-            }
-        }
-        exch(A, lo, lt);
-        quickSort(A, lo, lt - 1);
-        quickSort(A, gt, hi);
-    }
-
-    private static void exch(int[] A, int i, int j) {
-        int temp = A[i];
-        A[i] = A[j];
-        A[j] = temp;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28};
-        quickSort(A, A.length);
-        for (int aA : A) {
-            System.out.print(aA + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/Ex_2_4_1.java b/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/Ex_2_4_1.java
deleted file mode 100644
index 67f9022..0000000
--- a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/Ex_2_4_1.java	
+++ /dev/null
@@ -1,22 +0,0 @@
-import java.util.Objects;
-
-/**
- * User: Changle
- * Date: 2017-11-12 14:27
- * Description: 算法第四版-2.4.1
- */
-
-public class Ex_2_4_1 {
-
-    public static void main(String[] args) {
-        PriorityQueue<String> priorityQueue = new PriorityQueue<>(args.length);
-        for (int i = 0; i < args.length; i++) {
-            if (!args[i].equals("*")) {
-                priorityQueue.insert(args[i]);
-                System.out.println("最大元素为" + priorityQueue.max() + " ");
-            } else {
-                System.out.print("删除" + priorityQueue.delMax() + " ");
-            }
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/HeapSort.java b/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/HeapSort.java
deleted file mode 100644
index d13174d..0000000
--- a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/HeapSort.java	
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-03 09:22
- * Description: 堆排序
- */
-
-public class HeapSort {
-
-    public static int[] heapSort(int[] A, int n) {
-        // 最大堆的构造
-        for (int i = n / 2 - 1; i >= 0; i--) {
-            sink(A, i, n);
-        }
-
-        // 排序
-        for (; n > 1; ) {
-            exch(A, 0, --n);
-            sink(A, 0, n);
-        }
-        return A;
-    }
-
-    public static void sink(int[] A, int i, int n) {
-        while (2 * i + 1 < n) {
-            int j = 2 * i + 1;
-            if (j + 1 < n && A[j] < A[j + 1]) {
-                j++;
-            }
-            if (A[i] < A[j]) {
-                exch(A, i, j);
-            } else {
-                break;
-            }
-            i = j;
-        }
-    }
-
-    public static void exch(int[] A, int i, int j) {
-        int temp = A[i];
-        A[i] = A[j];
-        A[j] = temp;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {54,35,48,36,27,12,44,44,8,14,26,17,28};
-        heapSort(A, A.length);
-        for (int a : A) {
-            System.out.print(a + " ");
-        }
-    }
-}
diff --git a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/PriorityQueue.java b/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/PriorityQueue.java
deleted file mode 100644
index 6a12e1c..0000000
--- a/Algorithm4th/2-Sorting/2.4 PriorityQueues/src/PriorityQueue.java	
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-11-12 14:28
- * Description: 优先队列-最大堆
- */
-
-public class PriorityQueue<Key extends Comparable<Key>> {
-
-    private int N;
-    private Key[] pq;
-
-    public PriorityQueue(int maxSize) {
-        pq = (Key[]) new Comparable[maxSize + 1];
-    }
-
-    public boolean isEmpty() {
-        return N == 0;
-    }
-
-    public int size() {
-        return N;
-    }
-
-    public Key max() {
-        return pq[1];
-    }
-
-    public Key delMax() {
-        if (N < 0) {
-            System.out.println("队列为空，请先添加元素");
-            return null;
-        }
-        Key max = pq[1];
-        exchange(1, N--);
-        sink(1);
-        return max;
-    }
-
-    public void insert(Key v) {
-        if (N == pq.length - 1) {
-            System.out.println("队列已满，请先删除元素");
-        }
-        pq[++N] = v;
-        swim(N);
-    }
-
-    public void swim(int k) {
-        while (k / 2 >= 1 && less(k / 2, k)) {
-            exchange(k / 2, k);
-            k = k / 2;
-        }
-    }
-
-    private void sink(int i) {
-        while (2 * i <= N) {
-            int j = 2 * i;
-            if (j < N && less(j, j + 1)) {
-                j++;
-            }
-            exchange(i, j);
-            i = j;
-        }
-    }
-
-
-    public boolean less(int i, int j) {
-        return pq[i].compareTo(pq[j]) < 0;
-    }
-
-    public void exchange(int i, int j) {
-        Key temp = pq[i];
-        pq[i] = pq[j];
-        pq[j] = temp;
-    }
-}
diff --git a/Algorithm4th/3-Searching/3.1 SymbolTables/src/BinarySearch.java b/Algorithm4th/3-Searching/3.1 SymbolTables/src/BinarySearch.java
deleted file mode 100644
index a0ea35f..0000000
--- a/Algorithm4th/3-Searching/3.1 SymbolTables/src/BinarySearch.java	
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-20 22:45
- * Description: 二分查找
- */
-
-public class BinarySearch {
-
-    private static int search(int[] A, int target) {
-        int l = 0;
-        int r = A.length - 1;
-        while (l <= r) {
-            //int mid = (l + r) / 2;此处一定要注意两个整数相加溢出的情况
-            int mid = l + (r - l) / 2;
-            if (A[mid] == target) {
-                return mid;
-            } else if (A[mid] < target) {
-                l = mid + 1;
-            } else {
-                r = mid - 1;
-            }
-        }
-        return -1;
-    }
-
-    public static void main(String[] args) {
-        int[] A = {8, 12, 14, 17, 26, 27, 28, 35, 36, 44, 44, 48, 54};
-        int target = 12;
-        int res = search(A, 12);
-        System.out.println(res);
-    }
-}
diff --git a/Algorithm4th/3-Searching/3.2 BinarySearchTrees/src/BST.java b/Algorithm4th/3-Searching/3.2 BinarySearchTrees/src/BST.java
deleted file mode 100644
index f63d3b8..0000000
--- a/Algorithm4th/3-Searching/3.2 BinarySearchTrees/src/BST.java	
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-08 00:07
- */
-public class BST<Key extends Comparable<Key>, Value> {
-
-    private Node root;
-
-    private class Node {
-
-        private Key key;
-        private Value value;
-        private Node left;
-        private Node right;
-        private int n;
-
-        public Node(Key key, Value value, int n) {
-            this.key = key;
-            this.value = value;
-            this.n = n;
-        }
-    }
-
-    public int size() {
-        return size(root);
-    }
-
-    private int size(Node root) {
-        if (root == null) {
-            return 0;
-        }
-        return root.n;
-    }
-
-    public Value get(Key key) {
-        return get(root, key);
-    }
-
-    private Value get(Node node, Key key) {
-        if (node == null) {
-            return null;
-        }
-        if (key == node.key) {
-            return node.value;
-        } else if (key.compareTo(node.key) < 0) {
-            return get(node.left, key);
-        } else {
-            return get(node.right, key);
-        }
-    }
-
-    public void put(Key key, Value value) {
-        put(root, key, value);
-    }
-
-    private Node put(Node node, Key key, Value value) {
-        if (node == null) {
-            return new Node(key, value, 1);
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp < 0) {
-            node.left = put(node.left, key, value);
-        } else if (cmp > 0) {
-            node.right = put(node.right, key, value);
-        } else {
-            node.value = value;
-        }
-        node.n = size(node.left) + size(node.right) + 1;
-
-        return node;
-    }
-
-    public Key min() {
-        return min(root).key;
-    }
-
-    private Node min(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            return node;
-        }
-        return min(node.left);
-    }
-
-    public Key max() {
-        return max(root).key;
-    }
-
-    private Node max(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.right == null) {
-            return node;
-        }
-        return max(node.right);
-    }
-
-    public Node floor(Key key) {
-        return floor(root, key);
-    }
-
-    private Node floor(Node node, Key key) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp < 0) {
-            return floor(node.left, key);
-        } else if (cmp > 0) {
-            return floor(node.right, key);
-        } else {
-            Node r = floor(node.right, key);
-            if (r == null) {
-                return node;
-            } else {
-                return r;
-            }
-        }
-    }
-
-    public Node ceiling(Key key) {
-        return ceiling(root, key);
-    }
-
-    private Node ceiling(Node node, Key key) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp > 0) {
-            return floor(node.right, key);
-        } else if (cmp == 0) {
-            return node;
-        } else {
-            Node l = floor(node.left, key);
-            if (l == null) {
-                return node;
-            } else {
-                return l;
-            }
-        }
-    }
-
-    public Key select(int k) {
-        return select(root, k);
-    }
-
-    private Key select(Node node, int k) {
-        if (node == null) {
-            return null;
-        }
-        int t = size(node.left);
-        if (t < k - 1) {
-            return select(node.right, k - t - 1);
-        } else if (t == k - 1) {
-            return node.key;
-        } else {
-            return select(node.left, k);
-        }
-    }
-
-    public int rank(Key key) {
-        return rank(root, key);
-    }
-
-    private int rank(Node node, Key key) {
-        if (node == null) {
-            return 0;
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp == 0) {
-            return node.left.n + 1;
-        } else if (cmp < 0) {
-            return rank(node.left, key);
-        } else {
-            return rank(node.right, key) + node.left.n + 1;
-        }
-    }
-
-    public void preOrder() {
-        preOrder(root);
-    }
-
-    /**
-     * 前序遍历以 node 为根的 BST
-     *
-     * @param node 根节点
-     */
-    private void preOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        System.out.println(node.key);
-        preOrder(node.left);
-        preOrder(node.right);
-    }
-
-    public void inOrder() {
-        inOrder(root);
-    }
-
-    /**
-     * 中序遍历以 node 为根的 BST
-     *
-     * @param node 根节点
-     */
-    private void inOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        inOrder(node.left);
-        System.out.println(node.key);
-        inOrder(node.right);
-    }
-
-    public void postOrder() {
-        postOrder(root);
-    }
-
-    /**
-     * 后序遍历以 node 为根的 BST
-     * @param node 根节点
-     */
-    private void postOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        postOrder(node.right);
-        postOrder(node.left);
-        System.out.println(node.key);
-    }
-
-    /**
-     * 删除 key 最小的节点
-     *
-     * @return 删除最小键之后的树的根节点
-     */
-    public Node deleteMin() {
-        return deleteMin(root);
-    }
-
-    private Node deleteMin(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            return node.right;
-        }
-        node.left = deleteMin(node.left);
-        node.n = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    public Node deleteMax() {
-        return deleteMax(root);
-    }
-
-    private Node deleteMax(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.right == null) {
-            return node.left;
-        }
-        node.right = deleteMax(node.right);
-        node.n = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    public Node delete(Key key) {
-        return delete(root, key);
-    }
-
-    /**
-     * @return 返回删除该结点之后的树的根结点
-     */
-    private Node delete(Node node, Key key) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp == 0) {
-            if (node.left == null) {
-                return node.right;
-            }
-            if (node.right == null) {
-                return node.left;
-            }
-            Node replacementNode = min(node.right);
-            replacementNode.right = deleteMin(node.right);
-            replacementNode.left = node.left;
-            node = replacementNode;
-        } else if (cmp < 0) {
-            node.left = delete(node.left, key);
-        } else {
-            node.right = delete(node.right, key);
-        }
-        node.n = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-}
-
diff --git a/DataStructure/Array/src/Array.java b/DataStructure/Array/src/Array.java
deleted file mode 100644
index 8976f9f..0000000
--- a/DataStructure/Array/src/Array.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-02 12:03
- */
-public class Array<E> {
-
-    private E[] data;
-    /**
-     * 数组中存放的元素的个数
-     */
-    private int size;
-
-    public Array(int capacity) {
-        data = (E[]) new Object[capacity];
-        size = 0;
-    }
-
-    public Array() {
-        this(10);
-    }
-
-    /**
-     * 返回数组中存放的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回数组容量
-     */
-    public int getCapacity() {
-        return data.length;
-    }
-
-    /**
-     * 返回数组是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * 在 index = 0 处添加元素
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在元素末尾添加新元素
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 在数组指定位置添加元素
-     */
-    public void add(int index, E e) {
-        if (index < 0 | index > size) {
-            throw new IllegalArgumentException("Add failed.Index is illegal");
-        }
-        if (size == data.length) {
-            resize(2 * data.length);
-        }
-
-        //     向右移动元素
-        for (int i = size; i > index; i--) {
-            data[i] = data[i - 1];
-        }
-        data[index] = e;
-        size++;
-    }
-
-    /**
-     * 将数组容量改变为 i
-     */
-    private void resize(int newCapacity) {
-        E[] ret = (E[]) new Object[newCapacity];
-        for (int i = 0; i < size; i++) {
-            ret[i] = data[i];
-        }
-        data = ret;
-    }
-
-    /**
-     * 获取索引为 index 的元素
-     */
-    E get(int index) {
-        if (index < 0 | index >= size) {
-            throw new IllegalArgumentException("get faild。Index is illegal");
-        }
-        return data[index];
-    }
-
-    /**
-     * 设置索引为 index 的元素的值
-     */
-    void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("set faild。Index is illegal");
-        }
-        data[index] = e;
-    }
-
-    /**
-     * 查找数组中是否有元素 e
-     */
-    public boolean contains(int e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 查找数组中元素 e 所在的索引
-     */
-    public int find(E e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * 从数组中删除 index 位置的元素，返回删除的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("delete faild,Index is illegal");
-        }
-        E res = data[index];
-        for (int i = index; i < size - 1; i++) {
-            data[i] = data[i + 1];
-        }
-        data[--size] = null;
-        // 防止复杂度震荡
-        if (size == data.length >> 2 && data.length / 2 != 0) {
-            resize(data.length >> 1);
-        }
-        return res;
-    }
-
-    /**
-     * 从数组中删除第一个元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 从数组中删除最后一个元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    /**
-     * 从数组中删除第一个 e
-     */
-    public void removeElement(E e) {
-        int index = find(e);
-        if (index != -1) {
-            remove(index);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
-        res.append('[');
-        for (int i = 0; i < size; i++) {
-            res.append(data[i]);
-            if (i != size - 1) {
-                res.append(",");
-            }
-        }
-        res.append(']');
-        return res.toString();
-    }
-}
diff --git a/DataStructure/BST/src/BST.java b/DataStructure/BST/src/BST.java
deleted file mode 100644
index 10c4d94..0000000
--- a/DataStructure/BST/src/BST.java
+++ /dev/null
@@ -1,302 +0,0 @@
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Stack;
-
-/**
- * @author Changle
- * @date 2019/2/27 17:25
- */
-
-public class BST<E extends Comparable<E>> {
-
-    private class Node {
-
-        private E e;
-
-        private int N;
-
-        Node left, right;
-
-        Node(E e) {
-            this.e = e;
-            left = null;
-            right = null;
-        }
-    }
-
-    /**
-     * 根结点
-     */
-    private Node root;
-
-    /**
-     * @return 返回 以 node 为根的 BST 结点的个数
-     */
-    int size() {
-        return size(root);
-    }
-
-
-    private int size(Node node) {
-        if (node == null) {
-            return 0;
-        }
-        return node.N;
-    }
-
-    boolean isEmpty() {
-        return size(root) == 0;
-    }
-
-    /**
-     * 向 BST 中插入结点 e
-     */
-    public void add(E e) {
-        root = add(e, root);
-    }
-
-    private Node add(E e, Node node) {
-        if (node == null) {
-            return new Node(e);
-        }
-        int cmp = e.compareTo(node.e);
-        // 如果插入结点的值小于该结点，则插入左子树，否则插入右子树
-        if (cmp < 0) {
-            node.left = add(e, node.left);
-        } else if (cmp > 0) {
-            node.right = add(e, node.right);
-        }
-        // 更新结点个数
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 查询该 BST 中是否包含元素 e
-     */
-
-    public boolean contains(E e) {
-        return contains(e, root);
-    }
-
-    private boolean contains(E e, Node node) {
-        if (node == null) {
-            return false;
-        }
-        //    如果查询结点的值小于该结点，则查询左子树；查询结点的值等于该结点，则返回 true;否则查询右子树
-        int cmp = e.compareTo(node.e);
-        if (cmp < 0) {
-            return contains(e, node.left);
-        } else if (cmp == 0) {
-            return true;
-        } else {
-            return contains(e, node.right);
-        }
-    }
-
-    /**
-     * 先序遍历
-     */
-    public void preOrder() {
-        preOrder(root);
-    }
-
-    private void preOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        System.out.println(node.e);
-        preOrder(node.left);
-        preOrder(node.right);
-    }
-
-    /**
-     * 非递归遍历
-     */
-    public void preOrderNR() {
-        Stack<Node> stack = new Stack();
-        stack.push(root);
-        while (!stack.isEmpty()) {
-            Node cur = stack.pop();
-            System.out.println(cur.e);
-
-            if (cur.right != null) {
-                stack.push(cur.right);
-            }
-            if (cur.left != null) {
-                stack.push(cur.left);
-            }
-        }
-    }
-
-    /**
-     * 中序遍历
-     */
-    public void inOrder() {
-        inOrder(root);
-    }
-
-    private void inOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        inOrder(node.left);
-        System.out.println(node.e);
-        inOrder(node.right);
-    }
-
-    /**
-     * 后序遍历
-     */
-    public void postOrder() {
-        postOrder(root);
-    }
-
-    private void postOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        postOrder(node.left);
-        postOrder(node.right);
-        System.out.println(node.e);
-    }
-
-    /**
-     * 层序遍历
-     */
-    public void levelOrder() {
-        Queue<Node> queue = new LinkedList<>();
-        queue.add(root);
-        while (!queue.isEmpty()) {
-            Node cur = queue.remove();
-            System.out.println(cur.e);
-            if (cur.left != null) {
-                queue.add(cur.left);
-            }
-            if (cur.right != null) {
-                queue.add(cur.right);
-            }
-        }
-    }
-
-    /**
-     * 返回最小值
-     */
-    public Node min() {
-        return min(root);
-    }
-
-    private Node min(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            return node;
-        }
-        return min(node.left);
-    }
-
-
-    /**
-     * 删除最小元素
-     */
-    public Node deleteMin() {
-        if (root == null) {
-            return null;
-        }
-        return deleteMin(root);
-    }
-
-    private Node deleteMin(Node node) {
-        if (node.left == null) {
-            return node.right;
-        } else {
-            node.left = deleteMin(node.left);
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 删除最大元素
-     */
-    public Node deleteMax() {
-        if (root == null) {
-            return null;
-        }
-        return deleteMax(root);
-    }
-
-    private Node deleteMax(Node node) {
-        if (node.right == null) {
-            return node.left;
-        } else {
-            node.right = deleteMin(node.right);
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 删除元素
-     */
-    public Node delete(E e) {
-        return delete(e, root);
-    }
-
-    private Node delete(E e, Node node) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = e.compareTo(node.e);
-        if (cmp < 0) {
-            node.left = delete(e, node.left);
-        } else if (cmp > 0) {
-            node.right = delete(e, node.right);
-        } else {
-            if (node.left == null) {
-                return node.right;
-            }
-            if (node.right == null) {
-                return node.left;
-            }
-            Node t = node;
-            node = min(t.right);
-            node.right = deleteMin(t.right);
-            node.left = t.left;
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-
-        generateBSTString(root, 0, res);
-        return res.toString();
-    }
-
-    /**
-     * 生成以 node 为根节点，深度为 depth 的描述二叉树的字符串
-     */
-    private void generateBSTString(Node node, int depth, StringBuilder res) {
-        if (node == null) {
-            res.append(generateDepthString(depth)).append("null\n");
-            return;
-        }
-        res.append(generateDepthString(depth)).append(node.e).append("\n");
-        generateBSTString(node.left, depth + 1, res);
-        generateBSTString(node.right, depth + 1, res);
-    }
-
-    private String generateDepthString(int depth) {
-        StringBuilder res = new StringBuilder();
-        for (int i = 0; i < depth; i++) {
-            res.append("--");
-        }
-        return res.toString();
-    }
-
-}
diff --git a/DataStructure/Heap/src/Array.java b/DataStructure/Heap/src/Array.java
deleted file mode 100644
index f5e6192..0000000
--- a/DataStructure/Heap/src/Array.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-02 12:03
- */
-public class Array<E> {
-
-    private E[] data;
-    /**
-     * 数组中存放的元素的个数
-     */
-    private int size;
-
-    public Array(int capacity) {
-        data = (E[]) new Object[capacity];
-        size = 0;
-    }
-
-    public Array() {
-        this(10);
-    }
-
-    public Array(E[] arr) {
-        data = (E[]) new Object[arr.length];
-        for (int i = 0; i < arr.length; i++) {
-            data[i] = arr[i];
-        }
-        size = arr.length;
-    }
-
-    /**
-     * 返回数组中存放的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回数组容量
-     */
-    public int getCapacity() {
-        return data.length;
-    }
-
-    /**
-     * 返回数组是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * 在 index = 0 处添加元素
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在元素末尾添加新元素
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 在数组指定位置添加元素
-     */
-    public void add(int index, E e) {
-        if (index < 0 | index > size) {
-            throw new IllegalArgumentException("Add failed.Index is illegal");
-        }
-        if (size == data.length) {
-            resize(2 * data.length);
-        }
-
-        //     向右移动元素
-        for (int i = size; i > index; i--) {
-            data[i] = data[i - 1];
-        }
-        data[index] = e;
-        size++;
-    }
-
-    /**
-     * 将数组容量改变为 i
-     */
-    private void resize(int newCapacity) {
-        E[] ret = (E[]) new Object[newCapacity];
-        for (int i = 0; i < size; i++) {
-            ret[i] = data[i];
-        }
-        data = ret;
-    }
-
-    /**
-     * 获取索引为 index 的元素
-     */
-    E get(int index) {
-        if (index < 0 | index >= size) {
-            throw new IllegalArgumentException("get faild。Index is illegal");
-        }
-        return data[index];
-    }
-
-    /**
-     * 设置索引为 index 的元素的值
-     */
-    void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("set faild。Index is illegal");
-        }
-        data[index] = e;
-    }
-
-    /**
-     * 查找数组中是否有元素 e
-     */
-    public boolean contains(int e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 查找数组中元素 e 所在的索引
-     */
-    public int find(E e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * 从数组中删除 index 位置的元素，返回删除的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("delete faild,Index is illegal");
-        }
-        E res = data[index];
-        for (int i = index; i < size - 1; i++) {
-            data[i] = data[i + 1];
-        }
-        data[--size] = null;
-        // 防止复杂度震荡
-        if (size == data.length >> 2 && data.length / 2 != 0) {
-            resize(data.length >> 1);
-        }
-        return res;
-    }
-
-    /**
-     * 从数组中删除第一个元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 从数组中删除最后一个元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    /**
-     * 从数组中删除第一个 e
-     */
-    public void removeElement(E e) {
-        int index = find(e);
-        if (index != -1) {
-            remove(index);
-        }
-    }
-
-    /**
-     * 交换数组元素
-     */
-    public void swap(int i, int j) {
-        if (i < 0 || i >= size || j < 0 || j >= size) {
-            throw new IllegalArgumentException("Index is illegal");
-        }
-        E e = data[i];
-        data[i] = data[j];
-        data[j] = e;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
-        res.append('[');
-        for (int i = 0; i < size; i++) {
-            res.append(data[i]);
-            if (i != size - 1) {
-                res.append(",");
-            }
-        }
-        res.append(']');
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Heap/src/MaxHeap.java b/DataStructure/Heap/src/MaxHeap.java
deleted file mode 100644
index d09f1df..0000000
--- a/DataStructure/Heap/src/MaxHeap.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/8 18:03
- */
-
-public class MaxHeap<E extends Comparable<E>> {
-
-    private Array<E> data;
-
-    public MaxHeap(int capacity) {
-        data = new Array<>(capacity);
-    }
-
-    public MaxHeap() {
-        data = new Array<>();
-    }
-
-    public MaxHeap(E[] arr) {
-        data = new Array<>(arr);
-        for (int i = parent(arr.length - 1); i >= 0; i--) {
-            shiftDown(i);
-        }
-    }
-
-    public int size() {
-        return data.getSize();
-    }
-
-    public boolean isEmpty() {
-        return data.isEmpty();
-    }
-
-    /**
-     * 返回父亲结点的索引
-     */
-    private int parent(int index) {
-        if (index == 0) {
-            throw new IllegalArgumentException("Root doesn't have parent");
-        }
-        return (index - 1) / 2;
-    }
-
-    /**
-     * 返回左孩子结点的索引
-     */
-    private int leftChild(int index) {
-        return index * 2 + 1;
-    }
-
-    /**
-     * 返回右孩子结点的索引
-     */
-    private int rightChild(int index) {
-        return index * 2 + 2;
-    }
-
-    public void add(E e) {
-        data.addLast(e);
-        shiftUp(data.getSize() - 1);
-    }
-
-    private void shiftUp(int index) {
-        while (index > 0 && data.get(parent(index)).compareTo(data.get(index)) < 0) {
-            data.swap(index, parent(index));
-            index = parent(index);
-        }
-    }
-
-    /**
-     * 查找堆中最大值
-     */
-    public E findMax() {
-        if (data.getSize() == 0) {
-            throw new IllegalArgumentException("heap is empty");
-        }
-        return data.get(0);
-    }
-
-    /**
-     * 取出堆中最大元素
-     */
-    public E extractMax() {
-        E ret = findMax();
-
-        data.swap(0, data.getSize() - 1);
-        data.removeLast();
-        shiftDown(0);
-
-        return ret;
-    }
-
-    private void shiftDown(int index) {
-        while (leftChild(index) < data.getSize()) {
-            int j = leftChild(index);
-            if (j + 1 < data.getSize() && data.get(j + 1).compareTo(data.get(j)) > 0) {
-                j++;
-            }
-            if (data.get(index).compareTo(data.get(j)) > 0) {
-                break;
-            }
-            data.swap(index, j);
-            index = j;
-        }
-    }
-
-    /**
-     * 取出对顶的最大元素，并且替换成元素 e
-     */
-    public E replace(E e) {
-        E ret = findMax();
-        data.set(0, e);
-        shiftDown(0);
-        return ret;
-    }
-}
diff --git a/DataStructure/LinkedList/src/LinkedList.java b/DataStructure/LinkedList/src/LinkedList.java
deleted file mode 100644
index 7745caf..0000000
--- a/DataStructure/LinkedList/src/LinkedList.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-05 00:00
- */
-public class LinkedList<E> {
-
-    private class Node {
-
-        public E e;
-        public Node next;
-
-        public Node(E e, Node next) {
-            this.e = e;
-            this.next = next;
-        }
-
-        public Node(E e) {
-            this(e, null);
-        }
-
-        public Node() {
-            this(null, null);
-        }
-
-        @Override
-        public String toString() {
-            return e.toString();
-        }
-
-    }
-
-    private Node dummyHead;
-    int size;
-
-    public LinkedList() {
-        dummyHead = new Node(null, null);
-        size = 0;
-    }
-
-    /**
-     * 获取链表中的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回链表是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-
-    /**
-     * 在链表中索引为 index 的位置插入元素 e
-     */
-    public void add(int index, E e) {
-        if (index < 0 || index > size) {
-            throw new IllegalArgumentException("Add failed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        prev.next = new Node(e, prev.next);
-        size++;
-    }
-
-    /**
-     * 在链表头添加新的元素 e
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在链表末尾添加新的元素 e
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 获取链表索引为 index 的元素 e
-     */
-    public E get(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        return cur.e;
-    }
-
-    /**
-     * 获取链表的第一个元素
-     */
-    public E getFirst() {
-        return get(0);
-    }
-
-    /**
-     * 获取链表的最后一个元素
-     */
-    public E getLast() {
-        return get(size - 1);
-    }
-
-    /**
-     * 删除链表中元素 e
-     */
-    public void removeElement(E e) {
-        Node prev = dummyHead;
-        while (prev.next != null) {
-            if (prev.next.e.equals(e)) {
-                Node delNode = prev.next;
-                prev.next = delNode.next;
-                delNode.next = null;
-                size--;
-                return;
-            }
-            prev = prev.next;
-        }
-    }
-
-    /**
-     * 修改链表索引为 index 的元素为 e
-     */
-    public void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        cur.e = e;
-    }
-
-    /**
-     * 查找链表中是否有元素 e
-     */
-    public boolean contains(E e) {
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            if (cur.e == e) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 删除索引为 index 的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        Node ret = prev.next;
-        prev.next = ret.next;
-        ret.next = null;
-        size--;
-
-        return ret.e;
-    }
-
-    /**
-     * 删除链表中第一个元素，返回删除的元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 删除链表中最后一个元素，返回删除的元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            res.append(cur).append("->");
-        }
-        res.append("NULL");
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Map/src/BSTMap.java b/DataStructure/Map/src/BSTMap.java
deleted file mode 100644
index 98c0af9..0000000
--- a/DataStructure/Map/src/BSTMap.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/8 16:49
- */
-
-public class BSTMap<K extends Comparable<K>, V> implements Map<K, V> {
-
-    private class Node {
-
-        public K key;
-        public V value;
-        public Node left, right;
-
-        public Node(K key, V value) {
-            this.key = key;
-            this.value = value;
-            left = null;
-            right = null;
-        }
-    }
-
-    private Node root;
-    private int size;
-
-    public BSTMap() {
-        root = null;
-        size = 0;
-    }
-
-
-    @Override
-    public void add(K key, V value) {
-        root = add(root, key, value);
-    }
-
-    private Node add(Node node, K key, V value) {
-        if (node == null) {
-            size++;
-            return new Node(key, value);
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp < 0) {
-            node.left = add(node.left, key, value);
-        } else if (cmp > 0) {
-            node.right = add(node.right, key, value);
-        } else {
-            node.value = value;
-        }
-        return node;
-    }
-
-    @Override
-    public V remove(K key) {
-        Node node = getNode(root, key);
-        if (node != null) {
-            root = remove(root, key);
-            return node.value;
-        }
-        return null;
-    }
-
-    private Node minimum(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            return node;
-        }
-        return minimum(node.left);
-    }
-
-    private Node removeMin(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            Node right = node.right;
-            node.right = null;
-            size--;
-            return right;
-        }
-        node.left = removeMin(node.left);
-        return node;
-    }
-
-    private Node remove(Node node, K key) {
-        if (node == null) {
-            return null;
-        }
-
-        int cmp = key.compareTo(node.key);
-        if (cmp < 0) {
-            node.left = remove(node.left, key);
-            return node;
-        } else if (cmp > 0) {
-            node.right = remove(node.right, key);
-            return node;
-        } else {
-            // 待删除结点左子树为空
-            if (node.left == null) {
-                Node rightNode = node.right;
-                node.right = null;
-                size--;
-                return rightNode;
-            }
-            // 待删除结点右子树为空
-            if (node.right == null) {
-                Node leftNode = node.left;
-                node.left = null;
-                size--;
-                return leftNode;
-            }
-
-            Node successor = minimum(node.right);
-            successor.right = removeMin(node.right);
-            successor.left = node.left;
-            node.left = node.right = null;
-            return successor;
-        }
-    }
-
-    @Override
-    public boolean contains(K key) {
-        return getNode(root, key) != null;
-    }
-
-    private Node getNode(Node node, K key) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = key.compareTo(node.key);
-        if (cmp == 0) {
-            return node;
-        } else if (cmp < 0) {
-            return getNode(node.left, key);
-        } else {
-            return getNode(node.right, key);
-        }
-
-    }
-
-    @Override
-    public V get(K key) {
-        Node node = getNode(root, key);
-        return node == null ? null : node.value;
-    }
-
-    @Override
-    public void set(K key, V newValue) {
-        Node node = getNode(root, key);
-        if (node == null) {
-            throw new IllegalArgumentException(key + " doesn't exist!");
-        }
-
-        node.value = newValue;
-    }
-
-    @Override
-    public int getSize() {
-        return size;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return size == 0;
-    }
-}
diff --git a/DataStructure/Map/src/LinkedListMap.java b/DataStructure/Map/src/LinkedListMap.java
deleted file mode 100644
index cfe29d4..0000000
--- a/DataStructure/Map/src/LinkedListMap.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/8 16:32
- */
-
-public class LinkedListMap<K, V> implements Map<K, V> {
-
-    private class Node {
-
-        public K key;
-        public V value;
-        public Node next;
-
-        public Node(K key, V value, Node next) {
-            this.key = key;
-            this.value = value;
-            this.next = next;
-        }
-
-        public Node(K key) {
-            this(key, null, null);
-        }
-
-        public Node() {
-            this(null, null, null);
-        }
-
-        @Override
-        public String toString() {
-            return key.toString() + value.toString();
-        }
-
-    }
-
-    private Node dummyHead;
-    private int size;
-
-    public LinkedListMap() {
-        dummyHead = new Node();
-        size = 0;
-    }
-
-    @Override
-    public void add(K key, V value) {
-        Node node = getNode(key);
-        if (node == null) {
-            dummyHead.next = new Node(key, value, dummyHead.next);
-            size++;
-        } else {
-            node.value = value;
-        }
-    }
-
-    @Override
-    public V remove(K key) {
-        Node prev = dummyHead;
-        while (prev.next != null) {
-            if (prev.next.key.equals(key)) {
-                Node delNode = prev.next;
-                prev.next = delNode;
-                delNode.next = null;
-                size--;
-                return delNode.value;
-            }
-            prev = prev.next;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean contains(K key) {
-        return getNode(key) != null;
-    }
-
-    @Override
-    public V get(K key) {
-        Node node = getNode(key);
-        return node == null ? null : node.value;
-    }
-
-    @Override
-    public void set(K key, V newValue) {
-        Node node = getNode(key);
-        if (node == null) {
-            throw new IllegalArgumentException(key + " doesn't exist");
-        }
-        node.value = newValue;
-    }
-
-    @Override
-    public int getSize() {
-        return size;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * 返回键为key 的结点
-     */
-    private Node getNode(K key) {
-        Node cur = dummyHead.next;
-        while (cur != null) {
-            if (cur.key.equals(key)) {
-                return cur;
-            }
-            cur = cur.next;
-        }
-        return null;
-    }
-}
diff --git a/DataStructure/Map/src/Map.java b/DataStructure/Map/src/Map.java
deleted file mode 100644
index 738c6dd..0000000
--- a/DataStructure/Map/src/Map.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/8 16:30
- */
-
-public interface Map<K,V> {
-
-    void add(K key, V value);
-
-    V remove(K key);
-
-    boolean contains(K key);
-
-    V get(K key);
-
-    void set(K key, V newValue);
-
-    int getSize();
-
-    boolean isEmpty();
-
-}
diff --git a/DataStructure/Queue/src/Array.java b/DataStructure/Queue/src/Array.java
deleted file mode 100644
index a6dc672..0000000
--- a/DataStructure/Queue/src/Array.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-02 12:03
- */
-public class Array<E> {
-
-    private E[] data;
-    /**
-     * 数组中存放的元素的个数
-     */
-    private int size;
-
-    public Array(int capacity) {
-        data = (E[]) new Object[capacity];
-        size = 0;
-    }
-
-    public Array() {
-        this(10);
-    }
-
-    /**
-     * 返回数组中存放的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回数组容量
-     */
-    public int getCapacity() {
-        return data.length;
-    }
-
-    /**
-     * 返回数组是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * 在 index = 0 处添加元素
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在元素末尾添加新元素
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 在数组指定位置添加元素
-     */
-    public void add(int index, E e) {
-        if (index < 0 | index > size) {
-            throw new IllegalArgumentException("Add failed.Index is illegal");
-        }
-        if (size == data.length) {
-            resize(2 * data.length);
-        }
-
-        //     向右移动元素
-        for (int i = size; i > index; i--) {
-            data[i] = data[i - 1];
-        }
-        data[index] = e;
-        size++;
-    }
-
-    /**
-     * 将数组容量改变为 i
-     */
-    private void resize(int newCapacity) {
-        E[] ret = (E[]) new Object[newCapacity];
-        for (int i = 0; i < size; i++) {
-            ret[i] = data[i];
-        }
-        data = ret;
-    }
-
-    /**
-     * 获取数组第一个元素
-     */
-    E getFirst() {
-        return get(0);
-    }
-
-    /**
-     * 获取索引为 index 的元素
-     */
-    E get(int index) {
-        if (index < 0 | index >= size) {
-            throw new IllegalArgumentException("get faild。Index is illegal");
-        }
-        return data[index];
-    }
-
-    /**
-     * 设置索引为 index 的元素的值
-     */
-    void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("set faild。Index is illegal");
-        }
-        data[index] = e;
-    }
-
-    /**
-     * 查找数组中是否有元素 e
-     */
-    public boolean contains(int e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 查找数组中元素 e 所在的索引
-     */
-    public int find(E e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * 从数组中删除 index 位置的元素，返回删除的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("delete faild,Index is illegal");
-        }
-        E res = data[index];
-        for (int i = index; i < size - 1; i++) {
-            data[i] = data[i + 1];
-        }
-        data[--size] = null;
-        // 防止复杂度震荡
-        if (size == data.length >> 2 && data.length / 2 != 0) {
-            resize(data.length >> 1);
-        }
-        return res;
-    }
-
-    /**
-     * 从数组中删除第一个元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 从数组中删除最后一个元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    /**
-     * 从数组中删除第一个 e
-     */
-    public void removeElement(E e) {
-        int index = find(e);
-        if (index != -1) {
-            remove(index);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
-        res.append('[');
-        for (int i = 0; i < size; i++) {
-            res.append(data[i]);
-            if (i != size - 1) {
-                res.append(",");
-            }
-        }
-        res.append(']');
-        return res.toString();
-    }
-
-
-}
diff --git a/DataStructure/Queue/src/ArrayQueue.java b/DataStructure/Queue/src/ArrayQueue.java
deleted file mode 100644
index 27704de..0000000
--- a/DataStructure/Queue/src/ArrayQueue.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-04 01:55
- */
-public class ArrayQueue<E> implements Queue<E> {
-
-    Array<E> array;
-
-    public ArrayQueue(int capacity) {
-        this.array = new Array<>(capacity);
-    }
-
-    public ArrayQueue() {
-        this.array = new Array<>();
-    }
-
-    @Override
-    public void enqueue(E e) {
-        array.addLast(e);
-    }
-
-    @Override
-    public E dequeue() {
-        return array.removeFirst();
-    }
-
-    @Override
-    public E getFront() {
-        return array.getFirst();
-    }
-
-    @Override
-    public int getSize() {
-        return array.getSize();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return array.isEmpty();
-    }
-
-    /**
-     * 获取队列的长度
-     */
-    public int getCapacity() {
-        return array.getCapacity();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append("Queue：");
-        res.append("front [");
-        for (int i = 0; i < array.getSize(); i++) {
-            res.append(array.get(i));
-            if (i != array.getSize() - 1) {
-                res.append(",");
-            }
-        }
-        res.append("] tail");
-        return res.toString();
-    }
-
-    public static void main(String[] args) {
-        ArrayQueue<Integer> queue = new ArrayQueue<>();
-        for (int i = 0; i < 10; i++) {
-            queue.enqueue(i);
-            System.out.println(queue);
-
-            if (i % 3 == 2) {
-                queue.dequeue();
-                System.out.println(queue);
-            }
-        }
-    }
-}
diff --git a/DataStructure/Queue/src/LinkedListQueue.java b/DataStructure/Queue/src/LinkedListQueue.java
deleted file mode 100644
index 7139b24..0000000
--- a/DataStructure/Queue/src/LinkedListQueue.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-05 01:39
- */
-public class LinkedListQueue<E> implements Queue<E> {
-
-    private class Node {
-
-        public E e;
-        public Node next;
-
-        public Node(E e, Node next) {
-            this.e = e;
-            this.next = next;
-        }
-
-        public Node(E e) {
-            this(e, null);
-        }
-
-        public Node() {
-            this(null, null);
-        }
-
-        @Override
-        public String toString() {
-            return e.toString();
-        }
-
-    }
-
-    private Node head, tail;
-    private int size;
-
-    @Override
-    public void enqueue(E e) {
-        if (tail == null) {
-            tail = new Node(e);
-            head = tail;
-        } else {
-            tail.next = new Node(e);
-            tail = tail.next;
-        }
-        size++;
-    }
-
-    @Override
-    public E dequeue() {
-        if (isEmpty()) {
-            throw new IllegalArgumentException("Dequeue failed,Queue is empty");
-        }
-        Node ret = head;
-        head = head.next;
-        ret.next = null;
-        if (head == null) {
-            tail = null;
-        }
-        size--;
-        return ret.e;
-    }
-
-    @Override
-    public E getFront() {
-        if (isEmpty()) {
-            throw new IllegalArgumentException("Dequeue failed,Queue is empty");
-        }
-        return head.e;
-
-    }
-
-    @Override
-    public int getSize() {
-        return size;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append("Queue: front ");
-        for (Node cur = head; cur != null; cur = cur.next) {
-            res.append(cur).append("->");
-        }
-        res.append("NULL tail");
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Queue/src/LoopQueue.java b/DataStructure/Queue/src/LoopQueue.java
deleted file mode 100644
index 3ce1740..0000000
--- a/DataStructure/Queue/src/LoopQueue.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * 弥补普通队列出队O(n)复杂度
- * @author: changle
- * @time: 2019-03-04 02:22
- */
-public class LoopQueue<E> implements Queue<E> {
-
-    private E[] data;
-    private int front, tail;
-    private int size;
-
-    public LoopQueue(int capacity) {
-        data = (E[]) new Object[capacity + 1];
-        front = 0;
-        tail = 0;
-        size = 0;
-    }
-
-    public LoopQueue() {
-        this(10);
-    }
-
-
-    public int getCapacity() {
-        return data.length - 1;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return front == tail;
-    }
-
-    @Override
-    public int getSize() {
-        return size;
-    }
-
-    @Override
-    public void enqueue(E e) {
-        if ((tail + 1) % data.length == front) {
-            resize(getCapacity() * 2);
-        }
-        data[tail] = e;
-        tail = (tail + 1) % data.length;
-        size++;
-
-    }
-
-    @Override
-    public E dequeue() {
-        if (isEmpty()) {
-            throw new IllegalArgumentException("dequeue faild。LoopQueue is empty");
-        }
-        E ret = data[front];
-        data[front] = null;
-        front = (front + 1) % data.length;
-        size--;
-        if (size == getCapacity() / 4 && getCapacity() / 2 != 0) {
-            resize(getCapacity() / 2);
-        }
-        return ret;
-    }
-
-    @Override
-    public E getFront() {
-        if (isEmpty()) {
-            throw new IllegalArgumentException("dequeue faild。LoopQueue is empty");
-        }
-        return data[front];
-    }
-
-    private void resize(int newCapacity) {
-        E[] newData = (E[]) new Object[newCapacity + 1];
-        for (int i = 0; i < size; i++) {
-            newData[i] = data[(i + front) % data.length];
-        }
-        data = newData;
-        front = 0;
-        tail = size;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append(String.format("Queue : size = %d, capacity = %d\n", size, getCapacity()));
-        res.append("front [");
-        for (int i = front; i % data.length != tail; i++) {
-            res.append(data[i % data.length]);
-            if ((i + 1) % data.length != tail) {
-                res.append(",");
-            }
-        }
-        res.append("] tail");
-        return res.toString();
-    }
-
-    public static void main(String[] args) {
-        LoopQueue<Integer> queue = new LoopQueue<>();
-        for (int i = 0; i < 10; i++) {
-            queue.enqueue(i);
-            System.out.println(queue);
-
-            if (i % 3 == 2) {
-                queue.dequeue();
-                System.out.println(queue);
-            }
-        }
-
-    }
-}
diff --git a/DataStructure/Queue/src/Queue.java b/DataStructure/Queue/src/Queue.java
deleted file mode 100644
index f31bed5..0000000
--- a/DataStructure/Queue/src/Queue.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-04 01:51
- */
-public interface Queue<E> {
-
-    /**
-     * 入队
-     */
-    void enqueue(E e);
-
-    /**
-     * 出队，返回出队的元素值
-     */
-    E dequeue();
-
-    /**
-     * 获取队首元素的值
-     */
-    E getFront();
-
-    /**
-     * 返回队列的元素个数
-     */
-    int getSize();
-
-    /**
-     * 队列是否为空
-     */
-    boolean isEmpty();
-}
diff --git a/DataStructure/Set/src/BST.java b/DataStructure/Set/src/BST.java
deleted file mode 100644
index b805dac..0000000
--- a/DataStructure/Set/src/BST.java
+++ /dev/null
@@ -1,303 +0,0 @@
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Stack;
-
-/**
- * @author Changle
- * @date 2019/2/27 17:25
- */
-
-public class BST<E extends Comparable<E>> {
-
-    private class Node {
-
-        private E e;
-
-        private int N;
-
-        Node left, right;
-
-        Node(E e) {
-            this.e = e;
-            left = null;
-            right = null;
-        }
-    }
-
-    /**
-     * 根结点
-     */
-    private Node root;
-
-    /**
-     * @return 返回 以 node 为根的 BST 结点的个数
-     */
-    int size() {
-        return size(root);
-    }
-
-
-    private int size(Node node) {
-        if (node == null) {
-            return 0;
-        }
-        return node.N;
-    }
-
-    boolean isEmpty() {
-        return size(root) == 0;
-    }
-
-    /**
-     * 向 BST 中插入结点 e
-     */
-    public void add(E e) {
-        root = add(e, root);
-    }
-
-    private Node add(E e, Node node) {
-        if (node == null) {
-            return new Node(e);
-        }
-        int cmp = e.compareTo(node.e);
-        // 如果插入结点的值小于该结点，则插入左子树，否则插入右子树
-        if (cmp < 0) {
-            node.left = add(e, node.left);
-        } else if (cmp > 0) {
-            node.right = add(e, node.right);
-        }
-        // 更新结点个数
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 查询该 BST 中是否包含元素 e
-     */
-
-    public boolean contains(E e) {
-        return contains(e, root);
-    }
-
-    private boolean contains(E e, Node node) {
-        if (node == null) {
-            return false;
-        }
-        //    如果查询结点的值小于该结点，则查询左子树；查询结点的值等于该结点，则返回 true;否则查询右子树
-        int cmp = e.compareTo(node.e);
-        if (cmp < 0) {
-            return contains(e, node.left);
-        } else if (cmp == 0) {
-            return true;
-        } else {
-            return contains(e, node.right);
-        }
-    }
-
-    /**
-     * 先序遍历
-     */
-    public void preOrder() {
-        preOrder(root);
-    }
-
-    private void preOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        System.out.println(node.e);
-        preOrder(node.left);
-        preOrder(node.right);
-    }
-
-    /**
-     * 非递归遍历
-     */
-    public void preOrderNR() {
-        Stack<Node> stack = new Stack();
-        stack.push(root);
-        while (!stack.isEmpty()) {
-            Node cur = stack.pop();
-            System.out.println(cur.e);
-
-            if (cur.right != null) {
-                stack.push(cur.right);
-            }
-            if (cur.left != null) {
-                stack.push(cur.left);
-            }
-        }
-    }
-
-    /**
-     * 中序遍历
-     */
-    public void inOrder() {
-        inOrder(root);
-    }
-
-    private void inOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        inOrder(node.left);
-        System.out.println(node.e);
-        inOrder(node.right);
-    }
-
-    /**
-     * 后序遍历
-     */
-    public void postOrder() {
-        postOrder(root);
-    }
-
-    private void postOrder(Node node) {
-        if (node == null) {
-            return;
-        }
-        postOrder(node.left);
-        postOrder(node.right);
-        System.out.println(node.e);
-    }
-
-    /**
-     * 层序遍历
-     */
-    public void levelOrder() {
-        Queue<Node> queue = new LinkedList<>();
-        queue.add(root);
-        while (!queue.isEmpty()) {
-            Node cur = queue.remove();
-            System.out.println(cur.e);
-            if (cur.left != null) {
-                queue.add(cur.left);
-            }
-            if (cur.right != null) {
-                queue.add(cur.right);
-            }
-        }
-    }
-
-    /**
-     * 返回最小值
-     */
-    public Node min() {
-        return min(root);
-    }
-
-    private Node min(Node node) {
-        if (node == null) {
-            return null;
-        }
-        if (node.left == null) {
-            return node;
-        }
-        return min(node.left);
-    }
-
-
-    /**
-     * 删除最小元素
-     */
-    public Node deleteMin() {
-        if (root == null) {
-            return null;
-        }
-        return deleteMin(root);
-    }
-
-    private Node deleteMin(Node node) {
-        if (node.left == null) {
-            return node.right;
-        } else {
-            node.left = deleteMin(node.left);
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 删除最大元素
-     */
-    public Node deleteMax() {
-        if (root == null) {
-            return null;
-        }
-        return deleteMax(root);
-    }
-
-    private Node deleteMax(Node node) {
-        if (node.right == null) {
-            return node.left;
-        } else {
-            node.right = deleteMin(node.right);
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-    /**
-     * 删除元素
-     */
-    public Node delete(E e) {
-        return delete(e, root);
-    }
-
-    private Node delete(E e, Node node) {
-        if (node == null) {
-            return null;
-        }
-        int cmp = e.compareTo(node.e);
-        if (cmp < 0) {
-            node.left = delete(e, node.left);
-        } else if (cmp > 0) {
-            node.right = delete(e, node.right);
-        } else {
-            if (node.left == null) {
-                return node.right;
-            }
-            if (node.right == null) {
-                return node.left;
-            }
-            Node t = node;
-            node = min(t.right);
-            node.right = deleteMin(t.right);
-            node.left = t.left;
-        }
-        node.N = size(node.left) + size(node.right) + 1;
-        return node;
-    }
-
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-
-        generateBSTString(root, 0, res);
-        return res.toString();
-    }
-
-    /**
-     * 生成以 node 为根节点，深度为 depth 的描述二叉树的字符串
-     */
-    private void generateBSTString(Node node, int depth, StringBuilder res) {
-        if (node == null) {
-            res.append(generateDepthString(depth)).append("null\n");
-            return;
-        }
-        res.append(generateDepthString(depth)).append(node.e).append("\n");
-        generateBSTString(node.left, depth + 1, res);
-        generateBSTString(node.right, depth + 1, res);
-    }
-
-    private String generateDepthString(int depth) {
-        StringBuilder res = new StringBuilder();
-        for (int i = 0; i < depth; i++) {
-            res.append("--");
-        }
-        return res.toString();
-    }
-
-
-}
diff --git a/DataStructure/Set/src/BSTSet.java b/DataStructure/Set/src/BSTSet.java
deleted file mode 100644
index 8683105..0000000
--- a/DataStructure/Set/src/BSTSet.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/1 10:29
- */
-
-public class BSTSet<E extends Comparable<E>> implements Set<E> {
-
-    private BST<E> bst;
-
-    public BSTSet() {
-        this.bst = new BST<>();
-    }
-
-    @Override
-    public void add(E e) {
-        bst.add(e);
-    }
-
-    @Override
-    public void remove(E e) {
-        bst.delete(e);
-    }
-
-    @Override
-    public boolean contains(E e) {
-        return bst.contains(e);
-    }
-
-    @Override
-    public int getSize() {
-        return bst.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return bst.isEmpty();
-    }
-}
diff --git a/DataStructure/Set/src/LinkedList.java b/DataStructure/Set/src/LinkedList.java
deleted file mode 100644
index be98d64..0000000
--- a/DataStructure/Set/src/LinkedList.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-05 00:00
- */
-public class LinkedList<E> {
-
-    private class Node {
-
-        public E e;
-        public Node next;
-
-        public Node(E e, Node next) {
-            this.e = e;
-            this.next = next;
-        }
-
-        public Node(E e) {
-            this(e, null);
-        }
-
-        public Node() {
-            this(null, null);
-        }
-
-        @Override
-        public String toString() {
-            return e.toString();
-        }
-
-    }
-
-    private Node dummyHead;
-    int size;
-
-    public LinkedList() {
-        dummyHead = new Node(null, null);
-        size = 0;
-    }
-
-    /**
-     * 获取链表中的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回链表是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-
-    /**
-     * 在链表中索引为 index 的位置插入元素 e
-     */
-    public void add(int index, E e) {
-        if (index < 0 || index > size) {
-            throw new IllegalArgumentException("Add failed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        prev.next = new Node(e, prev.next);
-        size++;
-    }
-
-    /**
-     * 在链表头添加新的元素 e
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在链表末尾添加新的元素 e
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 获取链表索引为 index 的元素 e
-     */
-    public E get(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        return cur.e;
-    }
-
-    /**
-     * 获取链表的第一个元素
-     */
-    public E getFirst() {
-        return get(0);
-    }
-
-    /**
-     * 获取链表的最后一个元素
-     */
-    public E getLast() {
-        return get(size - 1);
-    }
-
-    /**
-     * 删除链表中元素 e
-     */
-    public void removeElement(E e) {
-        Node prev = dummyHead;
-        while (prev.next != null) {
-            if (prev.next.e.equals(e)) {
-                Node delNode = prev.next;
-                prev.next = delNode.next;
-                delNode.next = null;
-                size--;
-                break;
-            }
-            prev = prev.next;
-        }
-    }
-
-    /**
-     * 修改链表索引为 index 的元素为 e
-     */
-    public void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        cur.e = e;
-    }
-
-    /**
-     * 查找链表中是否有元素 e
-     */
-    public boolean contains(E e) {
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            if (cur.e == e) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 删除索引为 index 的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        Node ret = prev.next;
-        prev.next = ret.next;
-        ret.next = null;
-        size--;
-
-        return ret.e;
-    }
-
-    /**
-     * 删除链表中第一个元素，返回删除的元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 删除链表中最后一个元素，返回删除的元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            res.append(cur).append("->");
-        }
-        res.append("NULL");
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Set/src/LinkedListSet.java b/DataStructure/Set/src/LinkedListSet.java
deleted file mode 100644
index f8beb33..0000000
--- a/DataStructure/Set/src/LinkedListSet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/8 15:59
- */
-
-public class LinkedListSet<E> implements Set<E> {
-
-    private LinkedList<E> list;
-
-    public LinkedListSet() {
-        this.list = new LinkedList<>();
-    }
-
-    @Override
-    public void add(E e) {
-        if (!list.contains(e)) {
-            list.addFirst(e);
-        }
-    }
-
-    @Override
-    public void remove(E e) {
-        list.removeElement(e);
-    }
-
-    @Override
-    public boolean contains(E e) {
-        return list.contains(e);
-    }
-
-    @Override
-    public int getSize() {
-        return list.getSize();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return list.isEmpty();
-    }
-}
diff --git a/DataStructure/Set/src/Set.java b/DataStructure/Set/src/Set.java
deleted file mode 100644
index 72bc837..0000000
--- a/DataStructure/Set/src/Set.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/1 10:28
- */
-
-public interface Set<E> {
-
-    void add(E e);
-
-    void remove(E e);
-
-    boolean contains(E e);
-
-    int getSize();
-
-    boolean isEmpty();
-
-}
diff --git a/DataStructure/Stack/src/Array.java b/DataStructure/Stack/src/Array.java
deleted file mode 100644
index 688952c..0000000
--- a/DataStructure/Stack/src/Array.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-02 12:03
- */
-public class Array<E> {
-
-    private E[] data;
-    /**
-     * 数组中存放的元素的个数
-     */
-    private int size;
-
-    public Array(int capacity) {
-        data = (E[]) new Object[capacity];
-        size = 0;
-    }
-
-    public Array() {
-        this(10);
-    }
-
-    /**
-     * 返回数组中存放的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回数组容量
-     */
-    public int getCapacity() {
-        return data.length;
-    }
-
-    /**
-     * 返回数组是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * 在 index = 0 处添加元素
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在元素末尾添加新元素
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 在数组指定位置添加元素
-     */
-    public void add(int index, E e) {
-        if (index < 0 | index > size) {
-            throw new IllegalArgumentException("Add failed.Index is illegal");
-        }
-        if (size == data.length) {
-            resize(2 * data.length);
-        }
-
-        //     向右移动元素
-        for (int i = size; i > index; i--) {
-            data[i] = data[i - 1];
-        }
-        data[index] = e;
-        size++;
-    }
-
-    /**
-     * 将数组容量改变为 i
-     */
-    private void resize(int newCapacity) {
-        E[] ret = (E[]) new Object[newCapacity];
-        for (int i = 0; i < size; i++) {
-            ret[i] = data[i];
-        }
-        data = ret;
-    }
-
-    /**
-     * 获取索引为 index 的元素
-     */
-    E get(int index) {
-        if (index < 0 | index >= size) {
-            throw new IllegalArgumentException("get faild。Index is illegal");
-        }
-        return data[index];
-    }
-
-    E getLast() {
-        return get(size - 1);
-    }
-
-    E getFirst() {
-        return get(0);
-    }
-
-    /**
-     * 设置索引为 index 的元素的值
-     */
-    void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("set faild。Index is illegal");
-        }
-        data[index] = e;
-    }
-
-    /**
-     * 查找数组中是否有元素 e
-     */
-    public boolean contains(int e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 查找数组中元素 e 所在的索引
-     */
-    public int find(E e) {
-        for (int i = 0; i < size; i++) {
-            if (data[i].equals(e)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * 从数组中删除 index 位置的元素，返回删除的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("delete faild,Index is illegal");
-        }
-        E res = data[index];
-        for (int i = index; i < size - 1; i++) {
-            data[i] = data[i + 1];
-        }
-        data[--size] = null;
-        // 防止复杂度震荡
-        if (size == data.length >> 2 && data.length / 2 != 0) {
-            resize(data.length >> 1);
-        }
-        return res;
-    }
-
-    /**
-     * 从数组中删除第一个元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 从数组中删除最后一个元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    /**
-     * 从数组中删除第一个 e
-     */
-    public void removeElement(E e) {
-        int index = find(e);
-        if (index != -1) {
-            remove(index);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
-        res.append('[');
-        for (int i = 0; i < size; i++) {
-            res.append(data[i]);
-            if (i != size - 1) {
-                res.append(",");
-            }
-        }
-        res.append(']');
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Stack/src/ArrayStack.java b/DataStructure/Stack/src/ArrayStack.java
deleted file mode 100644
index 884ada7..0000000
--- a/DataStructure/Stack/src/ArrayStack.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-03 18:18
- */
-public class ArrayStack<E> implements Stack<E> {
-
-    Array<E> array;
-
-    public ArrayStack(int capacity) {
-        array = new Array<>(capacity);
-    }
-
-    public ArrayStack() {
-        this.array = new Array<>();
-    }
-
-    @Override
-    public void push(E e) {
-        array.addLast(e);
-    }
-
-    @Override
-    public E pop() {
-        return array.removeLast();
-    }
-
-    @Override
-    public E peek() {
-        return array.getLast();
-    }
-
-    @Override
-    public int getSize() {
-        return array.getSize();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return array.isEmpty();
-    }
-
-    public int getCapacity() {
-        return array.getCapacity();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        res.append("Stack: ");
-        res.append('[');
-        for (int i = 0; i < array.getSize(); i++) {
-            res.append(array.get(i));
-            if (i != array.getSize() - 1) {
-                res.append(",");
-            }
-        }
-        res.append("]top");
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Stack/src/LinkedList.java b/DataStructure/Stack/src/LinkedList.java
deleted file mode 100644
index 6bddd8f..0000000
--- a/DataStructure/Stack/src/LinkedList.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-05 00:00
- */
-public class LinkedList<E> {
-
-    private class Node {
-
-        public E e;
-        public Node next;
-
-        public Node(E e, Node next) {
-            this.e = e;
-            this.next = next;
-        }
-
-        public Node(E e) {
-            this(e, null);
-        }
-
-        public Node() {
-            this(null, null);
-        }
-
-        @Override
-        public String toString() {
-            return e.toString();
-        }
-
-    }
-
-    private Node dummyHead;
-    int size;
-
-    public LinkedList() {
-        dummyHead = new Node(null, null);
-        size = 0;
-    }
-
-    /**
-     * 获取链表中的元素个数
-     */
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * 返回链表是否为空
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-
-    /**
-     * 在链表中索引为 index 的位置插入元素 e
-     */
-    public void add(int index, E e) {
-        if (index < 0 || index > size) {
-            throw new IllegalArgumentException("Add failed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        prev.next = new Node(e, prev.next);
-        size++;
-    }
-
-    /**
-     * 在链表头添加新的元素 e
-     */
-    public void addFirst(E e) {
-        add(0, e);
-    }
-
-    /**
-     * 在链表末尾添加新的元素 e
-     */
-    public void addLast(E e) {
-        add(size, e);
-    }
-
-    /**
-     * 获取链表索引为 index 的元素 e
-     */
-    public E get(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        return cur.e;
-    }
-
-    /**
-     * 获取链表的第一个元素
-     */
-    public E getFirst() {
-        return get(0);
-    }
-
-    /**
-     * 获取链表的最后一个元素
-     */
-    public E getLast() {
-        return get(size - 1);
-    }
-
-    /**
-     * 修改链表索引为 index 的元素为 e
-     */
-    public void set(int index, E e) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node cur = dummyHead.next;
-        for (int i = 0; i < index; i++) {
-            cur = cur.next;
-        }
-        cur.e = e;
-    }
-
-    /**
-     * 查找链表中是否有元素 e
-     */
-    public boolean contains(E e) {
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            if (cur.e == e) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 删除索引为 index 的元素
-     */
-    public E remove(int index) {
-        if (index < 0 || index >= size) {
-            throw new IllegalArgumentException("Get fialed,Illegal index");
-        }
-        Node prev = dummyHead;
-        for (int i = 0; i < index; i++) {
-            prev = prev.next;
-        }
-        Node ret = prev.next;
-        prev.next = ret.next;
-        ret.next = null;
-        size--;
-
-        return ret.e;
-    }
-
-    /**
-     * 删除链表中第一个元素，返回删除的元素
-     */
-    public E removeFirst() {
-        return remove(0);
-    }
-
-    /**
-     * 删除链表中最后一个元素，返回删除的元素
-     */
-    public E removeLast() {
-        return remove(size - 1);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder res = new StringBuilder();
-        for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
-            res.append(cur).append("->");
-        }
-        res.append("NULL");
-        return res.toString();
-    }
-}
diff --git a/DataStructure/Stack/src/LinkedListStack.java b/DataStructure/Stack/src/LinkedListStack.java
deleted file mode 100644
index 4f2611f..0000000
--- a/DataStructure/Stack/src/LinkedListStack.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-05 01:24
- */
-public class LinkedListStack<E> implements Stack<E> {
-
-    private LinkedList<E> linkedList;
-
-
-    public LinkedListStack() {
-        linkedList = new LinkedList<>();
-    }
-
-    @Override
-    public void push(E e) {
-        linkedList.addFirst(e);
-    }
-
-    @Override
-    public E pop() {
-        return linkedList.removeFirst();
-    }
-
-    @Override
-    public E peek() {
-        return linkedList.getFirst();
-    }
-
-    @Override
-    public int getSize() {
-        return linkedList.getSize();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return linkedList.isEmpty();
-    }
-
-    @Override
-    public String toString() {
-        return "Stack: top "
-                + linkedList;
-    }
-}
diff --git a/DataStructure/Stack/src/Stack.java b/DataStructure/Stack/src/Stack.java
deleted file mode 100644
index 1fd9648..0000000
--- a/DataStructure/Stack/src/Stack.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-03-03 18:15
- */
-public interface Stack<E> {
-
-    void push(E e);
-
-    E pop();
-
-    E peek();
-
-    int getSize();
-
-    boolean isEmpty();
-}
diff --git a/DataStructure/Trie/src/Trie.java b/DataStructure/Trie/src/Trie.java
deleted file mode 100644
index b698e1b..0000000
--- a/DataStructure/Trie/src/Trie.java
+++ /dev/null
@@ -1,71 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author: changle
- * @time: 2019-03-13 00:27
- */
-
-class Trie {
-
-    private Node root;
-
-    class Node {
-
-        public boolean isWord;
-        public Map<Character, Node> next;
-
-        public Node() {
-            this(false);
-        }
-
-        public Node(boolean isWord) {
-            this.isWord = isWord;
-            next = new HashMap<>();
-        }
-    }
-
-    public Trie() {
-        root = new Node();
-    }
-
-    public void add(String word) {
-        Node cur = root;
-        for (int i = 0; i < word.length(); i++) {
-            char c = word.charAt(i);
-            if (cur.next.get(c) == null) {
-                cur.next.put(c, new Node());
-            }
-            cur = cur.next.get(c);
-        }
-
-        if (!cur.isWord) {
-            cur.isWord = true;
-        }
-    }
-
-    public boolean contains(String word) {
-        Node cur = root;
-        for (int i = 0; i < word.length(); i++) {
-            char c = word.charAt(i);
-            if (cur.next.get(c) == null) {
-                return false;
-            }
-            cur = cur.next.get(c);
-        }
-
-        return cur.isWord;
-    }
-
-    public boolean isPrefix(String prefix) {
-        Node cur = root;
-        for (int i = 0; i < prefix.length(); i++) {
-            char c = prefix.charAt(i);
-            if (cur.next.get(c) == null) {
-                return false;
-            }
-            cur = cur.next.get(c);
-        }
-        return true;
-    }
-}
diff --git a/LeetCode/0001. Two Sum/src/Solution.java b/LeetCode/0001. Two Sum/src/Solution.java
deleted file mode 100644
index beb15fb..0000000
--- a/LeetCode/0001. Two Sum/src/Solution.java	
+++ /dev/null
@@ -1,40 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:05
- * Source: https://leetcode.com/problems/two-sum/description/
- */
-
-/*
-因为无序所以不能使用对撞指针，而且需要记录索引值，因此将数据存储在 HashMap 中。
-所以先将元素遍历一遍加入到 hashmap 中。第二次遍历时，去 hashmap 中查找 target - nums[i]。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public int[] twoSum(int[] nums, int target) {
-        int[] res = new int[2];
-
-        Map<Integer,Integer> map = new HashMap();
-        for(int i = 0;i < nums.length;i++){
-            map.put(nums[i],i);
-        }
-
-        for(int i = 0;i < nums.length;i++){
-            if(map.containsKey(target - nums[i])){
-                if(map.get(target - nums[i]) != i){
-
-                    res[0] = i;
-                    res[1] = map.get(target - nums[i]);
-                    break;
-                }
-            }
-        }
-
-        return res;
-
-    }
-}
diff --git a/LeetCode/0003. Longest Substring Without Repeating Characters/src/Solution.java b/LeetCode/0003. Longest Substring Without Repeating Characters/src/Solution.java
deleted file mode 100644
index 9bf4b7b..0000000
--- a/LeetCode/0003. Longest Substring Without Repeating Characters/src/Solution.java	
+++ /dev/null
@@ -1,67 +0,0 @@
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * User: Changle
- * Date: 2018-02-21 14:08
- * Source: https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
- */
-
-/*
-使用滑动窗口，当新字符不是重复字符时，r 继续移动。
-当为重复字符时，将 l 移动到重复字符在 str 中的位置后一位。
-
-时间复杂度: O(n^2)
-空间复杂度: O(1)
- */
-public class Solution {
-
-    public int lengthOfLongestSubstring(String s) {
-        int l = 0, r = 0;
-        String res = "";
-        String str = "";
-        while (r < s.length()) {
-            char c = s.charAt(r);
-
-            if (str.contains(c + "")) {
-                int index = str.indexOf(c);
-                l = index + l + 1;
-                str = str.substring(index + 1) + c;
-                r++;
-            } else {
-                str = str + c;
-                res = (str.length() > res.length()) ? str : res;
-                r++;
-            }
-        }
-        return res.length();
-    }
-}
-
-/*
-用 HashSet 来存储出现的字符。
-如果新字符没有出现，则加入。
-如果新字符为重复字符。那么一直删除 set 中的元素。直到重复的那个字符被删除掉。
-
-时间复杂度: O(n);
-空间复杂度: O(len(charset);
- */
-class Solution1{
-    public static int lengthOfLongestSubstring(String s) {
-        int i = 0,j = 0;
-        int max = 0;
-        Set<Character> set = new HashSet<>();
-
-        while (j < s.length()) {
-            if (!set.contains(s.charAt(j))) {
-                set.add(s.charAt(j++));
-                max = Math.max(max, set.size());
-            } else {
-                set.remove(i++);
-            }
-        }
-        return max;
-    }
-}
diff --git a/LeetCode/0009. Palindrome Number/src/Solution.java b/LeetCode/0009. Palindrome Number/src/Solution.java
deleted file mode 100644
index a2aab5f..0000000
--- a/LeetCode/0009. Palindrome Number/src/Solution.java	
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-06-11 21:32
- * source: https://leetcode.com/problems/palindrome-number/
- */
-public class Solution {
-
-    public static boolean isPalindrome(int x) {
-        if (x < 0) {
-            return false;
-        }
-
-        long reverse = 0;
-        int primaryX = x;
-        int curBit;
-        for (int i = getLengthOfInteger(x) - 1; i >= 0; i--) {
-
-            curBit = x % 10;
-            x /= 10;
-            reverse += curBit * Math.pow(10, i);
-        }
-
-        return  reverse == primaryX ;
-    }
-
-
-   static int getLengthOfInteger(int x) {
-        // x 的长度
-        int lengthOfX = 0;
-        int temp = x;
-        while (temp > 0) {
-            temp /= 10;
-            lengthOfX++;
-        }
-        return lengthOfX;
-    }
-
-    public static void main(String[] args) {
-        System.out.println(isPalindrome(121));
-
-    }
-
-
-}
diff --git a/LeetCode/0011. Container With Most Water/src/Solution.java b/LeetCode/0011. Container With Most Water/src/Solution.java
deleted file mode 100644
index 7097b3e..0000000
--- a/LeetCode/0011. Container With Most Water/src/Solution.java	
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-20 00:50
- * Source: https://leetcode.com/problems/container-with-most-water/description/
- */
-
-/*
-对撞指针。
-根据短板理论，装水的容量由最低的墙决定。所以我们要不断调整指向的墙高度 比较低的指针 的位置。
-过程中一直计算区域的面积。当两指针相遇，就可以返回最大面积。
-
-时间复杂度: O(n)
-空间复杂度: O(1)
- */
-public class Solution {
-
-    public int maxArea(int[] height) {
-        int area = 0;
-        int left = 0;
-        int right = height.length - 1;
-        while (left < right) {
-            area = Math.max(area, Math.min(height[left], height[right]) * (right - left));
-            if (height[left] <= height[right]) {
-                left++;
-            } else {
-                right--;
-            }
-        }
-
-        return area;
-    }
-}
diff --git a/LeetCode/0013. Roman to Integer/src/Solution.java b/LeetCode/0013. Roman to Integer/src/Solution.java
deleted file mode 100644
index f4c8126..0000000
--- a/LeetCode/0013. Roman to Integer/src/Solution.java	
+++ /dev/null
@@ -1,46 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author: changle
- * @time: 2019-06-13 02:33
- * source: https://leetcode.com/problems/roman-to-integer/
- */
-public class Solution {
-
-    Map<String, Integer> map = new HashMap<>();
-
-    //map 初始化
-    public void initMap() {
-        map.put("I", 1);
-        map.put("V", 5);
-        map.put("X", 10);
-        map.put("L", 50);
-        map.put("C", 100);
-        map.put("D", 500);
-        map.put("M", 1000);
-        map.put("IV", 4);
-        map.put("IX", 9);
-        map.put("XL", 40);
-        map.put("XC", 90);
-        map.put("CD", 400);
-        map.put("CM", 900);
-    }
-
-    public int romanToInt(String s) {
-        initMap();
-
-        int result = 0;
-        for (int i = 0; i < s.length(); i++) {
-            //判断是否是两位字符表示的数字
-            if (s.length() - i > 1 && map.get(s.substring(i, i + 2)) != null) {
-                result += map.get(s.substring(i, i + 2));
-                i++;
-            } else {
-                result += map.get("" + s.charAt(i));
-            }
-        }
-
-        return result;
-    }
-}
diff --git a/LeetCode/0014. Longest Common Prefix/src/Solution.java b/LeetCode/0014. Longest Common Prefix/src/Solution.java
deleted file mode 100644
index d4ad66a..0000000
--- a/LeetCode/0014. Longest Common Prefix/src/Solution.java	
+++ /dev/null
@@ -1,26 +0,0 @@
-import java.util.Arrays;
-
-/**
- * @author: changle
- * @time: 2019-06-13 21:56
- * source: https://leetcode.com/problems/longest-common-prefix/
- */
-public class Solution {
-
-
-    public  String longestCommonPrefix(String[] strs) {
-        if (strs.length == 0) {
-            return "";
-        }
-
-        String firstStr = strs[0];
-        for (int i = 1; i <= firstStr.length(); i++) {
-            String prefix = firstStr.substring(0, i);
-            if (Arrays.stream(strs).skip(1).anyMatch(str -> !str.startsWith(prefix))) {
-                return prefix.substring(0, i - 1);
-            }
-        }
-        return firstStr;
-    }
-
-}
diff --git a/LeetCode/0015. 3Sum/src/Solution.java b/LeetCode/0015. 3Sum/src/Solution.java
deleted file mode 100644
index 2c5a177..0000000
--- a/LeetCode/0015. 3Sum/src/Solution.java	
+++ /dev/null
@@ -1,51 +0,0 @@
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:13
- * Source: https://leetcode.com/problems/3sum/description/
- */
-
-/*
-考虑到 3sum 至少需要两遍循环，复杂度至少是 O(n^2) ，所以可以先排序。
-排序之后使用对撞指针即可。
-
-相比 2sum ，关键在于过滤掉重复的结果。
-
-时间复杂度: O(n^2)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    class Solution {
-     public List<List<Integer>> threeSum(int[] nums) {
-        List<List<Integer>> res = new ArrayList<>();
-        Arrays.sort(nums);
-        for (int i = 0; i < nums.length - 2; i++) {
-            if (i > 0 && nums[i] == nums[i - 1]) {
-                continue;
-            }
-            int left = i + 1;
-            int right = nums.length - 1;
-            while (left < right) {
-                int sum = nums[i] + nums[left] + nums[right];
-                if (sum == 0) {
-                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
-                    // 找到一组后还要继续寻找
-                    left++;
-                    right--;
-                    while (left < right && nums[left] == nums[left - 1]) left++;
-                    while (left < right && nums[right] == nums[right + 1]) right--;
-                } else if (sum < 0) {
-                    left++;
-                } else {
-                    right--;
-                }
-            }
-        }
-        return res;
-    }
-}
-}
diff --git a/LeetCode/0016. 3Sum Closest/src/Solution.java b/LeetCode/0016. 3Sum Closest/src/Solution.java
deleted file mode 100644
index 754d7e6..0000000
--- a/LeetCode/0016. 3Sum Closest/src/Solution.java	
+++ /dev/null
@@ -1,37 +0,0 @@
-import java.util.Arrays;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:16
- * Source: https://leetcode.com/problems/3sum-closest/description/
- */
-
-/*
-使用绝对值来判断距离。先排序，固定一个数，然后使用对撞指针。
-
-时间复杂度: O(n^2)
-空间复杂度: O(1)
- */
-public class Solution {
-    // 因为必定存在结果，所以直接先把结果设置成数组里面三个数字的和
-    public int threeSumClosest(int[] nums, int target) {
-        Arrays.sort(nums);
-        int res = nums[0] + nums[1] + nums[2];
-        for (int i = 0; i < nums.length - 2; i++) {
-            int l = i + 1;
-            int r = nums.length - 1;
-            while (l < r) {
-                int sum = nums[i] + nums[l] + nums[r];
-                res = Math.abs(sum - target) < Math.abs(res - target) ? sum : res;
-                if (sum < target) {
-                    l++;
-                } else if (sum > target) {
-                    r--;
-                } else {
-                    return sum;
-                }
-            }
-        }
-        return res;
-    }
-}
diff --git a/LeetCode/0017. Letter Combinations of a Phone Number/src/Solution.java b/LeetCode/0017. Letter Combinations of a Phone Number/src/Solution.java
deleted file mode 100644
index e765fd0..0000000
--- a/LeetCode/0017. Letter Combinations of a Phone Number/src/Solution.java	
+++ /dev/null
@@ -1,41 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: changle
- * @time: 2019-01-26 04:52
- * Source: https://leetcode.com/problems/letter-combinations-of-a-phone-number/
- */
-public class Solution {
-
-    List<String> result = new ArrayList<>();
-
-    private final String[] letterMap = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
-
-    public List<String> letterCombinations(String digits) {
-        if (digits.length() == 0) {
-            return result;
-        }
-        findCombinations(digits, 0, "");
-        return result;
-    }
-
-    private void findCombinations(String digits, int index, String currentStr) {
-        if (index == digits.length()) {
-            result.add(currentStr);
-            return;
-        }
-
-        // 获得 digits 字符串中索引为 index 的字符
-        char c = digits.charAt(index);
-
-        String letters = letterMap[c - '2'];
-
-        // 将该位置的字符串分解为单个字符，每个字符去和之后的字符进行拼接
-        for (int i = 0; i < letters.length(); i++) {
-            findCombinations(digits, index + 1, currentStr + letters.charAt(i));
-        }
-
-    }
-
-}
diff --git a/LeetCode/0018. 4Sum/src/Solution.java b/LeetCode/0018. 4Sum/src/Solution.java
deleted file mode 100644
index 5c189e5..0000000
--- a/LeetCode/0018. 4Sum/src/Solution.java	
+++ /dev/null
@@ -1,63 +0,0 @@
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:21
- * Source: https://leetcode.com/problems/4sum/description/
- */
-
-/*
-排序，然后确定两个数，然后使用对撞指针移动另外两个数
-
-时间复杂度: O(n^3)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    public List<List<Integer>> fourSum(int[] nums, int target) {
-        List<List<Integer>> res = new ArrayList<>();
-        Arrays.sort(nums);
-        for (int i = 0; i < nums.length - 3; i++) {
-            if (i > 0 && nums[i] == nums[i - 1]) {
-                continue;
-            }
-            for (int j = i + 1; j < nums.length - 2; j++) {
-                if (j > i + 1 && nums[j] == nums[j - 1]) {
-                    continue;
-                }
-
-                int left = j + 1;
-                int right = nums.length - 1;
-                while (left < right) {
-                    if (nums[i] + nums[j] + nums[left] + nums[right] < target) {
-                        while (left < right && nums[left] == nums[left + 1]) {
-                            left++;
-                        }
-                        left++;
-                    } else if (nums[i] + nums[j] + nums[left] + nums[right] > target) {
-                        while (left < right && nums[right] == nums[right - 1]) {
-                            right--;
-                        }
-                        right--;
-                    } else {
-                        res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
-                        while (left < right && nums[left] == nums[left + 1]) {
-                            left++;
-                        }
-                        left++;
-                        while (left < right && nums[right] == nums[right - 1]) {
-                            right--;
-                        }
-                        right--;
-                    }
-                }
-            }
-        }
-
-        return res;
-    }
-
-}
-
diff --git a/LeetCode/0020. Valid Parentheses/src/Solution.java b/LeetCode/0020. Valid Parentheses/src/Solution.java
deleted file mode 100644
index 84a9229..0000000
--- a/LeetCode/0020. Valid Parentheses/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-import java.util.Stack;
-
-/**
- * @author: changle
- * @time: 2019-03-03 20:56
- * source: https://leetcode.com/problems/valid-parentheses/
- */
-class Solution {
-
-    public boolean isValid(String s) {
-        Stack<Character> stack = new Stack<>();
-        for (int i = 0; i < s.length(); i++) {
-            char c = s.charAt(i);
-            if ('(' == c || '[' == c || '{' == c) {
-                stack.push(c);
-            } else {
-                if (stack.empty()) {
-                    return false;
-                }
-                Character top = stack.pop();
-                if (')' == c) {
-                    if (top != '(') {
-                        return false;
-                    }
-                } else if (']' == c) {
-                    if ('[' != top) {
-                        return false;
-                    }
-                } else if ('}' == c) {
-                    if ('{' != top) {
-                        return false;
-                    }
-                }
-            }
-        }
-        return stack.isEmpty();
-    }
-}
diff --git a/LeetCode/0021. Merge Two Sorted Lists/src/Solution.java b/LeetCode/0021. Merge Two Sorted Lists/src/Solution.java
deleted file mode 100644
index 6516640..0000000
--- a/LeetCode/0021. Merge Two Sorted Lists/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * @author Changle
- * @date 2019/6/26 9:36
- * source: https://leetcode.com/problems/merge-two-sorted-lists/
- * T(n): O(l1.len + l2.len)
- * S(n): O(l1.len + l2.len)
- */
-
-public class Solution {
-
-    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
-        ListNode dummy = new ListNode(0);
-        ListNode cur = dummy;
-        while (l1 != null && l2 != null) {
-            if (l1.val <= l2.val) {
-                cur.next = l1;
-                l1 = l1.next;
-            } else {
-                cur.next = l2;
-                l2 = l2.next;
-            }
-            cur = cur.next;
-        }
-        while (l1 != null) {
-            cur.next = l1;
-            l1 = l1.next;
-            cur = cur.next;
-        }
-        while (l2 != null) {
-            cur.next = l2;
-            l2 = l2.next;
-            cur = cur.next;
-        }
-
-        return dummy.next;
-
-    }
-}
diff --git a/LeetCode/0026. Remove Duplicates from Sorted Array/src/Solution.java b/LeetCode/0026. Remove Duplicates from Sorted Array/src/Solution.java
deleted file mode 100644
index c300ff2..0000000
--- a/LeetCode/0026. Remove Duplicates from Sorted Array/src/Solution.java	
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * @author Changle
- * @date 2019/6/27 9:46
- * source: https://leetcode.com/problems/remove-duplicates-from-sorted-array/
- * T(n) : O(n)
- * S(n) : O(1)
- * Tag  : Double Pointer
- */
-
-public class Solution {
-
-    public int removeDuplicates(int[] nums) {
-        if (nums.length == 0) {
-            return 0;
-        }
-        int left = 0, right = 0;
-        while (right < nums.length) {
-            if (nums[right] > nums[left]) {
-                nums[++left] = nums[right++];
-            } else {
-                right++;
-            }
-        }
-        return left + 1;
-    }
-}
diff --git a/LeetCode/0027. Remove Element/src/Solution.java b/LeetCode/0027. Remove Element/src/Solution.java
deleted file mode 100644
index 0914010..0000000
--- a/LeetCode/0027. Remove Element/src/Solution.java	
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @author Changle
- * @date 2019/7/3 9:35
- * source: https://leetcode.com/problems/remove-element/
- * T(n)：O(n)
- * S(n)：O(1)
- * Tag ：Double Pointer Swap
- */
-
-public class Solution {
-
-    public int removeElement(int[] nums, int val) {
-
-        if (nums == null) {
-            return 0;
-        }
-        // 待判断的数
-        int left = 0;
-        // 数组尾部确定等于 val 的数的前一位（即最后一位不确定值的数）
-        int right = nums.length - 1;
-
-        // 当 left == right 时，left 为待判断位，right 也为不确定，需要继续判断，所以
-        // while 循环条件中需要包括 left == right
-        while (left <= right) {
-            // nums[left] == val 时，交换 left 和 right 对应的值
-            // 此时 nums[right] 确定等于 val，right左移。但是 nums[left] 不确定，所以 left 不移动。
-            if (nums[left] == val) {
-                swap(left, right, nums);
-                right--;
-            }
-            // 此时 nums[left] 确定不等于 val，left右移，right 不移动。
-            else {
-                left++;
-            }
-
-        }
-        return right + 1;
-    }
-
-    private void swap(int i, int j, int[] arr) {
-        int temp = arr[i];
-        arr[i] = arr[j];
-        arr[j] = temp;
-    }
-}
diff --git a/LeetCode/0035. Search Insert Position/src/Solution.java b/LeetCode/0035. Search Insert Position/src/Solution.java
deleted file mode 100644
index d03bdca..0000000
--- a/LeetCode/0035. Search Insert Position/src/Solution.java	
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * @author: changle
- * @time: 2019-01-14 03:03
- */
-public class Solution {
-
-    public int searchInsert(int[] nums, int target) {
-        return searchInsert(nums, 0, nums.length - 1, target);
-    }
-
-    private int searchInsert(int[] nums, int lo, int hi, int target) {
-        if (lo > hi) {
-            return lo;
-        }
-        int mid = lo + (hi - lo) / 2;
-        if (target == nums[mid]) {
-            return mid;
-        } else if (target < nums[mid]) {
-            return searchInsert(nums, 0, mid - 1, target);
-        } else {
-            return searchInsert(nums, mid + 1, hi, target);
-        }
-    }
-}
diff --git a/LeetCode/0046. Permutations/src/Solution.java b/LeetCode/0046. Permutations/src/Solution.java
deleted file mode 100644
index d5cb554..0000000
--- a/LeetCode/0046. Permutations/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: changle
- * @time: 2019-02-11 10:37:04
- * Source: https://leetcode.com/problems/permutations/
- */
-
-class Solution {
-    
-    private List<List<Integer>> res = new ArrayList<>(); 
-    private boolean[] used;
-    
-    public List<List<Integer>> permute(int[] nums) {
-        used = new boolean[nums.length];
-        for(int i = 0;i < nums.length;i++){
-            used[i] = false;
-        }
-        partition(nums,new ArrayList<Integer>()); 
-        return res;
-    }
-    
-    private void partition(int[] nums,List<Integer> numList){
-        if(numList.size() == nums.length)
-            res.add(new ArrayList(numList));
-        for(int i = 0;i < nums.length;i++){
-          if(!used[i]){
-              numList.add(nums[i]);
-              used[i] = true;                        
-              partition(nums,numList);
-              numList.remove(numList.size() - 1);
-              
-              used[i] = false;
-          }
-        }
-    }
-}
diff --git a/LeetCode/0049. Group Anagrams/src/Solution.java b/LeetCode/0049. Group Anagrams/src/Solution.java
deleted file mode 100644
index afc505f..0000000
--- a/LeetCode/0049. Group Anagrams/src/Solution.java	
+++ /dev/null
@@ -1,42 +0,0 @@
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:30
- * Source: https://leetcode.com/problems/group-anagrams/description/
- */
-
-/*
-需要将同字符异序串组合，最直接的方式是将字符串排序。
-对于每个字符，将它们排序，如果排序后的结果一致，那么加入同一个 List。
-用 Map 来存储所有的 List。
-
-时间复杂度: O(n^2 * logn)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    public List<List<String>> groupAnagrams(String[] strs) {
-        List<List<String>> res = new ArrayList<>();
-
-        Map<String, List<String>> map = new HashMap<>();
-        for (String str : strs) {
-            char[] carr = str.toCharArray();
-            Arrays.sort(carr);
-            String s = String.valueOf(carr);
-            if (map.containsKey(s)) {
-                map.get(s).add(str);
-            } else {
-                map.put(s, new ArrayList<>());
-                map.get(s).add(str);
-            }
-        }
-
-        res.addAll(map.values());
-        return res;
-    }
-}
diff --git a/LeetCode/0062. Unique Paths/src/Solution.java b/LeetCode/0062. Unique Paths/src/Solution.java
deleted file mode 100644
index 31f2abe..0000000
--- a/LeetCode/0062. Unique Paths/src/Solution.java	
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * @author Changle
- * @date 2018/10/25 18:20
- */
-
-public class Solution {
-    public int uniquePaths(int m, int n) {
-        int[][] res = new int[n][m];
-        res[n - 1][m - 1] = 0;
-        for(int i = m - 1;i >= 0;i--){
-            for(int j = n - 1;j >= 0;j--){
-                if(i == m - 1){
-                    res[j][i] = 1;
-                    continue;
-                }
-                if(j == n - 1){
-                    res[j][i] = 1;
-                    continue;
-                }
-                res[j][i] = res[j + 1][i]+res[j][i+1];
-            }
-        }
-        return res[0][0];
-    }
-}
diff --git a/LeetCode/0063. Unique Paths II/src/Solution.java b/LeetCode/0063. Unique Paths II/src/Solution.java
deleted file mode 100644
index 560af21..0000000
--- a/LeetCode/0063. Unique Paths II/src/Solution.java	
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @author Changle
- * @date 2018/10/26 19:54
- */
-
-public class Solution {
-    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
-
-        int n = obstacleGrid.length;
-        if(obstacleGrid.length == 0){
-            return 1;
-        }
-
-        int m = obstacleGrid[0].length;
-
-        int[][] res = new int[n][m];
-
-        for(int i = n - 1;i >= 0;i--){
-            for(int j = m - 1;j >= 0;j--){
-                if( i == n - 1 && j == m - 1){
-                    res[i][j] = (obstacleGrid[i][j] == 0) ? 1 : 0 ;
-                    continue;
-                }
-                if( obstacleGrid[i][j] == 1){
-                    res[i][j] = 0;
-                    continue;
-                }
-                if(i == n - 1){
-                    res[i][j] = res[i][j + 1];
-                    continue;
-                }
-                if(j == m - 1){
-                    res[i][j] = res[i + 1][j];
-                    continue;
-                }
-                res[i][j] = res[i + 1][j] + res[i][j + 1];
-            }
-        }
-
-        return res[0][0];
-    }
-}
diff --git a/LeetCode/0064. Minimum Path Sum/src/Solution.java b/LeetCode/0064. Minimum Path Sum/src/Solution.java
deleted file mode 100644
index ec6ca83..0000000
--- a/LeetCode/0064. Minimum Path Sum/src/Solution.java	
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * @author Changle
- * @date 2018/10/23 19:30
- */
-
-public class Solution {
-
-    public int minPathSum(int[][] grid) {
-        int m = grid[0].length;
-        int n = grid.length;
-        for (int i = 1; i < m; i++) {
-            grid[0][i] = grid[0][i - 1] + grid[0][i];
-        }
-        for (int j = 1; j < n; j++) {
-            grid[j][0] = grid[j - 1][0] + grid[j][0];
-        }
-
-        for (int x = 1; x < m; x++) {
-            for (int y = 1; y < n; y++) {
-                grid[y][x] = grid[y][x] + Math.min(grid[y - 1][x], grid[y][x - 1]);
-            }
-        }
-
-        return grid[n - 1][m - 1];
-    }
-}
diff --git a/LeetCode/0070. Climbing Stairs/src/Solution.java b/LeetCode/0070. Climbing Stairs/src/Solution.java
deleted file mode 100644
index 37f0e3f..0000000
--- a/LeetCode/0070. Climbing Stairs/src/Solution.java	
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @author Changle
- * @date 2018/10/23 16:33
- */
-
-public class Solution {
-    public int climbStairs(int n) {
-        if(n == 1 || n == 2){
-            return n;
-        }
-
-        int[] arr = new int[n + 1];
-
-        arr[1] = 1;
-        arr[2] = 2;
-
-        for(int i = 3;i < arr.length;i++){
-            arr[i] = arr[i - 1] + arr[i - 2];
-        }
-
-        return arr[n];
-    }
-}
diff --git a/LeetCode/0075. Sort Colors/src/Solution.java b/LeetCode/0075. Sort Colors/src/Solution.java
deleted file mode 100644
index 08f3f36..0000000
--- a/LeetCode/0075. Sort Colors/src/Solution.java	
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-08 15:40
- * Source: https://leetcode.com/problems/sort-colors/description/
- */
-
-/*
-三路快排
-
-时间复杂度O(n)
-空间复杂度O(1)
- */
-public class Solution {
-    public void sortColors(int[] nums) {
-        int i=0,l = 0,r = nums.length - 1;
-        while(i <= r){
-            if(nums[i] < 1){
-                exch(nums,i,l);
-                i++;
-                l++;
-            }else if(nums[i] == 1)
-                i++;
-            else {
-                exch(nums,i,r);
-                r--;
-            }
-        }
-    }
-
-    private void exch(int[] arr,int x,int y){
-        int temp = arr[x];
-        arr[x] = arr[y];
-        arr[y] = temp;
-    }
-}
-
-/*
-整个数组中只有3种取值，可以直接统计每种取值的数量，再按顺序赋值。计数排序的思想。
-
-时间复杂度：O(n)
-空间复杂度：O(1)
- */
-class Solution1 {
-    public void sortColors(int[] nums) {
-        int count0 = 0,count1 = 0,count2 = 0;
-        for(int i = 0;i < nums.length;i++){
-            if(nums[i] == 0){
-                count0++;
-            }else if(nums[i] == 1){
-                count1++;
-            }else
-                count2++;
-        }
-
-        for(int i = 0;i < nums.length;i++){
-            if(i < count0)
-                nums[i] = 0;
-            if(i >= count0 && i < nums.length - count2){
-                nums[i] = 1;
-            }
-            if(i >= nums.length - count2){
-                nums[i] = 2;
-            }
-        }
-    }
-}
diff --git a/LeetCode/0076. Minimum Window Substring/src/Solution.java b/LeetCode/0076. Minimum Window Substring/src/Solution.java
deleted file mode 100644
index d52e4d8..0000000
--- a/LeetCode/0076. Minimum Window Substring/src/Solution.java	
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-27 19:38
- * Source: https://leetcode.com/problems/minimum-window-substring/description/
- */
-
-/*
-使用滑动指针。
-j指针向右移动，当 count == 0 时表示所有 t 中的字符已经出现过一次。
-此时滑动 i 指针。直到 i 指针移动到一个该在 t 中出现的字符为止。
-
-时间复杂度：O(len(s) + len(t))
-空间复杂度：O(1)
- */
-public class Solution {
-
-    public static String minWindow(String s, String t) {
-        int[] ch = new int[256];
-        for (char c : t.toCharArray()) {
-            ch[c]++;
-        }
-
-        int i = 0, j = 0;
-        int count = t.length();
-        int min = s.length() + 1;
-        int start = 0;
-        while (j < s.length()) {
-            if (ch[s.charAt(j++)]-- > 0) {
-                count--;
-            }
-
-            while (count == 0) {
-                if (j - i < min) {
-                    min = j - i;
-                    start = i;
-                }
-
-                if (ch[s.charAt(i++)]++ >= 0) {
-                    count ++;
-                }
-            }
-        }
-
-        return min == s.length() + 1 ? "" : s.substring(start, min + start);
-    }
-}
diff --git a/LeetCode/0080. Remove Duplicates from Sorted Array II/src/Solution.java b/LeetCode/0080. Remove Duplicates from Sorted Array II/src/Solution.java
deleted file mode 100644
index e1c674b..0000000
--- a/LeetCode/0080. Remove Duplicates from Sorted Array II/src/Solution.java	
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-08 10:34
- * Source: https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/description/
- */
-
-/*
-这个题目没有空间的限制。允许每个元素出现两次。与 26 题不同。
-但是考虑到都是保留元素。可以采用与26题相同的策略。
-区别在于，这个数组允许保留两个相同元素。所以我们需要设置一个计数器来统计一个元素出现的次数。
-依旧用 i 来指向确定值的最后一个元素的位置。
-当出现一个新元素的时候，这个新元素的值会被放到第 ++i 位。count 置 0；
-当这个元素出现的次数等于 1 时，即这个元素出现了第二次，是合理的，所以继续将这个元素放置到 ++i 位置上。
-如果元素继续出现。只移动 j 指针。
- */
-public class Solution {
-
-    public int removeDuplicates(int[] nums) {
-        int i = 0, count = 0;
-        for (int j = 1; j < nums.length; j++) {
-            if (nums[j] == nums[j - 1]) {
-                count++;
-                if (count == 1) {
-                    nums[++i] = nums[j];
-                }
-            } else {
-                nums[++i] = nums[j];
-                count = 0;
-            }
-
-        }
-
-        return i + 1;
-    }
-}
diff --git a/LeetCode/0088. Merge Sorted Array/src/Solution.java b/LeetCode/0088. Merge Sorted Array/src/Solution.java
deleted file mode 100644
index fe902cf..0000000
--- a/LeetCode/0088. Merge Sorted Array/src/Solution.java	
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-09 11:47
- * Source: https://leetcode.com/problems/merge-sorted-array/description/
- */
-
-/*
-由于题目中说明 nums1 的长度为 m+n，可以容纳两个数组的所有元素。
-所以可以考虑从 nums1 的数组尾部开始填充大数。
-
-时间复杂度：O(n)
-空间复杂度：O(1)
- */
-public class Solution {
-
-    public void merge(int[] nums1, int m, int[] nums2, int n) {
-        int i = m - 1;
-        int j = n - 1;
-        int k = m + n - 1;
-        while (k >= 0) {
-            if (i < 0) {
-                nums1[k--] = nums2[j--];
-                continue;
-            }
-            if (j < 0) {
-                break;
-            }
-            if (nums1[i] > nums2[j]) {
-                nums1[k--] = nums1[i--];
-            } else {
-                nums1[k--] = nums2[j--];
-            }
-        }
-    }
-}
-
-/*
-很容易想到归并，所以使用一个额外数组存放。
-
-时间复杂度：O(n)
-空间复杂度：O(n)
- */
-class Solution1 {
-
-    public void merge(int[] nums1, int m, int[] nums2, int n) {
-        int[] res = new int[m + n];
-        int i = 0;
-        int j = 0;
-        for (int k = 0; k < res.length; k++) {
-            if (i >= m) {
-                res[k] = nums2[j++];
-            } else if (j >= n) {
-                res[k] = nums1[i++];
-            } else {
-                if (nums1[i] <= nums2[j]) {
-                    res[k] = nums1[i++];
-                } else {
-                    res[k] = nums2[j++];
-                }
-            }
-        }
-
-        for (int k = 0; k < m + n; k++) {
-            nums1[k] = res[k];
-        }
-    }
-}
diff --git a/LeetCode/0093. Restore IP Addresses/src/Solution.java b/LeetCode/0093. Restore IP Addresses/src/Solution.java
deleted file mode 100644
index fb86a43..0000000
--- a/LeetCode/0093. Restore IP Addresses/src/Solution.java	
+++ /dev/null
@@ -1,62 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: changle
- * @time: 2019-01-26 07:15
- * Source: https://leetcode.com/problems/restore-ip-addresses/
- */
-
-public class Solution {
-    private List<String> res = new ArrayList<>();
-    public List<String> restoreIpAddresses(String s) {
-        if(s.length() < 4){
-            return res;
-        }
-        piecewise(s,"",0,3);
-        return res;
-
-    }
-
-    private void piecewise(String s,String curStr,int index, int time){
-        // 如果剩下的位数比 分解次数 * 3 还多，说明该分解方式不行
-        if(s.length() - index > (time + 1) * 3) {
-            return;
-        }
-
-        if(index >= s.length()) {
-            return;
-        }
-
-        String nextSeg;
-
-        if(time == 0 ){
-            nextSeg = s.substring(index);
-            if(nextSeg.length() == 1 || (Integer.parseInt(nextSeg) <= 255 & !nextSeg.startsWith("0"))) {
-                res.add(curStr + nextSeg);
-            }
-            return;
-        }
-
-        // 将一个字符分为一段
-        piecewise(s,curStr + s.substring(index,index+1) + ".",index + 1,time - 1);
-
-        // 将两个字符分为一段
-        if(index + 2 <= s.length()){
-            nextSeg = s.substring(index,index + 2);
-            if(!nextSeg.startsWith("0")) {
-                piecewise(s,curStr + nextSeg + ".",index + 2,time - 1);
-            }
-        }
-
-
-        // 将三个字符分为一段
-        if(index + 3 <= s.length()){
-            nextSeg = s.substring(index,index + 3);
-            if(Integer.parseInt(nextSeg) <= 255 && !nextSeg.startsWith("0")) {
-                piecewise(s,curStr + nextSeg + ".",index + 3,time - 1);
-            }
-        }
-    }
-
-}
diff --git a/LeetCode/0093. Restore IP Addresses/src/Solution2.java b/LeetCode/0093. Restore IP Addresses/src/Solution2.java
deleted file mode 100644
index 23a58c6..0000000
--- a/LeetCode/0093. Restore IP Addresses/src/Solution2.java	
+++ /dev/null
@@ -1,51 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: changle
- * @time: 2019-01-26 14:21
- */
-public class Solution2 {
-
-    private List<String> res = new ArrayList<>();
-
-    public List<String> restoreIpAddresses(String s) {
-        if (s.length() < 4) {
-            return res;
-        }
-        breakDownAddress(s,0,"",4);
-        return res;
-    }
-
-    /**
-     * 地址分段
-     *
-     * @param originalStr 原始的要被分段的字符串
-     * @param index 当前未被分段的字符串的索引起始位置
-     * @param time 分段次数
-     * @param currentStr 已被分段的字符串得到的结果
-     */
-    private void breakDownAddress(String originalStr, int index, String currentStr, int time) {
-        if (time == 0 && index == originalStr.length()) {
-            res.add(currentStr);
-            return;
-        }
-        if(time <= 0){
-            return;
-        }
-        // 将接下来的 i 个字符纳入分段结果中
-        for (int i = 1; i < 4; i++) {
-            if(index + i > originalStr.length()) break;
-            String nextSeg = originalStr.substring(index, index + i);
-            boolean isGreaterThan255 = nextSeg.length() == 3 && Integer.parseInt(nextSeg) > 255;
-            boolean isStartsWithZero = nextSeg.length() > 1 && nextSeg.startsWith("0");
-            if (isStartsWithZero || isGreaterThan255) {
-                continue;
-            }
-            breakDownAddress(originalStr, index + i, currentStr + nextSeg + ((time > 1) ? "." : ""),
-                    time-1);
-
-        }
-    }
-
-}
diff --git a/LeetCode/0120. Triangle/src/Solution.java b/LeetCode/0120. Triangle/src/Solution.java
deleted file mode 100644
index e1dfb4b..0000000
--- a/LeetCode/0120. Triangle/src/Solution.java	
+++ /dev/null
@@ -1,35 +0,0 @@
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Changle
- * @date 2018/10/23 17:49
- */
-
-public class Solution {
-    public int minimumTotal(List<List<Integer>> triangle) {
-        int n = triangle.size();
-
-        /**
-         * 将每个位置的值更新为到该位置的最小和
-         */
-        for(int i = 1;i < n;i++){
-            List<Integer> list = triangle.get(i);
-            List<Integer> preList = triangle.get(i - 1);
-            for(int j = 0;j <= i;j++){
-                int val;
-                if(j == 0){
-                    val =  list.get(0) + preList.get(0);
-                }else if(j == i){
-                    val = list.get(j) + preList.get(i - 1);
-                }else{
-                    val = list.get(j) + Math.min(preList.get(j - 1),preList.get(j));
-                }
-                list.set(j,val);
-            }
-        }
-
-        return Collections.min(triangle.get(n - 1));
-
-    }
-}
diff --git a/LeetCode/0125. Valid Palindrome/src/Solution.java b/LeetCode/0125. Valid Palindrome/src/Solution.java
deleted file mode 100644
index b41bf9f..0000000
--- a/LeetCode/0125. Valid Palindrome/src/Solution.java	
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-14 16:10
- * Source: https://leetcode.com/problems/valid-palindrome/description/
- */
-
-/*
-对撞指针判断对称的两个字符，如果是特殊符号则继续移动。
-
-依次判断。当 两个指针相遇时，说明这个字符串是回文串。
- */
-public class Solution {
-
-    public boolean isPalindrome(String s) {
-        if (s.length() == 0) {
-            return true;
-        }
-        int i = 0, j = s.length() - 1;
-        while (i <= j) {
-            char chari = s.charAt(i);
-            char charj = s.charAt(j);
-            if (!Character.isLetterOrDigit(chari)) {
-                i++;
-                continue;
-            }
-            if (!Character.isLetterOrDigit(charj)) {
-                j--;
-                continue;
-            }
-            if (Character.toUpperCase(chari) != Character.toUpperCase(charj)) {
-                return false;
-            } else {
-                i++;
-                j--;
-            }
-        }
-        return true;
-    }
-}
diff --git a/LeetCode/0131. Palindrome Partitioning/src/Solution.java b/LeetCode/0131. Palindrome Partitioning/src/Solution.java
deleted file mode 100644
index baaf609..0000000
--- a/LeetCode/0131. Palindrome Partitioning/src/Solution.java	
+++ /dev/null
@@ -1,46 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: changle
- * @time: 2019-01-27 09:53
- * Source: https://leetcode.com/problems/palindrome-partitioning/
- */
-public class Solution {
-
-    private List<List<String>> res = new ArrayList();
-
-    public List<List<String>> partition(String s) {
-        partition(s, new ArrayList<String>(), 0);
-        return res;
-    }
-
-    private void partition(String originStr, List<String> list, int index) {
-        if (index == originStr.length()) {
-            res.add(new ArrayList<>(list));
-        }
-
-        for (int i = index + 1; i <= originStr.length(); i++) {
-            if (isPalindromeStr(originStr, index, i - 1)) {
-                list.add(originStr.substring(index, i));
-                partition(originStr, list, i);
-                list.remove(list.size() - 1);
-            }
-        }
-    }
-
-    /**
-     * 判断是否是回文串
-     */
-    private boolean isPalindromeStr(String s, int start, int end) {
-        while (start < end) {
-            if (s.charAt(start) != (s.charAt(end))) {
-                return false;
-            }
-            start++;
-            end--;
-
-        }
-        return true;
-    }
-}
diff --git a/LeetCode/0149. Max Points on a Line/src/Solution.java b/LeetCode/0149. Max Points on a Line/src/Solution.java
deleted file mode 100644
index 2b407af..0000000
--- a/LeetCode/0149. Max Points on a Line/src/Solution.java	
+++ /dev/null
@@ -1,91 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:36
- * Source: https://leetcode.com/problems/max-points-on-a-line/description/
- */
-
-/*
-同一条线上的任意两点的斜率相同。
-将斜率相同的两个点放在一起。这个题目考虑到浮点数的精度问题，不能只把斜率作为 Map 的key来存储。
-所以我们使用一个嵌套 Map ，以便于存放点的坐标以及斜率的次数。
-
-时间复杂度: O(n^2)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    public int maxPoints(Point[] points) {
-        if (points == null) {
-            return 0;
-        }
-        if (points.length <= 2) {
-            return points.length;
-        }
-
-        Map<Integer, Map<Integer, Integer>> map = new HashMap<Integer, Map<Integer, Integer>>();
-        int result = 0;
-        for (int i = 0; i < points.length; i++) {
-            map.clear();
-            int overlap = 0, max = 0;
-            for (int j = i + 1; j < points.length; j++) {
-                int x = points[j].x - points[i].x;
-                int y = points[j].y - points[i].y;
-                if (x == 0 && y == 0) {
-                    overlap++;
-                    continue;
-                }
-                int gcd = generateGCD(x, y);
-                if (gcd != 0) {
-                    x /= gcd;
-                    y /= gcd;
-                }
-
-                if (map.containsKey(x)) {
-                    if (map.get(x).containsKey(y)) {
-                        map.get(x).put(y, map.get(x).get(y) + 1);
-                    } else {
-                        map.get(x).put(y, 1);
-                    }
-                } else {
-                    Map<Integer, Integer> m = new HashMap<Integer, Integer>();
-                    m.put(y, 1);
-                    map.put(x, m);
-                }
-                max = Math.max(max, map.get(x).get(y));
-            }
-            result = Math.max(result, max + overlap + 1);
-        }
-        return result;
-
-
-    }
-
-    private int generateGCD(int a, int b) {
-
-        if (b == 0) {
-            return a;
-        } else {
-            return generateGCD(b, a % b);
-        }
-
-    }
-}
-
-class Point {
-
-    int x;
-    int y;
-
-    Point() {
-        x = 0;
-        y = 0;
-    }
-
-    Point(int a, int b) {
-        x = a;
-        y = b;
-    }
-}
diff --git a/LeetCode/0167. Two Sum II - Input array is sorted/src/Solution.java b/LeetCode/0167. Two Sum II - Input array is sorted/src/Solution.java
deleted file mode 100644
index 6101968..0000000
--- a/LeetCode/0167. Two Sum II - Input array is sorted/src/Solution.java	
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-13 23:55
- * Source: https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/
- */
-
-/*
-由于数组有序，使用对撞指针。
-当两个指针处的数字之和大于 target ，则 j 向左移动。
-反之 i 向右移动。
-
-时间复杂度：O(n)
-空间复杂度: O(1)
- */
-public class Solution {
-    public int[] twoSum(int[] numbers, int target) {
-        int i = 0,j = numbers.length - 1;
-        int[] res = new int[2];
-        while(i < j){
-            if(numbers[i] + numbers[j] == target){
-                res[0] = i + 1;
-                res[1] = j + 1;
-                break;
-            }else if(numbers[i] + numbers[j] < target)
-                i++;
-            else
-                j--;
-
-        }
-        return res;
-    }
-}
diff --git a/LeetCode/0198. House Robber/src/Solution.java b/LeetCode/0198. House Robber/src/Solution.java
deleted file mode 100644
index 546a3d2..0000000
--- a/LeetCode/0198. House Robber/src/Solution.java	
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @author Changle
- * @date 2018/10/30 11:52
- * resource: https://leetcode.com/problems/house-robber/
- */
-
-public class Solution {
-
-    public int rob(int[] nums) {
-        if (nums.length == 0) {
-            return 0;
-        }
-        int n = nums.length;
-        int[] memo = new int[n];
-        memo[n - 1] = nums[n - 1];
-        for (int i = n - 2; i >= 0; i--) {
-            memo[i] = Math.max(memo[i + 1], nums[i] + (i + 2 < n ? memo[i + 2] : 0));
-        }
-        return memo[0];
-    }
-}
diff --git a/LeetCode/0198. House Robber/src/Solution2.java b/LeetCode/0198. House Robber/src/Solution2.java
deleted file mode 100644
index ebc491a..0000000
--- a/LeetCode/0198. House Robber/src/Solution2.java	
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @author: changle
- * @time: 2019/9/26 03:06
- * resource: https://leetcode.com/problems/house-robber/
- */
-public class Solution2 {
-    public int rob(int[] nums) {
-        if(nums.length == 0){
-            return 0;
-        };
-
-        int[] dp = new int[nums.length];
-        dp[0] = nums[0];
-        for(int i = 1;i < nums.length;i++){
-            dp[i] = Math.max(dp[i - 1],(i - 2 < 0 ? nums[i] : (dp[i - 2] + nums[i])));
-        }
-        return dp[nums.length - 1];
-    }
-}
diff --git a/LeetCode/0202. Happy Number/src/Solution.java b/LeetCode/0202. Happy Number/src/Solution.java
deleted file mode 100644
index 5459ad1..0000000
--- a/LeetCode/0202. Happy Number/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:41
- * Source: https://leetcode.com/problems/happy-number/description/
- */
-
-/*
-通过模运算与除法得出一个数的每一位，然后求他们的平方的和。
-用集合存储每一次的值，当出现一样的值时，说明出现循环，返回 false。
-
-时间复杂度: O(?)
-空间复杂度: O(?)
- */
-public class Solution {
-    public boolean isHappy(int n) {
-        Set<Integer> set = new HashSet<>();
-
-        int squareSum,remain;
-        while(set.add(n)){
-            squareSum = 0;
-            while(n > 0){
-                remain = n % 10;
-                squareSum += remain * remain;
-                n = n / 10;
-            }
-
-            if(squareSum == 1)
-                return true;
-            else
-                n = squareSum;
-
-        }
-        return false;
-    }
-}
diff --git a/LeetCode/0203. Remove Linked List Elements/src/Solution.java b/LeetCode/0203. Remove Linked List Elements/src/Solution.java
deleted file mode 100644
index b403bad..0000000
--- a/LeetCode/0203. Remove Linked List Elements/src/Solution.java	
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/5 14:27
- * source: https://leetcode.com/problems/remove-linked-list-elements/
- */
-
-public class Solution {
-
-    public ListNode removeElements(ListNode head, int val) {
-        ListNode dummyHead = new ListNode(0);
-        dummyHead.next = head;
-        ListNode pre = dummyHead;
-        while (pre.next != null) {
-            if (pre.next.val == val) {
-                pre.next = pre.next.next;
-            } else {
-                pre = pre.next;
-            }
-        }
-        return dummyHead.next;
-    }
-}
diff --git a/LeetCode/0205. Isomorphic Strings/src/Solution.java b/LeetCode/0205. Isomorphic Strings/src/Solution.java
deleted file mode 100644
index 456f374..0000000
--- a/LeetCode/0205. Isomorphic Strings/src/Solution.java	
+++ /dev/null
@@ -1,28 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:46
- * Source: https://leetcode.com/problems/isomorphic-strings/description/
- */
-
-/*
-判断是不是同样结构的字符串。通过映射来判断。
-关于 put 方法：如果 map 中之前存在该 key，就会返回之前的 value。
-这样可以一直保证两个字符串的映射一一匹配。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean isIsomorphic(String s, String t) {
-        if (s.length() != t.length())
-            return false;
-        Map index = new HashMap();
-        for (int i=0; i<s.length(); ++i)
-            if (index.put(s.charAt(i), i) != index.put(t.charAt(i), i))
-                return false;
-        return true;
-    }
-}
diff --git a/LeetCode/0208. Implement Trie (Prefix Tree)/src/Trie.java b/LeetCode/0208. Implement Trie (Prefix Tree)/src/Trie.java
deleted file mode 100644
index 8988e80..0000000
--- a/LeetCode/0208. Implement Trie (Prefix Tree)/src/Trie.java	
+++ /dev/null
@@ -1,84 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Changle
- * @date 2019/3/12 15:21
- * source: https://leetcode.com/problems/implement-trie-prefix-tree/
- */
-
-class Trie {
-
-    private Node root;
-
-    class Node {
-
-        public boolean isWord;
-        public Map<Character, Node> next;
-
-        public Node() {
-            this(false);
-        }
-
-        public Node(boolean isWord) {
-            this.isWord = isWord;
-            next = new HashMap<>();
-        }
-    }
-
-    /** Initialize your data structure here. */
-    public Trie() {
-        root = new Node();
-    }
-
-    /** Inserts a word into the trie. */
-    public void insert(String word) {
-        Node cur = root;
-        for (int i = 0; i < word.length(); i++) {
-            char c = word.charAt(i);
-            if (cur.next.get(c) == null) {
-                cur.next.put(c, new Node());
-            }
-            cur = cur.next.get(c);
-        }
-
-        if (!cur.isWord) {
-            cur.isWord = true;
-        }
-    }
-
-    /** Returns if the word is in the trie. */
-    public boolean search(String word) {
-        Node cur = root;
-        for (int i = 0; i < word.length(); i++) {
-            char c = word.charAt(i);
-            if (cur.next.get(c) == null) {
-                return false;
-            }
-            cur = cur.next.get(c);
-        }
-
-        return cur.isWord;
-    }
-
-    /** Returns if there is any word in the trie that starts with the given prefix. */
-    public boolean startsWith(String prefix) {
-        Node cur = root;
-        for (int i = 0; i < prefix.length(); i++) {
-            char c = prefix.charAt(i);
-            if (cur.next.get(c) == null) {
-                return false;
-            }
-            cur = cur.next.get(c);
-        }
-        return true;
-    }
-}
-
-/**
- * Your Trie object will be instantiated and called as such:
- * Trie obj = new Trie();
- * obj.insert(word);
- * boolean param_2 = obj.search(word);
- * boolean param_3 = obj.startsWith(prefix);
- */
diff --git a/LeetCode/0209. Minimum Size Subarray Sum/src/Solution.java b/LeetCode/0209. Minimum Size Subarray Sum/src/Solution.java
deleted file mode 100644
index 6481f83..0000000
--- a/LeetCode/0209. Minimum Size Subarray Sum/src/Solution.java	
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-21 09:00
- * Source: https://leetcode.com/problems/minimum-size-subarray-sum/description/
- */
-
-/*
-使用滑动窗口，不断改变窗口的范围，来计算范围内的值。
-
-时间复杂度: O(n)
-空间复杂度: O(1)
- */
-public class Solution {
-    public int minSubArrayLen(int s, int[] nums) {
-        int i = 0;int j = -1;
-        int sum = 0;
-        int res = nums.length + 1;
-        while(i < nums.length){
-            if(j + 1 < nums.length && sum < s){
-                sum = sum + nums[++j];
-            }else{
-                sum = sum - nums[i++];
-            }
-
-            if (sum >= s) {
-                res = Math.max(res, j - i + 1);
-            }
-        }
-        if (res == nums.length + 1) {
-            return 0;
-        }
-        return res;
-    }
-}
diff --git a/LeetCode/0211. Add and Search Word - Data structure design/src/WordDictionary.java b/LeetCode/0211. Add and Search Word - Data structure design/src/WordDictionary.java
deleted file mode 100644
index ec63040..0000000
--- a/LeetCode/0211. Add and Search Word - Data structure design/src/WordDictionary.java	
+++ /dev/null
@@ -1,88 +0,0 @@
-import java.util.Map;
-
-/**
- * @author Changle
- * @date 2019/3/12 16:08
- * source: https://leetcode.com/problems/add-and-search-word-data-structure-design/
- */
-
-class WordDictionary {
-
-    private Node root;
-
-    class Node {
-
-        public boolean isWord;
-        public Map<Character, Node> next;
-
-        public Node() {
-            this(false);
-        }
-
-        public Node(boolean isWord) {
-            this.isWord = isWord;
-            next = new HashMap<>();
-        }
-    }
-
-    /**
-     * Initialize your data structure here.
-     */
-    public WordDictionary() {
-        root = new Node();
-    }
-
-    /**
-     * Adds a word into the data structure.
-     */
-    public void addWord(String word) {
-        Node cur = root;
-        for (int i = 0; i < word.length(); i++) {
-            char c = word.charAt(i);
-            if (cur.next.get(c) == null) {
-                cur.next.put(c, new Node());
-            }
-            cur = cur.next.get(c);
-        }
-
-        if (!cur.isWord) {
-            cur.isWord = true;
-        }
-    }
-
-    /**
-     * Returns if the word is in the data structure. A word could contain the dot character '.' to
-     * represent any one letter.
-     */
-    public boolean search(String word) {
-        return match(root, word, 0);
-    }
-
-    private boolean match(Node node, String word, int index) {
-        if (index == word.length()) {
-            return node.isWord;
-        }
-
-        char c = word.charAt(index);
-        if (c == '.') {
-            for (char nextChar : node.next.keySet()) {
-                if (match(node.next.get(nextChar), word, index + 1)) {
-                    return true;
-                }
-            }
-            return false;
-        } else {
-            if (node.next.get(c) == null) {
-                return false;
-            }
-            return match(node.next.get(c), word, index + 1);
-        }
-    }
-}
-
-/**
- * Your WordDictionary object will be instantiated and called as such:
- * WordDictionary obj = new WordDictionary();
- * obj.addWord(word);
- * boolean param_2 = obj.search(word);
- */
diff --git a/LeetCode/0213. House Robber II/src/Solution.java b/LeetCode/0213. House Robber II/src/Solution.java
deleted file mode 100644
index 580aae1..0000000
--- a/LeetCode/0213. House Robber II/src/Solution.java	
+++ /dev/null
@@ -1,35 +0,0 @@
-import java.util.Arrays;
-
-/**
- * @author Changle
- * @date 2018/10/30 15:13
- */
-
-public class Solution {
-    public int rob(int[] nums) {
-        int n = nums.length;
-        if(n == 0){
-            return 0;
-        }
-        if(n == 1){
-            return nums[0];
-        }
-        int[] memo = new int[n];
-        // 在抢劫 nums[n - 1] 的情况下
-        memo[0] = nums[0];
-        for(int i = 1;i < n - 1;i++){
-            memo[i] = Math.max(memo[i - 1],nums[i] + (i >= 2 ? memo[i - 2] : 0));
-        }
-        int max1 = memo[n - 2];
-
-        // 清空数组
-        Arrays.fill(memo,0);
-        // 在不抢劫 nums[0] 的情况下
-        memo[n - 1] = nums[n - 1];
-        for(int j = n - 2;j > 0;j-- ){
-            memo[j] = Math.max(memo[j + 1],nums[j] + (j + 2 < n ? memo[j + 2] : 0));
-        }
-        int max2 = memo[1];
-        return Math.max(max1,max2);
-    }
-}
diff --git a/LeetCode/0215. Kth Largest Element in an Array/src/Solution.java b/LeetCode/0215. Kth Largest Element in an Array/src/Solution.java
deleted file mode 100644
index 493370a..0000000
--- a/LeetCode/0215. Kth Largest Element in an Array/src/Solution.java	
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-12 21:38
- */
-
-/*
-使用 partition 思想。
-用元素 q 去划分数组。左边的数大于 q，右边则小于 q。
-然后返回 q 的索引值。 q + 1即代表 q 是数组中的第几大的数。
-如果 k 比 q + 1 大。那就从小于 q 的元素中去找。反之则从大于 q 的元素中找。
-
-时间复杂度：O(n)
-空间复杂度：O(1)
- */
-public class Solution {
-
-    public int findKthLargest(int[] nums, int k) {
-        return findKthLargest(nums, k, 0, nums.length - 1);
-    }
-
-    public int findKthLargest(int[] nums, int k, int l, int r) {
-        int q = partition(l, r, nums);
-        if (k == q + 1) {
-            return nums[q];
-        } else if (k > q + 1) {
-            return findKthLargest(nums, k, q + 1, r);
-        } else {
-            return findKthLargest(nums, k, l, q - 1);
-        }
-    }
-
-    private int partition(int l, int r, int[] a) {
-        int i = l + 1, j = r;
-        while (i <= j) {
-            if (a[i] >= a[l]) {
-                i++;
-            } else {
-                exch(a, i, j--);
-            }
-        }
-        exch(a, --i, l);
-        return i;
-    }
-
-    private void exch(int[] a, int x, int y) {
-        int temp = a[x];
-        a[x] = a[y];
-        a[y] = temp;
-    }
-}
diff --git a/LeetCode/0217. Contains Duplicate/src/Solution.java b/LeetCode/0217. Contains Duplicate/src/Solution.java
deleted file mode 100644
index 255da8b..0000000
--- a/LeetCode/0217. Contains Duplicate/src/Solution.java	
+++ /dev/null
@@ -1,28 +0,0 @@
-import java.util.HashSet;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:51
- * Source: https://leetcode.com/problems/contains-duplicate/description/
- */
-
-/*
-遍历数组，将元素加入到集合中。有重复则返回 true。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean containsDuplicate(int[] nums) {
-        if (nums == null) {
-            return false;
-        }
-        HashSet hashSet = new HashSet();
-        for (int val : nums) {
-            if (!hashSet.add(val)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/LeetCode/0219. Contains Duplicate II/src/Solution.java b/LeetCode/0219. Contains Duplicate II/src/Solution.java
deleted file mode 100644
index 4d2f3bc..0000000
--- a/LeetCode/0219. Contains Duplicate II/src/Solution.java	
+++ /dev/null
@@ -1,29 +0,0 @@
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * User: Changle
- * Date: 2018-03-11 10:54
- * Source: https://leetcode.com/problems/contains-duplicate-ii/description/
- */
-
-/*
-遍历数组，将元素放入集合中，保持集合中的元素个数不超过 k + 1个。
-判断最新加入来的元素是否在 set 中出现过。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean containsNearbyDuplicate(int[] nums, int k) {
-        Set<Integer> set = new HashSet<>();
-        for(int i = 0;i < nums.length;i++){
-            if(!set.add(nums[i]))
-                return true;
-
-            if(set.size() == k + 1)
-                set.remove(nums[i - k]);
-        }
-        return false;
-    }
-}
diff --git a/LeetCode/0220. Contains Duplicate III/src/Solution.java b/LeetCode/0220. Contains Duplicate III/src/Solution.java
deleted file mode 100644
index 87a17f8..0000000
--- a/LeetCode/0220. Contains Duplicate III/src/Solution.java	
+++ /dev/null
@@ -1,33 +0,0 @@
-import java.util.TreeSet;
-
-/**
- * User: Changle
- * Date: 2018-03-11 11:26
- * Source: https://leetcode.com/problems/contains-duplicate-iii/description/
- */
-
-/*
-找范围内的数，可以通过 treeset 的有序性。使用 ceilling 函数来判断是否存在范围内的值
-
-时间复杂度: O(nlogn)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
-        TreeSet<Long> set = new TreeSet<>();
-        for (int i = 0; i < nums.length; i++) {
-            if (set.ceiling((long)nums[i] - t) !=null && set.ceiling((long)nums[i] - t) <= (long)nums[i] + t) {
-                return true;
-            }
-
-            set.add((long)nums[i]);
-
-            if (set.size() == k + 1) {
-                set.remove((long)nums[i - k]);
-            }
-        }
-
-        return false;
-
-    }
-}
diff --git a/LeetCode/0242. Valid Anagram/src/Solution.java b/LeetCode/0242. Valid Anagram/src/Solution.java
deleted file mode 100644
index f2111d9..0000000
--- a/LeetCode/0242. Valid Anagram/src/Solution.java	
+++ /dev/null
@@ -1,43 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 12:01
- * Source: https://leetcode.com/problems/valid-anagram/description/
- */
-
-/*
-先将 s 中的元素放入 map 中。然后遍历 t 元素。
-最后检查 map 中的 value 。如果有一个不为 0 。说明有不同的字符存在。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean isAnagram(String s, String t) {
-        Map<Character,Integer> map = new HashMap<>();
-        for(int i = 0;i < s.length();i++){
-            char c = s.charAt(i);
-            if(map.containsKey(c))
-                map.put(c,map.get(c) + 1);
-            else
-                map.put(c,1);
-        }
-
-        for(int j = 0;j < t.length();j++){
-            char ch = t.charAt(j);
-            if(map.containsKey(ch) && map.get(ch) > 0){
-                map.put(ch,map.get(ch) - 1);
-            }else
-                return false;
-        }
-
-        for(int i : map.values())
-            if(i != 0)
-                return false;
-
-        return true;
-
-    }
-}
diff --git a/LeetCode/0279. Perfect Squares/src/Solution.java b/LeetCode/0279. Perfect Squares/src/Solution.java
deleted file mode 100644
index 1882ecb..0000000
--- a/LeetCode/0279. Perfect Squares/src/Solution.java	
+++ /dev/null
@@ -1,26 +0,0 @@
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-/**
- * @author Changle
- * @date 2018/10/25 11:36
- */
-
-class Solution {
-    public int numSquares(int n) {
-
-        int[] memo = new int[n + 1];
-        for(int i = 1;i <= n;i++){
-            if(Math.pow((int)Math.sqrt(i),2) == i ){
-                memo[i] = 1;
-                continue;
-            }
-            memo[i] = i;
-            for(int j = (int)Math.floor(Math.sqrt(i));j >= 1;j--){
-                memo[i] = Math.min(memo[i],1 + memo[i - j * j]);
-            }
-        }
-        return memo[n];
-    }
-}
diff --git a/LeetCode/0283. Move Zeros/src/Solution.java b/LeetCode/0283. Move Zeros/src/Solution.java
deleted file mode 100644
index a5907e3..0000000
--- a/LeetCode/0283. Move Zeros/src/Solution.java	
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-07 15:21
- * Source: https://leetcode.com/problems/move-zeroes/description/
- */
-
-/*
-双指针，一个指针 i 扫描数组，将不为 0 的数放置在位置 j 上，j 向后移动一位。。
-i 扫描结束后，j 的位置到数组最后的位置全部用 0 填充。
-
-时间复杂度O(n)
-空间复杂度O(1)
- */
-class Solution1 {
-
-    public void moveZeroes(int[] nums) {
-        int j = 0;
-        for (int i = 0; i < nums.length; i++) {
-            if (nums[i] != 0) {
-                nums[j++] = nums[i];
-            }
-        }
-
-        for (int k = j; k < nums.length; k++) {
-            nums[k] = 0;
-        }
-
-    }
-}
-
-/*
-同样是建立两个指针，但是遇到不为 0 的数时，直接与 j 指针交换。
-j 始终指向第一个为 0 的元素。节约了置 0 的时间。
-
-时间复杂度O(n)
-空间复杂度O(1)
- */
-class Solution2 {
-
-    public void moveZeroes(int[] nums) {
-        int j = 0;
-        for (int i = 0; i < nums.length; i++) {
-            if (nums[i] != 0) {
-                exch(nums, i, j);
-                j++;
-            }
-        }
-    }
-
-    private void exch(int[] arr, int x, int y) {
-        int temp = arr[x];
-        arr[x] = arr[y];
-        arr[y] = temp;
-    }
-}
diff --git a/LeetCode/0290. Word Pattern/src/Solution.java b/LeetCode/0290. Word Pattern/src/Solution.java
deleted file mode 100644
index 8dd99be..0000000
--- a/LeetCode/0290. Word Pattern/src/Solution.java	
+++ /dev/null
@@ -1,37 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 12:42
- * Source: https://leetcode.com/problems/word-pattern/description/
- */
-
-/*
-把字符与字符串对应放入 map 中。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public boolean wordPattern(String pattern, String str) {
-        String[] words = str.split(" ");
-        if(pattern.length() != words.length)
-            return false;
-
-        Map<Character,String> map = new HashMap<>();
-
-        for(int i = 0;i < pattern.length();i++){
-            char c = pattern.charAt(i);
-            if(map.containsKey(c)){
-                if(!map.get(c).equals(words[i]))
-                    return false;
-            }else{
-                if(map.containsValue(words[i]))
-                    return false;
-                map.put(c,words[i]);
-            }
-        }
-        return true;
-    }
-}
diff --git a/LeetCode/0303. Range Sum Query - Immutable/src/NumArray.java b/LeetCode/0303. Range Sum Query - Immutable/src/NumArray.java
deleted file mode 100644
index 1ac039a..0000000
--- a/LeetCode/0303. Range Sum Query - Immutable/src/NumArray.java	
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * 线段树
- * @author Changle
- * @date 2019/3/11 15:35
- */
-
-class NumArray {
-
-    private int[] tree;
-    private int[] data;
-
-    public NumArray(int[] nums) {
-        if (nums.length > 0) {
-            data = nums;
-            tree = new int[4 * nums.length];
-
-            buildSegmentTree(0, 0, data.length - 1);
-        }
-    }
-
-    private void buildSegmentTree(int treeIndex, int left, int right) {
-        if (left == right) {
-            tree[treeIndex] = data[left];
-            return;
-        }
-
-        int mid = left + (right - left) / 2;
-        int leftChild = 2 * treeIndex + 1;
-        int rightChild = 2 * treeIndex + 2;
-        buildSegmentTree(leftChild, left, mid);
-        buildSegmentTree(rightChild, mid + 1, right);
-
-        tree[treeIndex] = tree[leftChild] + tree[rightChild];
-
-    }
-
-    public int sumRange(int i, int j) {
-        if (data.length == 0) {
-            return 0;
-        }
-        return sumRange(0, 0, data.length - 1, i, j);
-    }
-
-    private int sumRange(int treeIndex, int left, int right, int queryL, int queryR) {
-        if (left == queryL && right == queryR) {
-            return tree[treeIndex];
-        }
-
-        int mid = left + (right - left) / 2;
-        int leftChild = 2 * treeIndex + 1;
-        int rightChild = 2 * treeIndex + 2;
-
-        if (queryL >= mid + 1) {
-            return sumRange(rightChild, mid + 1, right, queryL, queryR);
-        } else if (queryR <= mid) {
-            return sumRange(leftChild, left, mid, queryL, queryR);
-        } else {
-            int leftResult = sumRange(leftChild, left, mid, queryL, mid);
-            int rightResult = sumRange(rightChild, mid + 1, right, mid + 1, queryR);
-            return leftResult + rightResult;
-        }
-    }
-}
diff --git a/LeetCode/0303. Range Sum Query - Immutable/src/NumArray1.java b/LeetCode/0303. Range Sum Query - Immutable/src/NumArray1.java
deleted file mode 100644
index 60fa73d..0000000
--- a/LeetCode/0303. Range Sum Query - Immutable/src/NumArray1.java	
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * @author Changle
- * @date 2019/3/11 15:35
- * source: https://leetcode.com/problems/range-sum-query-immutable/
- */
-
-class NumArray {
-
-   private int[] sumArray;
-
-    public NumArray(int[] nums) {
-        if (nums.length > 0) {
-            sumArray = new int[nums.length];
-            sumArray[0] = nums[0];
-            for (int i = 1; i < nums.length; i++) {
-                sumArray[i] = sumArray[i - 1] + nums[i];
-            }
-        }
-    }
-
-    public int sumRange(int i, int j) {
-        if (sumArray.length <= 0) {
-            return 0;
-        }
-
-        if(i == 0){
-            return sumArray[j];
-        }
-        return sumArray[j] - sumArray[i - 1];
-    }
-    
-}
diff --git a/LeetCode/0307. Range Sum Query - Mutable/src/NumArray.java b/LeetCode/0307. Range Sum Query - Mutable/src/NumArray.java
deleted file mode 100644
index 1b3cc6e..0000000
--- a/LeetCode/0307. Range Sum Query - Mutable/src/NumArray.java	
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * 线段树
- * @author Changle
- * @date 2019/3/11 18:48
- * source: https://leetcode.com/problems/range-sum-query-mutable/
- */
-
-class NumArray {
-
-    private int[] tree;
-    private int[] data;
-
-    public NumArray(int[] nums) {
-        if (nums.length > 0) {
-            data = nums;
-            tree = new int[4 * nums.length];
-
-            buildSegmentTree(0, 0, data.length - 1);
-        }
-    }
-
-    private void buildSegmentTree(int treeIndex, int left, int right) {
-        if (left == right) {
-            tree[treeIndex] = data[left];
-            return;
-        }
-
-        int mid = left + (right - left) / 2;
-        int leftChild = 2 * treeIndex + 1;
-        int rightChild = 2 * treeIndex + 2;
-        buildSegmentTree(leftChild, left, mid);
-        buildSegmentTree(rightChild, mid + 1, right);
-
-        tree[treeIndex] = tree[leftChild] + tree[rightChild];
-
-    }
-
-    public int sumRange(int i, int j) {
-        if (data.length == 0) {
-            return 0;
-        }
-        return sumRange(0, 0, data.length - 1, i, j);
-    }
-
-    private int sumRange(int treeIndex, int left, int right, int queryL, int queryR) {
-        if (left == queryL && right == queryR) {
-            return tree[treeIndex];
-        }
-
-        int mid = left + (right - left) / 2;
-        int leftChild = 2 * treeIndex + 1;
-        int rightChild = 2 * treeIndex + 2;
-
-        if (queryL >= mid + 1) {
-            return sumRange(rightChild, mid + 1, right, queryL, queryR);
-        } else if (queryR <= mid) {
-            return sumRange(leftChild, left, mid, queryL, queryR);
-        } else {
-            int leftResult = sumRange(leftChild, left, mid, queryL, mid);
-            int rightResult = sumRange(rightChild, mid + 1, right, mid + 1, queryR);
-            return leftResult + rightResult;
-        }
-    }
-    
-    public void update(int i, int val) {
-        update(0,0,data.length-1,i,val);    
-    }
-    
-    private void update(int treeIndex,int left,int right ,int index,int val){
-        if(left == right){
-            tree[treeIndex] = val;
-            return;
-        }
-        
-        int mid = left + (right - left) / 2;
-        int leftTreeIndex = 2 * treeIndex + 1;
-        int rightTreeIndex = 2 * treeIndex + 2;
-        
-        if(index >= mid + 1)
-            update(rightTreeIndex,mid + 1,right,index,val);
-        else
-            update(leftTreeIndex,left,mid,index,val);
-        
-        tree[treeIndex] = tree[leftTreeIndex] + tree[rightTreeIndex];
-    }
-}
diff --git a/LeetCode/0338. Counting Bits/src/Solution1.java b/LeetCode/0338. Counting Bits/src/Solution1.java
deleted file mode 100644
index 4f9cfb3..0000000
--- a/LeetCode/0338. Counting Bits/src/Solution1.java	
+++ /dev/null
@@ -1,32 +0,0 @@
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-/**
- * @author Changle
- * @date 2019/9/18 17:05
- * resource: https://leetcode.com/problems/counting-bits/
- */
-
-public class Solution1 {
-
-    public int[] countBits(int num) {
-        int[] res = new int[num + 1];
-        for (int i = 0; i <= num; i++) {
-            res[i] = getCountOfOneAppearInBitsOfNumber(i);
-        }
-        return res;
-    }
-
-    private int getCountOfOneAppearInBitsOfNumber(int num) {
-        int count = 0;
-        int curBit;
-        while (num > 0) {
-            curBit = num % 2;
-            if (curBit == 1) {
-                count++;
-            }
-            num = num / 2;
-        }
-        return count;
-    }
-}
diff --git a/LeetCode/0338. Counting Bits/src/Solution2.java b/LeetCode/0338. Counting Bits/src/Solution2.java
deleted file mode 100644
index 1957081..0000000
--- a/LeetCode/0338. Counting Bits/src/Solution2.java	
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @author Changle
- * @date 2019-9-18 17:34:56
- * resource: https://leetcode.com/problems/counting-bits/
- */
-
-public class Solution2 {
-
-    public int[] countBits(int num) {
-        int[] res = new int[num + 1];
-        res[0] = 0;
-        for (int i = 1; i <= num; i++) {
-            if (i % 2 == 0) {
-                res[i] = res[i >> 1];
-            } else {
-                res[i] = res[i - 1] - 1;
-            }
-        }
-        return res;
-    }
-}
diff --git a/LeetCode/0343. Integer Break/src/Solution.java b/LeetCode/0343. Integer Break/src/Solution.java
deleted file mode 100644
index dfaa20e..0000000
--- a/LeetCode/0343. Integer Break/src/Solution.java	
+++ /dev/null
@@ -1,29 +0,0 @@
-class Solution {
-    public int integerBreak(int n) {
-        if(n == 1 || n == 2){
-            return 1;
-        }
-
-        /**
-         * arr[n] 表示将 n 拆分后的积的最大值
-         * i -> [1,n - 1],arr[n] = Math.max(i * arr[n - i])
-         */
-        int[] arr = new int[n + 1];
-        arr[1] = 1;
-        arr[2] = 1;
-        arr[3] = 2;
-
-        /*
-        从 4 开始，拆分后的积一定不小于原数字。
-         */
-        for(int i = 4;i <= n;i++){
-            int max = 0;
-            for(int j = 1;j < i;j++){
-                int x = arr[i - j] > i - j ? arr[i - j] : i - j;
-                max = (j * x > max) ? j * x : max;
-            }
-            arr[i] = max;
-        }
-        return arr[n];
-    }
-}
diff --git a/LeetCode/0344. Reverse String/src/Solution.java b/LeetCode/0344. Reverse String/src/Solution.java
deleted file mode 100644
index d89cc14..0000000
--- a/LeetCode/0344. Reverse String/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-19 00:06
- * Source: https://leetcode.com/problems/reverse-string/description/
- */
-
-/*
-使用对撞指针。交换相对位置的字符。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public String reverseString(String s) {
-        char[] arr = s.toCharArray();
-        int i = 0,j = arr.length - 1;
-        while (i < j) {
-            char temp = arr[i];
-            arr[i] = arr[j];
-            arr[j] = temp;
-            i++;
-            j--;
-        }
-        return new String(arr);
-    }
-}
-
-
-/*
-直接调用 jdk 中的方法
- */
-class Solution1{
-    public String reverseString(String s) {
-        StringBuffer sb = new StringBuffer(s);
-        return sb.reverse().toString();
-    }
-
-}
diff --git a/LeetCode/0345. Reverse Vowels of a String/src/Solution.java b/LeetCode/0345. Reverse Vowels of a String/src/Solution.java
deleted file mode 100644
index 3e712dd..0000000
--- a/LeetCode/0345. Reverse Vowels of a String/src/Solution.java	
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-02-19 13:27
- */
-
-/*
-使用对撞指针。将对应位置的元音字母交换。
-将所有的元音字母放在一个字符串中，通过 contains() 判断指针所在的位置是不是元音字母。
-更好的处理方式是将十个字符放在 HashSet 中。那么 contains() 方法的复杂度会降低到 O(1)。
-
-时间复杂度: O(n)
-空间复杂度：O(n)
- */
-public class Solution {
-
-    public String reverseVowels(String s) {
-        String vowels = "aeiouAEIOU";
-        char[] arr = s.toCharArray();
-        int i = 0, j = arr.length - 1;
-        while (i <= j) {
-            if (!vowels.contains(arr[i] + "")) {
-                i++;
-                continue;
-            }
-            if (!vowels.contains(arr[j] + "")) {
-                j--;
-                continue;
-            }
-            char temp = arr[i];
-            arr[i] = arr[j];
-            arr[j] = temp;
-            i++;
-            j--;
-        }
-        return new String(arr);
-    }
-}
diff --git a/LeetCode/0349. Intersection of Two Arrays/src/Solution.java b/LeetCode/0349. Intersection of Two Arrays/src/Solution.java
deleted file mode 100644
index 1c1318d..0000000
--- a/LeetCode/0349. Intersection of Two Arrays/src/Solution.java	
+++ /dev/null
@@ -1,38 +0,0 @@
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * User: Changle
- * Date: 2018-03-11 13:07
- * Source: https://leetcode.com/problems/intersection-of-two-arrays/description/
- */
-
-/*
-将一个数组中的元素加入到集合中，然后遍历另一个元素。判断元素是否在集合中出现。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public int[] intersection(int[] nums1, int[] nums2) {
-        Set<Integer> resSet  = new HashSet<>();
-
-        Set<Integer> set = new HashSet<>();
-        for(int i = 0;i < nums1.length;i++){
-            set.add(nums1[i]);
-        }
-
-        for(int j = 0;j < nums2.length;j++){
-            if(set.contains(nums2[j]))
-                resSet.add(nums2[j]);
-        }
-
-        int[] res = new int[resSet.size()];
-        int index = 0;
-
-        for(Integer i : resSet)
-            res[index++] =  i;
-
-        return res;
-    }
-}
diff --git a/LeetCode/0350. Intersection of Two Arrays II/src/Solution.java b/LeetCode/0350. Intersection of Two Arrays II/src/Solution.java
deleted file mode 100644
index 308a867..0000000
--- a/LeetCode/0350. Intersection of Two Arrays II/src/Solution.java	
+++ /dev/null
@@ -1,44 +0,0 @@
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-03-11 13:10
- * Source: https://leetcode.com/problems/intersection-of-two-arrays-ii/description/
- */
-
-/*
-将一个数组遍历一遍，放入 map 中。然后遍历第二个数组。
-如果元素对应的 value > 0，说明这个数是共同元素。
-
-时间复杂度: O(n)
-空间复杂度: O(n)
- */
-public class Solution {
-    public int[] intersect(int[] nums1, int[] nums2) {
-        Map<Integer,Integer> map = new HashMap<>();
-        for(int i: nums1){
-            if(map.get(i) != null)
-                map.put(i,map.get(i) + 1);
-            else
-                map.put(i,1);
-        }
-
-        List<Integer> list = new ArrayList<>();
-        for(int i = 0;i < nums2.length;i++){
-            if(map.get(nums2[i]) != null && map.get(nums2[i]) > 0 ){
-                list.add(nums2[i]);
-                map.put(nums2[i],map.get(nums2[i]) - 1);
-            }
-        }
-
-        int[] res = new int[list.size()];
-        int index = 0;
-        for(Integer i: list){
-            res[index++] = i;
-        }
-        return res;
-    }
-}
diff --git a/LeetCode/0438. Find All Anagrams in a String/src/Solution.java b/LeetCode/0438. Find All Anagrams in a String/src/Solution.java
deleted file mode 100644
index 3dbaf9e..0000000
--- a/LeetCode/0438. Find All Anagrams in a String/src/Solution.java	
+++ /dev/null
@@ -1,44 +0,0 @@
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: Changle
- * Date: 2018-02-21 18:16
- * Source: https://leetcode.com/problems/find-all-anagrams-in-a-string/description/
- */
-
-/*
-使用滑动窗口。
-count 记录还有几个 p 中的字符应该出现。
-
-时间复杂度: O(len(p) + len(s))
-空间复杂度: O(len(p))
- */
-public class Solution {
-    public List<Integer> findAnagrams(String s, String p) {
-        List<Integer> list = new ArrayList<>();
-        int[] ch = new int[256];
-        for(char c:p.toCharArray()){
-            ch[c]++;
-        }
-
-        int i = 0,j = 0;
-        int count = p.length();
-        while(i < s.length() && j < s.length()){
-            if(ch[s.charAt(j++)]-- > 0)
-                count--;
-
-            if(count == 0)
-                list.add(i);
-
-            if(j - i == p.length() && ch[s.charAt(i++)]++ >= 0)
-                count++;
-        }
-
-        return list;
-
-    }
-}
diff --git a/LeetCode/0447. Number of Boomerangs/src/Solution.java b/LeetCode/0447. Number of Boomerangs/src/Solution.java
deleted file mode 100644
index 6f6ea1c..0000000
--- a/LeetCode/0447. Number of Boomerangs/src/Solution.java	
+++ /dev/null
@@ -1,50 +0,0 @@
-import java.util.HashMap;
-
-/**
- * User: Changle
- * Date: 2018-03-11 13:18
- * Source: https://leetcode.com/problems/number-of-boomerangs/description/
- */
-
-/*
-固定一个点，遍历其它的点。将距离与个数放入 hashmap 中。
-将每个点的结果相加。
-
-时间复杂度: O(n^2)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    public static int numberOfBoomerangs(int[][] points) {
-        int res = 0;
-        HashMap<Integer, Integer> hashMap = new HashMap<>();
-        for (int i = 0; i < points.length; i++) {
-            for (int j = 0; j < points.length; j++) {
-                if (j != i) {
-                    if (hashMap.containsKey(distance(points[i], points[j]))) {
-                        hashMap.put(distance(points[i], points[j]),
-                                hashMap.get(distance(points[i], points[j]))+ 1);
-                    } else {
-                        hashMap.put(distance(points[i], points[j]), 1);
-                    }
-                }
-            }
-
-            for (int val : hashMap.values()) {
-                res += val * (val - 1);
-            }
-
-            hashMap.clear();
-        }
-        return res;
-    }
-
-    private static int distance(int[] a, int[] b) {
-        return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);
-    }
-
-    public static void main(String[] args) {
-        int[][] a = {{0, 0}, {1, 0}, {2, 0}};
-        numberOfBoomerangs(a);
-    }
-}
diff --git a/LeetCode/0454. 4Sum II/src/Solution.java b/LeetCode/0454. 4Sum II/src/Solution.java
deleted file mode 100644
index 69fbd6e..0000000
--- a/LeetCode/0454. 4Sum II/src/Solution.java	
+++ /dev/null
@@ -1,42 +0,0 @@
-import java.util.HashMap;
-
-/**
- * User: Changle
- * Date: 2018-03-11 13:27
- * Source: https://leetcode.com/problems/4sum-ii/description/
- */
-
-/*
-将 C + D 的和放入到 map 中。确定 A 中的数，然后遍历 B 集合，
-
-时间复杂度: O(n^3)
-空间复杂度: O(n)
- */
-public class Solution {
-
-    public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
-        HashMap<Integer,Integer> map = new HashMap<>();
-        for (int i = 0; i < C.length; i++) {
-            for (int j = 0; j < D.length; j++) {
-                if (map.containsKey(C[i] + D[j])) {
-                    map.put(C[i] + D[j], map.get(C[i] + D[j]) + 1);
-                } else {
-                    map.put(C[i] + D[j], 1);
-                }
-            }
-        }
-
-        int res = 0;
-        for (int i = 0; i < A.length; i++) {
-            for (int j = 0; j < B.length; j++) {
-                if (map.containsKey(-A[i] - B[j])) {
-                    res = res + map.get(-A[i] - B[j]);
-                }
-            }
-        }
-
-        return res;
-    }
-
-}
-
diff --git a/LeetCode/0530. Minimum Absolute Difference in BST/src/Solution.java b/LeetCode/0530. Minimum Absolute Difference in BST/src/Solution.java
deleted file mode 100644
index 2cc2108..0000000
--- a/LeetCode/0530. Minimum Absolute Difference in BST/src/Solution.java	
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * User: Changle
- * Date: 2019-1-18 10:11
- * Source: https://leetcode.com/problems/minimum-absolute-difference-in-bst/
- */
- 
- /*
- 中序遍历，结果出现在相邻元素之间的差值之间。
- */
- 
-public class Solution {
-    private int min = Integer.MAX_VALUE;
-    private int prev = -1;
-        
-    public int getMinimumDifference(TreeNode root) {
-       
-        inOrder(root);
-        return min;
-       
-    }
-    
-    private void inOrder(TreeNode root){
-        if ( root == null )
-            return;
-        inOrder(root.left);
-        if ( prev != -1 )
-            min = Math.min(min,root.val - prev);
-        prev = root.val;
-        inOrder(root.right);
-    }
-}
diff --git a/LeetCode/0606. Construct String from Binary Tree/src/Solution.java b/LeetCode/0606. Construct String from Binary Tree/src/Solution.java
deleted file mode 100644
index ec92d00..0000000
--- a/LeetCode/0606. Construct String from Binary Tree/src/Solution.java	
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @author Changle
- * @date 2019/2/26 11:06
- * @source: https://leetcode.com/problems/construct-string-from-binary-tree/submissions/
- */
-
-class Solution {
-
-    public String tree2str(TreeNode t) {
-        if (t == null) {
-            return "";
-        }
-        String root = t.val + "";
-        String left = (t.right == null && t.left == null) ? "" : ("(" + tree2str(t.left) + ")");
-        String right = (t.right == null) ? "" : ("(" + tree2str(t.right) + ")");
-
-        return root + left + right;
-    }
-}
diff --git a/LeetCode/0677. Map Sum Pairs/src/MapSum.java b/LeetCode/0677. Map Sum Pairs/src/MapSum.java
deleted file mode 100644
index 5ae9b95..0000000
--- a/LeetCode/0677. Map Sum Pairs/src/MapSum.java	
+++ /dev/null
@@ -1,61 +0,0 @@
-import java.util.HashMap;
-
-/**
- * @author: changle
- * @time: 2019-03-14 01:52
- * source: https://leetcode.com/problems/map-sum-pairs/
- */
-public class MapSum {
-
-
-    Node root;
-
-    class Node {
-
-        int value;
-        HashMap<Character, Node> next;
-
-        public Node(int value) {
-            value = value;
-            next = new HashMap<>();
-        }
-
-    }
-
-    public MapSum() {
-        root = new Node(0);
-    }
-
-    public void insert(String key, int val) {
-        Node cur = root;
-        for (int i = 0; i < key.length(); i++) {
-            char c = key.charAt(i);
-            if (cur.next.get(c) == null) {
-                cur.next.put(c, new Node(0));
-            }
-            cur = cur.next.get(c);
-        }
-        cur.value = val;
-    }
-
-    public int sum(String prefix) {
-        Node cur = root;
-        for (int i = 0; i < prefix.length(); i++) {
-            char c = prefix.charAt(i);
-            if (cur.next.get(c) == null) {
-                return 0;
-            }
-            cur = cur.next.get(c);
-        }
-        return sum(cur);
-    }
-
-    private int sum(Node node) {
-        int res = node.value;
-        for (char c : node.next.keySet()) {
-            res += sum(node.next.get(c));
-        }
-        return res;
-    }
-}
-
diff --git a/LeetCode/0700. Search in a Binary Search Tree/src/Solution.java b/LeetCode/0700. Search in a Binary Search Tree/src/Solution.java
deleted file mode 100644
index e6f4f72..0000000
--- a/LeetCode/0700. Search in a Binary Search Tree/src/Solution.java	
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @author Changle
- * @date 2019/1/21 11:16
- * Source: https://leetcode.com/problems/search-in-a-binary-search-tree/
- */
-
-public class Solution {
-
-    public TreeNode searchBST(TreeNode root, int val) {
-        if (root == null || root.val == val) {
-            return root;
-        }
-        if (root.val < val) {
-            return searchBST(root.right, val);
-        } else {
-            return searchBST(root.left, val);
-        }
-    }
-}
diff --git a/LeetCode/0783. Minimum Distance Between BST Nodes/src/Solution.java b/LeetCode/0783. Minimum Distance Between BST Nodes/src/Solution.java
deleted file mode 100644
index b74dc8c..0000000
--- a/LeetCode/0783. Minimum Distance Between BST Nodes/src/Solution.java	
+++ /dev/null
@@ -1,47 +0,0 @@
-import java.util.Arrays;
-
-/**
- * User: Changle
- * Date: 2018-02-14 16:10
- * Source: https://leetcode.com/problems/minimum-distance-between-bst-nodes/
- */
- 
- /*
- 取出 BST 中的每个元素放到数组中排序，
- 
- 再求相邻元素之间差值的最小值
-*/
-
- public class Solution {
-    
-    private int[] nodeArr;
-    private int size;
-    private int index;
-    
-    public int minDiffInBST(TreeNode root) {
-      int result = Integer.MAX_VALUE;
-      nodeArr = new int[size(root)];
-      fillArray(root);
-      Arrays.sort(nodeArr);
-      for(int i = 1;i < nodeArr.length;i++){
-        result = Math.min(nodeArr[i] - nodeArr[i - 1],result);      
-      }
-        return result;
-    }
-    
-    private int size(TreeNode root){
-        
-        if(root == null){
-            return 0;
-        }
-        return size(root.left) + size(root.right) + 1;
-    }
-    private void fillArray(TreeNode root){
-        if(root == null){
-            return;
-        }
-        nodeArr[index++] = root.val;
-        fillArray(root.left);
-        fillArray(root.right);
-    }
-}
diff --git a/LeetCode/0804. Unique Morse Code Words/src/Solution.java b/LeetCode/0804. Unique Morse Code Words/src/Solution.java
deleted file mode 100644
index 97e0fc0..0000000
--- a/LeetCode/0804. Unique Morse Code Words/src/Solution.java	
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * User: Changle
- * Date: 2019-03-01 11:29:16
- * Source: https://leetcode.com/problems/unique-morse-code-words/
- */
-
-class Solution {
-
-    final String[] morseCodes = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
-            ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
-            "...-", ".--", "-..-", "-.--", "--.."};
-
-    public int uniqueMorseRepresentations(String[] words) {
-        Set<String> set = new HashSet<String>();
-        for (String word : words) {
-            // 解析成莫斯密码
-            set.add(trans2MorseCode(word));
-        }
-        return set.size();
-    }
-
-    private String trans2MorseCode(String word) {
-        String result = "";
-        for (int i = 0; i < word.length(); i++) {
-            result += morseCodes[word.charAt(i) - 'a'];
-        }
-        return result;
-    }
-}
diff --git a/LeetCode/0938. Range Sum of BST/src/Solution.java b/LeetCode/0938. Range Sum of BST/src/Solution.java
deleted file mode 100644
index f0ab516..0000000
--- a/LeetCode/0938. Range Sum of BST/src/Solution.java	
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @author Changle
- * @date 2019/1/21 10:42
- * Source: https://leetcode.com/problems/range-sum-of-bst/
- */
-
-public class Solution {
-
-    public int rangeSumBST(TreeNode root, int L, int R) {
-        if (root == null) {
-            return 0;
-        }
-        if (L > R) {
-            return -1;
-        }
-        if (root.val < L) {
-            return rangeSumBST(root.right, L, R);
-        } else if (root.val > R) {
-            return rangeSumBST(root.left, L, R);
-        }
-        return root.val + rangeSumBST(root.right, L, R) + rangeSumBST(root.left, L, R);
-    }
-}
diff --git a/LeetCode/1025. Divisor Game/src/Solution.java b/LeetCode/1025. Divisor Game/src/Solution.java
deleted file mode 100644
index d8810d4..0000000
--- a/LeetCode/1025. Divisor Game/src/Solution.java	
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @author Changle
- * @date 2019/9/18 19:35
- * resource: https://leetcode.com/problems/divisor-game/
- */
-
-public class Solution {
-
-    public boolean divisorGame(int N) {
-        boolean[] result = new boolean[N + 1];
-        for (int i = 1; i <= N; i++) {
-            for (int j = 1; j < i; j++) {
-                if ((i % j == 0) && (result[i - j] == false)) {
-                    result[i] = true;
-                    break;
-                }
-            }
-        }
-        return result[N];
-    }
-}
diff --git a/LeetCode/src/L0001/Solution.java b/LeetCode/src/L0001/Solution.java
new file mode 100644
index 0000000..4a7f8d9
--- /dev/null
+++ b/LeetCode/src/L0001/Solution.java
@@ -0,0 +1,20 @@
+package L0001;
+
+import java.util.HashMap;
+
+public class Solution {
+    public int[] twoSum(int[] nums, int target) {
+        int[] res = new int[2];
+        HashMap<Integer, Integer> hashMap = new HashMap<>();
+        for (int i = 0;i < nums.length;i++){
+            if (hashMap.containsKey(target - nums[i])) {
+                res[0] = i;
+                res[1] = hashMap.get(target - nums[i]);
+                return res;
+            }else{
+                hashMap.put(nums[i], i);
+            }
+        }
+        return res;
+    }
+}
\ No newline at end of file
diff --git a/LeetCode/src/L0784/Solution.java b/LeetCode/src/L0784/Solution.java
new file mode 100644
index 0000000..ad18871
--- /dev/null
+++ b/LeetCode/src/L0784/Solution.java
@@ -0,0 +1,26 @@
+package L0784;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Solution {
+    public List<String> letterCasePermutation(String s) {
+        List<String> res = new ArrayList<>();
+        res.add("");
+        for(int i = 0;i < s.length();i++){
+            char c = s.charAt(i);
+            if(Character.isLetter(c)){
+                res = res.stream().map(o -> {
+                    List<String> list = new ArrayList<>();
+                    list.add(o + Character.toLowerCase(c));
+                    list.add(o + Character.toUpperCase(c));
+                    return list;
+                }).flatMap(List::stream).collect(Collectors.toList());
+            }else{
+                res = res.stream().map(o -> o + c).collect(Collectors.toList());
+            }
+        }
+        return res;
+    }
+}
\ No newline at end of file
diff --git a/LeetCode/src/L0864/Solution.java b/LeetCode/src/L0864/Solution.java
new file mode 100644
index 0000000..ae5ce63
--- /dev/null
+++ b/LeetCode/src/L0864/Solution.java
@@ -0,0 +1,64 @@
+package L0864;
+
+import java.util.*;
+
+public class Solution {
+
+    public int shortestPathAllKeys(String[] grid) {
+        Deque<int[]> queue = new ArrayDeque<>();
+        int keyCnt = 0;
+        int row = grid.length, col = grid[0].length();
+        int[][][] dist = new int[row][col][1 << 10];
+        int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
+        for (int i = 0; i < row; i++) {
+            for (int j = 0; j < col; j++) {
+                Arrays.fill(dist[i][j], 0x3f3f3f3f);
+                char c = grid[i].charAt(j);
+                if (c == '@') {  
+                    queue.add(new int[]{i, j, 0});
+                    dist[i][j][0] = 0;
+                } else if (Character.isLowerCase(c)) {
+                    keyCnt++;
+                }
+            }
+        }
+        while (!queue.isEmpty()) {
+            int[] pos = queue.pollFirst();
+            int x = pos[0], y = pos[1], keyMask = pos[2],step = dist[x][y][keyMask];
+            for (int[] di : dir) {
+                int nx = x + di[0];
+                int ny = y + di[1];
+                if (nx < 0 || nx >= row || ny < 0 || ny >= col) {
+                    continue;
+                }
+                char c = grid[nx].charAt(ny);
+                // 如果是墙，则跳过
+                if (c == '#') {
+                    continue;
+                }
+                // 如果是锁，但是没有对应的钥匙，也跳过
+                if (Character.isUpperCase(c) && ((keyMask >> (c - 'A') & 1) == 0)) {
+                    continue;
+                }
+                int curKeyMask = keyMask;
+                // 如果是钥匙，则扩充当前位置的钥匙数量
+                if (Character.isLowerCase(c)) {
+                    curKeyMask = curKeyMask | 1 << (c - 'a');
+                }
+                // 如果获取了所有钥匙，则返回步数
+                if ((1 << keyCnt) - 1 == curKeyMask) {
+                    return step + 1;
+                }
+                // 如果是其他情况（空格），则继续行走，对应步数 + 1
+                if (step + 1 < dist[nx][ny][curKeyMask]) {
+                    dist[nx][ny][curKeyMask] = step + 1;
+                    queue.addLast(new int[]{nx, ny, curKeyMask});
+                }
+            }
+        }
+        return -1;
+    }
+
+
+
+}
diff --git a/LeetCode/src/L1106/Solution.java b/LeetCode/src/L1106/Solution.java
new file mode 100644
index 0000000..eb14f33
--- /dev/null
+++ b/LeetCode/src/L1106/Solution.java
@@ -0,0 +1,64 @@
+package L1106;
+
+import java.util.*;
+
+public class Solution {
+    public boolean parseBoolExpr(String expression) {
+        Deque<Character> deque = new ArrayDeque<>();
+        for (int i = 0; i < expression.length(); i++) {
+            // 如果是逗号，则直接忽略
+            Character curChar = expression.charAt(i);
+            if (curChar == ',') {
+                continue;
+            }
+            // 如果非右括号，则入栈
+            if (curChar != ')') {
+                deque.addLast(curChar);
+            }else {
+            // 如果是右括号，则开始计算
+                Set<Character> set = new HashSet<>();
+                while(!deque.isEmpty()){
+                    Character peekChar = deque.removeLast();
+                    // 如果等于左括号，则开始计算，否则一直移除
+                    if (peekChar == '(') {
+                        Character operator = deque.removeLast();
+                        if (operator == '!') {
+                            // 则取反
+                            if (set.contains('t')) {
+                                deque.addLast('f');
+                            } else {
+                                deque.addLast('t');
+                            }
+                        } else if (operator == '&') {
+                            // 判断 set 中是否都是 t
+                            if (set.contains('f')) {
+                                deque.addLast('f');
+                            } else {
+                                deque.addLast('t');
+                            }
+                        } else if (operator == '|') {
+                            // 判断 set 中是否有 t
+                            if (set.contains('t')) {
+                                deque.addLast('t');
+                            } else {
+                                deque.addLast('f');
+                            }
+                        }
+                        set.clear();
+                        break;
+                    }else {
+                        //不是左括号且不是逗号，则将运算符放入集合中
+                        if (peekChar != ',') {
+                            set.add(peekChar);
+                        }
+                    }
+                }
+
+            }
+        }
+        // 最后弹出栈顶元素
+        Character result = deque.peekLast();
+        return result == 't';
+    }
+
+}
\ No newline at end of file
diff --git a/LeetCode/src/L1678/Solution.java b/LeetCode/src/L1678/Solution.java
new file mode 100644
index 0000000..b97eedf
--- /dev/null
+++ b/LeetCode/src/L1678/Solution.java
@@ -0,0 +1,22 @@
+package L1678;
+
+public class Solution {
+    public String interpret(String command) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < command.length(); i++) {
+            Character c = command.charAt(i);
+            if (c == 'G') {
+                sb.append("G");
+            } else {
+                if (command.charAt(i + 1) == ')') {
+                    sb.append("o");
+                    i++;
+                } else {
+                    sb.append("al");
+                    i = i + 3;
+                }
+            }
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/LeetCode/src/L1684/Solution.java b/LeetCode/src/L1684/Solution.java
new file mode 100644
index 0000000..eca4372
--- /dev/null
+++ b/LeetCode/src/L1684/Solution.java
@@ -0,0 +1,18 @@
+package L1684;
+
+public class Solution {
+    public int countConsistentStrings(String allowed, String[] words) {
+        int ans = 0;
+        for (String s : words) {
+            String word = s;
+            for (int j = 0; j < allowed.length(); j++) {
+                word = word.replace(String.valueOf(allowed.charAt(j)), "");
+            }
+            if (word.length() == 0) {
+                ans++;
+            }
+        }
+        return ans;
+    }
+
+}
\ No newline at end of file
diff --git a/LeetCode/src/L1704/Solution.java b/LeetCode/src/L1704/Solution.java
new file mode 100644
index 0000000..b2843d2
--- /dev/null
+++ b/LeetCode/src/L1704/Solution.java
@@ -0,0 +1,20 @@
+package L1704;
+
+class Solution {
+    public boolean halvesAreAlike(String s) {
+        String h = "aeiouAEIOU";
+        int l1 = 0, l2 = s.length() / 2;
+        int cnt1 = 0,cnt2 = 0;
+        for(int i = 0;i < l2;i++){
+            if(h.indexOf(s.charAt(i)) >= 0){
+                cnt1++;
+            }
+        }
+        for(int i = l2;i < s.length();i++){
+            if(h.indexOf(s.charAt(i)) >= 0){
+                cnt2++;
+            }
+        }
+        return cnt1 == cnt2;
+    }
+}
\ No newline at end of file
diff --git a/LeetCode/src/L6234/Solution.java b/LeetCode/src/L6234/Solution.java
new file mode 100644
index 0000000..67e4350
--- /dev/null
+++ b/LeetCode/src/L6234/Solution.java
@@ -0,0 +1,57 @@
+package L6234;
+
+class Solution {
+    public int subarrayLCM(int[] nums, int k) {
+        int ans = 0;
+        for (int i = 0; i < nums.length; i++) {
+            if (nums[i] > k || k % nums[i] != 0) {
+                continue;
+            }
+            int cm;
+            for (int j = i; j < nums.length; j++) {
+                if (nums[j] > k || k % nums[j] != 0) {
+                    break;
+                }
+                cm = cmOfArr(nums, i, j);
+                if (cm == k) {
+                    ans++;
+                }
+                if (cm > k) {
+                    break;
+                }
+            }
+        }
+        return ans;
+    }
+
+    public int cmOfArr(int[] nums, int left, int right) {
+        if (left == right) {
+            return nums[left];
+        }
+        int num = findCM(nums[left], nums[left + 1]);
+        for (int i = left + 2; i <= right; i++) {
+            num = findCM(num, nums[i]);
+        }
+        return num;
+
+    }
+
+    public int findCM(int m, int n) {
+        int min = Math.min(m, n);
+        int max = Math.max(m, n);
+        int num;
+        for (int j = 1; j <= max; j++) {
+            num = min * j;
+            if (num % max == 0) {
+                return num;
+            }
+        }
+        return min;
+    }
+
+    public static void main(String[] args) {
+        int[] arr = new int[]{2,2,3,4,3};
+        Solution solution = new Solution();
+        System.out.println(solution.subarrayLCM(arr, 2));
+    }
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 5d12215..e69de29 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +0,0 @@
-- [x] 学习数据结构
----
-- [ ] 学习算法中
-
-会解决少量相关 LeetCode 问题
diff --git "a/\345\211\221\346\214\207offer/Fibonacci/src/Solution.java" "b/\345\211\221\346\214\207offer/Fibonacci/src/Solution.java"
deleted file mode 100644
index b2eca39..0000000
--- "a/\345\211\221\346\214\207offer/Fibonacci/src/Solution.java"
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-27 10:45
- * Description:
- * 大家都知道斐波那契数列，现在要求输入一个整数n，请你输出斐波那契数列的第n项。
- * n<=39
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    public int Fibonacci(int n) {
-        int[] arr = new int[40];
-        arr[0] = 0;
-        arr[1] = 1;
-        if (n == 0) {
-            return 0;
-        }
-        if (n == 1) {
-            return 1;
-        }
-        int index = 2;
-        while (true) {
-            arr[index] = arr[index - 1] + arr[index - 2];
-            if (index == n) {
-                return arr[index];
-            }
-            index++;
-        }
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/FindKthToTail/src/Solution.java" "b/\345\211\221\346\214\207offer/FindKthToTail/src/Solution.java"
deleted file mode 100644
index 3b966c4..0000000
--- "a/\345\211\221\346\214\207offer/FindKthToTail/src/Solution.java"
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-27 14:29
- * Description:
- */
-
-public class Solution {
-
-    public class ListNode {
-
-        int val;
-        ListNode next = null;
-
-        ListNode(int val) {
-            this.val = val;
-        }
-    }
-
-    public ListNode FindKthToTail(ListNode head, int k) {
-        ListNode node = head;
-        int count = 1;
-        while (node.next != null) {
-            count++;
-            node = node.next;
-        }
-        for (int i = 0; i < count - k; i++) {
-            node = node.next;
-        }
-        return node;
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/FindNumsAppearOnce/src/Solution.java" "b/\345\211\221\346\214\207offer/FindNumsAppearOnce/src/Solution.java"
deleted file mode 100644
index a2c8157..0000000
--- "a/\345\211\221\346\214\207offer/FindNumsAppearOnce/src/Solution.java"
+++ /dev/null
@@ -1,28 +0,0 @@
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * User: Changle
- * Date: 2018-01-31 22:51
- * Description:
- * 一个整型数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- * num1,num2分别为长度为1的数组。传出参数
- * 将num1[0],num2[0]设置为返回结果
- */
-
-public class Solution {
-    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
-        Set set = new HashSet();
-        for (int i = 0; i < array.length; i++) {
-            if (set.contains(array[i])) {
-                set.remove(array[i]);
-            } else {
-                set.add(array[i]);
-            }
-        }
-
-        Object[] o = set.toArray();
-        num1[0] = (int) o[0];
-        num2[0] = (int) o[1];
-    }
-}
\ No newline at end of file
diff --git "a/\345\211\221\346\214\207offer/IsBalancedTree/src/Solution.java" "b/\345\211\221\346\214\207offer/IsBalancedTree/src/Solution.java"
deleted file mode 100644
index 2752fc0..0000000
--- "a/\345\211\221\346\214\207offer/IsBalancedTree/src/Solution.java"
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * User: Changle
- * Date: 2018-01-31 20:12
- * Description:
- * 输入一棵二叉树，判断该二叉树是否是平衡二叉树。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    public class TreeNode {
-
-        int val = 0;
-        TreeNode left = null;
-        TreeNode right = null;
-
-        public TreeNode(int val) {
-            this.val = val;
-
-        }
-
-    }
-
-    public boolean IsBalanced_Solution(TreeNode root) {
-        if(root == null)
-            return true;
-        if(Math.abs(TreeDepth(root.left) - TreeDepth(root.right)) > 1){
-            return false;
-        }
-        boolean left = IsBalanced_Solution(root.left);
-        boolean right = IsBalanced_Solution(root.right);
-        return left && right;
-    }
-
-    public int TreeDepth(TreeNode root) {
-        if (root == null) {
-            return 0;
-        }
-        return Math.max(TreeDepth(root.left),TreeDepth(root.right)) + 1;
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/JumpFloor/src/Solution.java" "b/\345\211\221\346\214\207offer/JumpFloor/src/Solution.java"
deleted file mode 100644
index 46a549a..0000000
--- "a/\345\211\221\346\214\207offer/JumpFloor/src/Solution.java"
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-27 10:59
- * Description:
- * 一只青蛙一次可以跳上1级台阶，也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-    public int JumpFloor(int target) {
-        if (target == 1) {
-            return 1;
-        }
-        if (target == 2) {
-            return 2;
-        }
-        return JumpFloor(target - 1) + JumpFloor(target - 2);
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/JumpFloor\342\205\241/src/Solution.java" "b/\345\211\221\346\214\207offer/JumpFloor\342\205\241/src/Solution.java"
deleted file mode 100644
index 607b380..0000000
--- "a/\345\211\221\346\214\207offer/JumpFloor\342\205\241/src/Solution.java"
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-27 11:08
- * Description:
- * 一只青蛙一次可以跳上1级台阶，也可以跳上2级……它也可以跳上n级。
- * 求该青蛙跳上一个n级的台阶总共有多少种跳法。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    public int JumpFloorII(int target) {
-        if (target <= 2) {
-            return target;
-        }
-        int[] arr = new int[target];
-        arr[0] = 1; arr[1] = 2;
-        for (int i = 0; i < arr.length; i++) {
-            for (int j = 0; j < i; j++) {
-                arr[i] += arr[j];
-            }
-        }
-        return arr[target -1];
-    }
-}
\ No newline at end of file
diff --git "a/\345\211\221\346\214\207offer/PrintListFromTailToHead/src/Solution.java" "b/\345\211\221\346\214\207offer/PrintListFromTailToHead/src/Solution.java"
deleted file mode 100644
index ad0d81f..0000000
--- "a/\345\211\221\346\214\207offer/PrintListFromTailToHead/src/Solution.java"
+++ /dev/null
@@ -1,41 +0,0 @@
-import java.util.ArrayList;
-import java.util.Stack;
-
-/**
- * User: Changle
- * Date: 2017-12-26 20:29
- * Description:
- * 输入一个链表，从尾到头打印链表每个节点的值。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    public class ListNode {
-
-        int val;
-        ListNode next = null;
-
-        ListNode(int val) {
-            this.val = val;
-        }
-    }
-
-    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
-        Stack s = new Stack();
-
-        while (listNode!= null) {
-            s.push(listNode.val);
-            listNode = listNode.next;
-        }
-        ArrayList<Integer> arrayList = new ArrayList<>();
-        while (!s.empty()) {
-            arrayList.add((Integer) s.pop());
-        }
-
-        return arrayList;
-
-    }
-
-
-}
diff --git "a/\345\211\221\346\214\207offer/ReplaceSpace/src/Solution.java" "b/\345\211\221\346\214\207offer/ReplaceSpace/src/Solution.java"
deleted file mode 100644
index 63060b0..0000000
--- "a/\345\211\221\346\214\207offer/ReplaceSpace/src/Solution.java"
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-26 17:02
- * Description:
- * 请实现一个函数，将一个字符串中的空格替换成“%20”。
- * 例如，当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    private static String replace(StringBuffer str) {
-        String s = str.toString();
-        char[] strChar = s.toCharArray();
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0; i < strChar.length; i++) {
-            if (strChar[i] == ' ') {
-                sb.append("%20");
-            } else {
-                sb.append(strChar[i]);
-            }
-        }
-        return sb.toString();
-    }
-
-    public static void main(String[] args) {
-        String[] a = "a ".split(" ");
-        System.out.println(a.length);
-        StringBuffer sb = new StringBuffer("We Are Happy");
-        System.out.println(replace(sb));
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/TreeDepth/src/Solution.java" "b/\345\211\221\346\214\207offer/TreeDepth/src/Solution.java"
deleted file mode 100644
index 561d4c6..0000000
--- "a/\345\211\221\346\214\207offer/TreeDepth/src/Solution.java"
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * User: Changle
- * Date: 2017-12-29 13:48
- * Description:
- * 输入一棵二叉树，求该树的深度。
- * 从根结点到叶结点依次经过的结点（含根、叶结点）形成树的一条路径，最长路径的长度为树的深度。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solution {
-
-    public class TreeNode {
-
-        int val = 0;
-        TreeNode left = null;
-        TreeNode right = null;
-
-        public TreeNode(int val) {
-            this.val = val;
-
-        }
-
-    }
-
-    public int TreeDepth(TreeNode root) {
-        if (root == null) {
-            return 0;
-        }
-        return Math.max(TreeDepth(root.left),TreeDepth(root.right)) + 1;
-    }
-}
diff --git "a/\345\211\221\346\214\207offer/TwoStacksImplementQueue/src/Solustion.java" "b/\345\211\221\346\214\207offer/TwoStacksImplementQueue/src/Solustion.java"
deleted file mode 100644
index a44e5f7..0000000
--- "a/\345\211\221\346\214\207offer/TwoStacksImplementQueue/src/Solustion.java"
+++ /dev/null
@@ -1,30 +0,0 @@
-import java.util.Stack;
-
-/**
- * User: Changle
- * Date: 2017-12-27 10:06
- * Description:
- * 用两个栈来实现一个队列，完成队列的Push和Pop操作。 队列中的元素为int类型。
- * 时间限制：1秒 空间限制：32768K
- */
-
-public class Solustion {
-
-    Stack<Integer> stack1 = new Stack<Integer>();
-    Stack<Integer> stack2 = new Stack<Integer>();
-
-    public void push(int node) {
-        stack1.add(node);
-    }
-
-    public int pop() {
-        while (!stack1.isEmpty()) {
-            stack2.add(stack1.pop());
-        }
-        int res = stack2.pop();
-        while (!stack2.isEmpty()) {
-            stack1.add(stack2.pop());
-        }
-        return res;
-    }
-}
