diff --git a/src/leo/class01/BSAwesome.java b/leo/class01_01/BSAwesome.java similarity index 98% rename from src/leo/class01/BSAwesome.java rename to leo/class01_01/BSAwesome.java index c6ba945..9cce675 100644 --- a/src/leo/class01/BSAwesome.java +++ b/leo/class01_01/BSAwesome.java @@ -1,9 +1,6 @@ -package leo.class01; +package leo.class01_01; -import com.sun.org.apache.xpath.internal.functions.FuncFalse; import leo.util.ArrayUtil; -import sun.jvm.hotspot.debugger.Page; -import sun.security.util.Length; /** * @author Leo diff --git a/src/leo/class01/BSExist.java b/leo/class01_01/BSExist.java similarity index 98% rename from src/leo/class01/BSExist.java rename to leo/class01_01/BSExist.java index ca77c75..ff9a727 100644 --- a/src/leo/class01/BSExist.java +++ b/leo/class01_01/BSExist.java @@ -1,11 +1,8 @@ -package leo.class01; +package leo.class01_01; import leo.util.ArrayUtil; -import javax.swing.plaf.TreeUI; -import java.util.Arrays; - /** * @author Leo * @ClassName BSExist diff --git a/src/leo/class01/BSNear.java b/leo/class01_01/BSNear.java similarity index 99% rename from src/leo/class01/BSNear.java rename to leo/class01_01/BSNear.java index f5e1e80..88a0777 100644 --- a/src/leo/class01/BSNear.java +++ b/leo/class01_01/BSNear.java @@ -1,4 +1,4 @@ -package leo.class01; +package leo.class01_01; import leo.util.ArrayUtil; diff --git a/src/leo/class01/BubbleSort.java b/leo/class01_01/BubbleSort.java similarity index 99% rename from src/leo/class01/BubbleSort.java rename to leo/class01_01/BubbleSort.java index 0d6b20a..df42f8f 100644 --- a/src/leo/class01/BubbleSort.java +++ b/leo/class01_01/BubbleSort.java @@ -1,4 +1,4 @@ -package leo.class01; +package leo.class01_01; import leo.util.ArrayUtil; diff --git a/src/leo/class01/InsertionSort.java b/leo/class01_01/InsertionSort.java similarity index 99% rename from src/leo/class01/InsertionSort.java rename to leo/class01_01/InsertionSort.java index 978508f..79b704e 100644 --- a/src/leo/class01/InsertionSort.java +++ b/leo/class01_01/InsertionSort.java @@ -1,4 +1,4 @@ -package leo.class01; +package leo.class01_01; import leo.util.ArrayUtil; diff --git a/src/leo/class01/SelectionSort.java b/leo/class01_01/SelectionSort.java similarity index 99% rename from src/leo/class01/SelectionSort.java rename to leo/class01_01/SelectionSort.java index ad40f23..22b5f11 100644 --- a/src/leo/class01/SelectionSort.java +++ b/leo/class01_01/SelectionSort.java @@ -1,4 +1,4 @@ -package leo.class01; +package leo.class01_01; import leo.util.ArrayUtil; diff --git a/src/leo/class01/EvenTimesOddTimes.java b/leo/class01_02/EvenTimesOddTimes.java similarity index 98% rename from src/leo/class01/EvenTimesOddTimes.java rename to leo/class01_02/EvenTimesOddTimes.java index 39b1df4..d83147f 100644 --- a/src/leo/class01/EvenTimesOddTimes.java +++ b/leo/class01_02/EvenTimesOddTimes.java @@ -1,8 +1,4 @@ -package leo.class01; - -import sun.applet.Main; - -import java.nio.ByteOrder; +package leo.class01_02; /** * @author Leo diff --git a/src/leo/class01/KM.java b/leo/class01_02/KM.java similarity index 99% rename from src/leo/class01/KM.java rename to leo/class01_02/KM.java index 72a83be..26b7e96 100644 --- a/src/leo/class01/KM.java +++ b/leo/class01_02/KM.java @@ -1,4 +1,4 @@ -package leo.class01; +package leo.class01_02; import java.util.HashMap; import java.util.HashSet; diff --git a/src/leo/class02/DeleteGivenValue.java b/leo/class02_03/DeleteGivenValue.java similarity index 99% rename from src/leo/class02/DeleteGivenValue.java rename to leo/class02_03/DeleteGivenValue.java index f01f52c..33e6f35 100644 --- a/src/leo/class02/DeleteGivenValue.java +++ b/leo/class02_03/DeleteGivenValue.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; /** * @author Leo diff --git a/src/leo/class02/GetMax.java b/leo/class02_03/GetMax.java similarity index 98% rename from src/leo/class02/GetMax.java rename to leo/class02_03/GetMax.java index ab508ed..a7053bc 100644 --- a/src/leo/class02/GetMax.java +++ b/leo/class02_03/GetMax.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; import leo.util.ArrayUtil; diff --git a/src/leo/class02/GetMinStack.java b/leo/class02_03/GetMinStack.java similarity index 99% rename from src/leo/class02/GetMinStack.java rename to leo/class02_03/GetMinStack.java index a433fbb..c32f4c3 100644 --- a/src/leo/class02/GetMinStack.java +++ b/leo/class02_03/GetMinStack.java @@ -1,6 +1,4 @@ -package leo.class02; - -import jdk.nashorn.internal.ir.IfNode; +package leo.class02_03; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/leo/class02/LinkedList.java b/leo/class02_03/LinkedList.java similarity index 99% rename from src/leo/class02/LinkedList.java rename to leo/class02_03/LinkedList.java index a44cf98..44f1b09 100644 --- a/src/leo/class02/LinkedList.java +++ b/leo/class02_03/LinkedList.java @@ -1,6 +1,5 @@ -package leo.class02; +package leo.class02_03; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; diff --git a/src/leo/class02/RingArray.java b/leo/class02_03/RingArray.java similarity index 99% rename from src/leo/class02/RingArray.java rename to leo/class02_03/RingArray.java index 0602b4c..e2a0029 100644 --- a/src/leo/class02/RingArray.java +++ b/leo/class02_03/RingArray.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; import java.util.Queue; diff --git a/src/leo/class02/StackAndQueue.java b/leo/class02_03/StackAndQueue.java similarity index 99% rename from src/leo/class02/StackAndQueue.java rename to leo/class02_03/StackAndQueue.java index 0488c8c..d03ce7b 100644 --- a/src/leo/class02/StackAndQueue.java +++ b/leo/class02_03/StackAndQueue.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; import java.util.LinkedList; import java.util.Queue; diff --git a/src/leo/class02/TwoQueueImplementStack.java b/leo/class02_03/TwoQueueImplementStack.java similarity index 99% rename from src/leo/class02/TwoQueueImplementStack.java rename to leo/class02_03/TwoQueueImplementStack.java index da10c32..1e58ce1 100644 --- a/src/leo/class02/TwoQueueImplementStack.java +++ b/leo/class02_03/TwoQueueImplementStack.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; import java.util.LinkedList; import java.util.Queue; diff --git a/src/leo/class02/TwoStacksImplementQueue.java b/leo/class02_03/TwoStacksImplementQueue.java similarity index 99% rename from src/leo/class02/TwoStacksImplementQueue.java rename to leo/class02_03/TwoStacksImplementQueue.java index 627e651..564d7d7 100644 --- a/src/leo/class02/TwoStacksImplementQueue.java +++ b/leo/class02_03/TwoStacksImplementQueue.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class02_03; import java.util.LinkedList; import java.util.Queue; diff --git a/src/leo/class02/BiggerThanRightTwice.java b/leo/class03_04/BiggerThanRightTwice.java similarity index 99% rename from src/leo/class02/BiggerThanRightTwice.java rename to leo/class03_04/BiggerThanRightTwice.java index dc9e4c2..44f0f92 100644 --- a/src/leo/class02/BiggerThanRightTwice.java +++ b/leo/class03_04/BiggerThanRightTwice.java @@ -1,6 +1,4 @@ -package leo.class02; - -import java.util.function.IntPredicate; +package leo.class03_04; /** * @author Leo diff --git a/src/leo/class02/MergeSort.java b/leo/class03_04/MergeSort.java similarity index 99% rename from src/leo/class02/MergeSort.java rename to leo/class03_04/MergeSort.java index 5994240..25cb434 100644 --- a/src/leo/class02/MergeSort.java +++ b/leo/class03_04/MergeSort.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class03_04; import leo.util.ArrayUtil; diff --git a/src/leo/class02/ReversePair.java b/leo/class03_04/ReversePair.java similarity index 99% rename from src/leo/class02/ReversePair.java rename to leo/class03_04/ReversePair.java index 77345c0..8c94917 100644 --- a/src/leo/class02/ReversePair.java +++ b/leo/class03_04/ReversePair.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class03_04; import leo.util.ArrayUtil; diff --git a/src/leo/class02/SmallSum.java b/leo/class03_04/SmallSum.java similarity index 99% rename from src/leo/class02/SmallSum.java rename to leo/class03_04/SmallSum.java index 252da90..bcc0ebd 100644 --- a/src/leo/class02/SmallSum.java +++ b/leo/class03_04/SmallSum.java @@ -1,4 +1,4 @@ -package leo.class02; +package leo.class03_04; import leo.util.ArrayUtil; diff --git a/src/leo/class03/CountOfRangeSum.java b/leo/class03_05/CountOfRangeSum.java similarity index 85% rename from src/leo/class03/CountOfRangeSum.java rename to leo/class03_05/CountOfRangeSum.java index a526495..e3a1429 100644 --- a/src/leo/class03/CountOfRangeSum.java +++ b/leo/class03_05/CountOfRangeSum.java @@ -1,4 +1,4 @@ -package leo.class03; +package leo.class03_05; import leo.util.ArrayUtil; @@ -263,6 +263,7 @@ class CountOfRangeSum3{ } + class CountOfRangeSum4 { public static int countRangeSum(int[] nums, int lower, int upper) { @@ -328,6 +329,70 @@ class CountOfRangeSum4 { } +class CountOfRangeSum5 { + public static int countRangeSum(int[] num, int lower, int upper) { + if (num.length == 0 || num == null) { + return 0; + } + long[] sum = new long[num.length]; + sum[0] = num[0]; + for (int i = 1; i < num.length; i++) { + sum[i] = sum[i - 1] + num[i]; + } + return process(sum, 0, sum.length - 1,lower,upper); + } + + public static int process(long[] sum, int l, int r, int lower, int upper) { + if (l > r) { + return 0; + } + if (l == r) { + return sum[l] >= lower && sum[l] <= upper ? 1 : 0; + } + int m = l + ((r - l) >> 1); + return process(sum, l, m, lower, upper) + process(sum, m + 1, r, lower, upper) + merge(sum, l, m, r, lower, upper); + } + + private static int merge(long[] sum, int l, int m, int r, int lower, int upper) { + + int windowR = l; + int windowL = l; + int index = m + 1; + int res = 0; + while (index <= r) { + long max = sum[index] - lower; + long min = sum[index] - upper; + while (windowR <= r && sum[windowR] <= max) { + windowR++; + } + while (windowL < r && sum[windowL] < min) { + windowL++; + } + index++; + res += windowR - windowL; + } + int p1 = l; + int p2 = m+1; + long[] help = new long[r - l + 1]; + int i = 0; + while (p1 <= m && p2 <= r) { + help[i++] = sum[p1] <= sum[p2] ? sum[p1++] : sum[p2++]; + } + while (p1 <= m) { + help[i++] = sum[p1++]; + } + while (p2 <= r) { + help[i++] = sum[p2++]; + } + + for (i = 0; i < help.length; i++) { + sum[l + i] = help[i]; + } + return res; + } + +} + class MainTest{ public static int countRangeSum(int[] nums, int lower, int upper) { diff --git a/src/leo/class03/QuickSort1.java b/leo/class03_05/QuickSort1.java similarity index 90% rename from src/leo/class03/QuickSort1.java rename to leo/class03_05/QuickSort1.java index 594d2ce..4a2adc2 100644 --- a/src/leo/class03/QuickSort1.java +++ b/leo/class03_05/QuickSort1.java @@ -1,12 +1,9 @@ -package leo.class03; +package leo.class03_05; -import com.sun.org.apache.bcel.internal.generic.POP2; -import com.sun.xml.internal.bind.v2.model.core.ID; import leo.util.ArrayUtil; import java.util.Arrays; import java.util.Stack; -import java.util.function.IntPredicate; /** * @author Leo @@ -363,6 +360,55 @@ class QuickSort3_3{ } } +class QuickSort3_4{ + + public static void quickSort(int[] arr) { + if (arr.length < 2 || arr == null) { + return; + } + process(arr, 0, arr.length - 1); + } + + public static void process(int[] arr, int l, int r) { + if (l >= r) { + return; + } + int[] equalArea = partition(arr, l, r); + process(arr, l, equalArea[0] - 1); + process(arr, equalArea[0] + 1, r); + } + + private static int[] partition(int[] arr, int l, int r) { + + int leftIndex = l - 1; + int rightIndex = r; + int index = l; + while (index < rightIndex) { + if (arr[index] == arr[r]) { + index++; + } else if (arr[index] > arr[r]) { + swap(arr, index, --rightIndex); + } else if (arr[index] < arr[r]) { + swap(arr, index++, ++leftIndex); + } + } + swap(arr, r, rightIndex); + return new int[]{leftIndex + 1, rightIndex}; + + + } + + public static void swap(int[] arr, int i, int j) { + if (i == j || arr[i] == arr[j]) { + return; + } + arr[i] = arr[i] ^ arr[j]; + arr[j] = arr[i] ^ arr[j]; + arr[i] = arr[i] ^ arr[j]; + } + +} + class QuickSortUnRecursive{ private static class Op { @@ -452,7 +498,7 @@ class TestMain { for (int i = 0; i < testTimes; i++) { int[] arr = ArrayUtil.randomArray(sizeMax, range); int[] copyArray = ArrayUtil.copyArray(arr); - QuickSort3_3.quickSort(arr); + QuickSort3_4.quickSort(arr); Arrays.sort(copyArray); if (!ArrayUtil.isEqual(arr, copyArray)) { ArrayUtil.printArr(arr); diff --git a/src/leo/class03/Comparator.java b/leo/class04_06/Comparator.java similarity index 97% rename from src/leo/class03/Comparator.java rename to leo/class04_06/Comparator.java index 079f952..d228264 100644 --- a/src/leo/class03/Comparator.java +++ b/leo/class04_06/Comparator.java @@ -1,4 +1,4 @@ -package leo.class03; +package leo.class04_06; /** * @author Leo diff --git a/src/leo/class03/HeapSort.java b/leo/class04_06/HeapSort.java similarity index 97% rename from src/leo/class03/HeapSort.java rename to leo/class04_06/HeapSort.java index 40ccf7c..9cfda81 100644 --- a/src/leo/class03/HeapSort.java +++ b/leo/class04_06/HeapSort.java @@ -1,8 +1,7 @@ -package leo.class03; +package leo.class04_06; import leo.util.ArrayUtil; -import java.lang.reflect.Array; import java.util.Arrays; /** diff --git a/src/leo/class03/MyMaxHeap.java b/leo/class04_06/MyMaxHeap.java similarity index 99% rename from src/leo/class03/MyMaxHeap.java rename to leo/class04_06/MyMaxHeap.java index 9614579..fcc9390 100644 --- a/src/leo/class03/MyMaxHeap.java +++ b/leo/class04_06/MyMaxHeap.java @@ -1,4 +1,4 @@ -package leo.class03; +package leo.class04_06; import java.util.PriorityQueue; diff --git a/src/leo/class03/SortArrayDistanceLessK.java b/leo/class04_06/SortArrayDistanceLessK.java similarity index 82% rename from src/leo/class03/SortArrayDistanceLessK.java rename to leo/class04_06/SortArrayDistanceLessK.java index f290fd8..3e18f5c 100644 --- a/src/leo/class03/SortArrayDistanceLessK.java +++ b/leo/class04_06/SortArrayDistanceLessK.java @@ -1,4 +1,4 @@ -package leo.class03; +package leo.class04_06; import leo.util.ArrayUtil; @@ -34,6 +34,7 @@ public class SortArrayDistanceLessK { } } + } class SortArrayDistanceLessK1 { @@ -60,6 +61,29 @@ class SortArrayDistanceLessK1 { } +class SortArrayDistanceLessK2{ + public static void sortArrayDistanceLessK(int[] arr, int k) { + if (k == 0) { + return; + } + int index = 0; + + PriorityQueue queue = new PriorityQueue<>(); + for (; index < Math.min(arr.length - 1, k - 1); index++) { + queue.add(arr[index]); + } + int i = 0; + for (; index < arr.length; index++, i++) { + queue.add(arr[index]); + arr[i] = queue.poll(); + } + while (!queue.isEmpty()) { + arr[i++] = queue.poll(); + } + } + +} + class MainK { @@ -77,7 +101,7 @@ class MainK { UpsetArray(arr, k); int[] copyArray = ArrayUtil.copyArray(arr); Arrays.sort(copyArray); - SortArrayDistanceLessK1.sortArrayDistanceLessK(arr,k); + SortArrayDistanceLessK2.sortArrayDistanceLessK(arr,k); if (!ArrayUtil.isEqual(arr, copyArray)) { ArrayUtil.printArr(arr); ArrayUtil.printArr(copyArray); diff --git a/src/leo/class04/CoverMax.java b/leo/class04_07/CoverMax.java similarity index 60% rename from src/leo/class04/CoverMax.java rename to leo/class04_07/CoverMax.java index e53cfb5..5883875 100644 --- a/src/leo/class04/CoverMax.java +++ b/leo/class04_07/CoverMax.java @@ -1,4 +1,4 @@ -package leo.class04; +package leo.class04_07; import java.util.Arrays; import java.util.Comparator; @@ -66,6 +66,93 @@ public class CoverMax { } +class CoverMax1 { + public static class Line { + private int start; + private int end; + + public Line(int s, int e) { + this.start = s; + this.end = e; + } + } + + public static class StartAscComparator implements Comparator { + + + @Override + public int compare(Line o1, Line o2) { + return o1.start - o2.start; + } + } + + public static int maxCover(int[][] arr) { + if (arr.length == 0 || arr == null) { + return 0; + } + Line[] lines = new Line[arr.length]; + for (int i = 0; i < arr.length; i++) { + lines[i] = new Line(arr[i][0], arr[i][1]); + } + Arrays.sort(lines, new StartAscComparator()); + PriorityQueue queue = new PriorityQueue<>(); + int max = 0; + for (int i = 0; i { + + @Override + public int compare (Line o1,Line o2){ + return o1.start - o2.start; + } + } + + public static int maxCover(int[][] arr) { + + if (arr.length == 0 || arr == null) { + return 0; + } + Line[] lines = new Line[arr.length]; + for (int i = 0; i < arr.length; i++) { + lines[i] = new Line(arr[i][0], arr[i][1]); + } + Arrays.sort(lines, new StartComparator()); + PriorityQueue queue = new PriorityQueue<>(); + int max = 0; + for (int i = 0; i < lines.length; i++) { + if (!queue.isEmpty() && queue.peek() <= lines[i].start) { + queue.poll(); + } + queue.add(lines[i].end); + max = Math.max(max, queue.size()); + } + return max; + } + +} + class CoverMaxForTest{ public static int maxCover(int[][] arr) { @@ -102,7 +189,7 @@ class CoverMaxMain { for (int i = 0; i < testTime; i++) { int[][] lines = generateLines(sizeMax, L, R); - int max = CoverMax.maxCover(lines); + int max = CoverMax2.maxCover(lines); int maxForTest = CoverMaxForTest.maxCover(lines); if (max != maxForTest) { System.out.println("max : " + max + " maxForTest : " + maxForTest); diff --git a/src/leo/class04/EveryStepShowBoss.java b/leo/class04_07/EveryStepShowBoss.java similarity index 85% rename from src/leo/class04/EveryStepShowBoss.java rename to leo/class04_07/EveryStepShowBoss.java index d42b65b..1f83036 100644 --- a/src/leo/class04/EveryStepShowBoss.java +++ b/leo/class04_07/EveryStepShowBoss.java @@ -1,4 +1,4 @@ -package leo.class04; +package leo.class04_07; /** * @author Leo diff --git a/src/leo/class04/HeapGreater.java b/leo/class04_07/HeapGreater.java similarity index 99% rename from src/leo/class04/HeapGreater.java rename to leo/class04_07/HeapGreater.java index 8f7a84e..cc63c66 100644 --- a/src/leo/class04/HeapGreater.java +++ b/leo/class04_07/HeapGreater.java @@ -1,4 +1,4 @@ -package leo.class04; +package leo.class04_07; import java.util.ArrayList; import java.util.Comparator; diff --git a/leo/class05_08/Code01_TrieTree.java b/leo/class05_08/Code01_TrieTree.java new file mode 100644 index 0000000..2ec7f79 --- /dev/null +++ b/leo/class05_08/Code01_TrieTree.java @@ -0,0 +1,299 @@ +package leo.class05_08; + +import java.util.HashMap; + +// 该程序的对数器跑不过,你能发现bug在哪吗? +public class Code01_TrieTree { + + public static class Node1 { + public int pass; + public int end; + public Node1[] nexts; + + public Node1() { + pass = 0; + end = 0; + nexts = new Node1[26]; + } + } + + public static class Trie1 { + private Node1 root; + + public Trie1() { + root = new Node1(); + } + + public void insert(String word) { + if (word == null) { + return; + } + char[] chs = word.toCharArray(); + Node1 node = root; + node.pass++; + int index = 0; + for (int i = 0; i < chs.length; i++) { // 从左往右遍历字符 + index = chs[i] - 'a'; // 由字符,对应成走向哪条路 + if (node.nexts[index] == null) { + node.nexts[index] = new Node1(); + } + node = node.nexts[index]; + node.pass++; + } + node.end++; + } + + public void delete(String word) { + if (search(word) != 0) { + char[] chs = word.toCharArray(); + Node1 node = root; + node.pass--; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = chs[i] - 'a'; + if (--node.nexts[index].pass == 0) { + node.nexts[index] = null; + return; + } + node = node.nexts[index]; + } + node.end--; + } + } + + // word这个单词之前加入过几次 + public int search(String word) { + if (word == null) { + return 0; + } + char[] chs = word.toCharArray(); + Node1 node = root; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = chs[i] - 'a'; + if (node.nexts[index] == null) { + return 0; + } + node = node.nexts[index]; + } + return node.end; + } + + // 所有加入的字符串中,有几个是以pre这个字符串作为前缀的 + public int prefixNumber(String pre) { + if (pre == null) { + return 0; + } + char[] chs = pre.toCharArray(); + Node1 node = root; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = chs[i] - 'a'; + if (node.nexts[index] == null) { + return 0; + } + node = node.nexts[index]; + } + return node.pass; + } + } + + public static class Node2 { + public int pass; + public int end; + public HashMap nexts; + + public Node2() { + pass = 0; + end = 0; + nexts = new HashMap<>(); + } + } + + public static class Trie2 { + private Node2 root; + + public Trie2() { + root = new Node2(); + } + + public void insert(String word) { + if (word == null) { + return; + } + char[] chs = word.toCharArray(); + Node2 node = root; + node.pass++; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = (int) chs[i]; + if (!node.nexts.containsKey(index)) { + node.nexts.put(index, new Node2()); + } + node = node.nexts.get(index); + node.pass++; + } + node.end++; + } + + public void delete(String word) { + if (search(word) != 0) { + char[] chs = word.toCharArray(); + Node2 node = root; + node.pass--; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = (int) chs[i]; + if (--node.nexts.get(index).pass == 0) { + node.nexts.remove(index); + return; + } + node = node.nexts.get(index); + } + node.end--; + } + } + + // word这个单词之前加入过几次 + public int search(String word) { + if (word == null) { + return 0; + } + char[] chs = word.toCharArray(); + Node2 node = root; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = (int) chs[i]; + if (!node.nexts.containsKey(index)) { + return 0; + } + node = node.nexts.get(index); + } + return node.end; + } + + // 所有加入的字符串中,有几个是以pre这个字符串作为前缀的 + public int prefixNumber(String pre) { + if (pre == null) { + return 0; + } + char[] chs = pre.toCharArray(); + Node2 node = root; + int index = 0; + for (int i = 0; i < chs.length; i++) { + index = (int) chs[i]; + if (!node.nexts.containsKey(index)) { + return 0; + } + node = node.nexts.get(index); + } + return node.pass; + } + } + + public static class Right { + + private HashMap box; + + public Right() { + box = new HashMap<>(); + } + + public void insert(String word) { + if (!box.containsKey(word)) { + box.put(word, 1); + } else { + box.put(word, box.get(word) + 1); + } + } + + public void delete(String word) { + if (box.containsKey(word)) { + if (box.get(word) == 1) { + box.remove(word); + } else { + box.put(word, box.get(word) - 1); + } + } + } + + public int search(String word) { + if (!box.containsKey(word)) { + return 0; + } else { + return box.get(word); + } + } + + public int prefixNumber(String pre) { + int count = 0; + for (String cur : box.keySet()) { + if (cur.startsWith(pre)) { + count+= box.get(cur); +// count++; + } + } + return count; + } + } + + // for test + public static String generateRandomString(int strLen) { + char[] ans = new char[(int) (Math.random() * strLen) + 1]; + for (int i = 0; i < ans.length; i++) { + int value = (int) (Math.random() * 6); + ans[i] = (char) (97 + value); + } + return String.valueOf(ans); + } + + // for test + public static String[] generateRandomStringArray(int arrLen, int strLen) { + String[] ans = new String[(int) (Math.random() * arrLen) + 1]; + for (int i = 0; i < ans.length; i++) { + ans[i] = generateRandomString(strLen); + } + return ans; + } + + public static void main(String[] args) { + int arrLen = 10; + int strLen = 4; + int testTimes = 100000; + for (int i = 0; i < testTimes; i++) { + String[] arr = generateRandomStringArray(arrLen, strLen); + Trie1 trie1 = new Trie1(); + Trie2 trie2 = new Trie2(); + Right right = new Right(); + for (int j = 0; j < arr.length; j++) { + double decide = Math.random(); + if (decide < 0.25) { + trie1.insert(arr[j]); + trie2.insert(arr[j]); + right.insert(arr[j]); + } else if (decide < 0.5) { + trie1.delete(arr[j]); + trie2.delete(arr[j]); + right.delete(arr[j]); + } else if (decide < 0.75) { + int ans1 = trie1.search(arr[j]); + int ans2 = trie2.search(arr[j]); + int ans3 = right.search(arr[j]); + if (ans1 != ans2 || ans2 != ans3) { + System.out.println("Oops!"); + } + } else { + int ans1 = trie1.prefixNumber(arr[j]); + int ans2 = trie2.prefixNumber(arr[j]); + int ans3 = right.prefixNumber(arr[j]); + if (ans1 != ans2 || ans2 != ans3) { + System.out.println("Oops!"); + } + } + } + } + System.out.println("finish!"); + + } + +} diff --git a/leo/class05_08/TrieTree.java b/leo/class05_08/TrieTree.java new file mode 100644 index 0000000..839777e --- /dev/null +++ b/leo/class05_08/TrieTree.java @@ -0,0 +1,105 @@ +package leo.class05_08; + +/** + * @author Leo + * @ClassName TrieTree + * @DATE 2020/12/1 5:06 下午 + * @Description 前缀树 + */ +class TrieTree { + + public class Node{ + int pass; + int end; + Node[] next; + + public Node() { + this.pass = 0; + this.end = 0; + this.next = new Node[26]; + } + } + + private Node root; + + public TrieTree() { + this.root = new Node(); + } + + public void insert(String word) { + if (word == null) { + return; + } + char[] str = word.toCharArray(); + int path; + Node node = this.root; + node.pass++; + for (int i = 0; i < str.length; i++) { + path = str[i] - 'a'; + if (node.next[path] == null) { + node.next[path] = new Node(); + } + node.pass++; + node = node.next[path]; + } + node.end++; + } + + public void delete(String word) { + if (search(word) == 0) { + return; + } + char[] chars = word.toCharArray(); + Node node = this.root; + node.pass--; + int path; + for (int i = 0; i < chars.length; i++) { + path = chars[i] - 'a'; + if (--node.next[path].pass == 0) { + node.next[path] = null; + return; + } + node = node.next[path]; + + } + node.end--; + + } + + public int search(String word) { + if (word == null || "".equals(word.trim())) { + return 0; + } + char[] chars = word.toCharArray(); + Node node = this.root; + int path; + for (int i = 0; i < chars.length; i++) { + path = chars[i] - 'a'; + if (node.next[path] == null) { + return 0; + } + node = node.next[path]; + } + return node.end; + } + + public int prefixNumber(String word) { + + if (word == null || "".equals(word.trim())) { + return 0; + } + Node node = this.root; + char[] chars = word.toCharArray(); + int path; + for (int i = 0; i < chars.length; i++) { + path = chars[i] - 'a'; + if (node.next[path] == null) { + return 0; + } + node = node.next[path]; + } + + return node.pass; + } + +} diff --git a/src/leo/util/ArrayUtil.java b/leo/util/ArrayUtil.java similarity index 100% rename from src/leo/util/ArrayUtil.java rename to leo/util/ArrayUtil.java