From 7272b745a88b186ac61627d2bc2685040a7fc849 Mon Sep 17 00:00:00 2001 From: sanwuhong Date: Sat, 5 Nov 2022 16:57:06 +0800 Subject: [PATCH] update toc --- README.md | 2 + src/main/java/com/design/COMMENT-SYSTEM.md | 3 + src/main/java/com/design/NCOV-SYSTEM.md | 2 + src/main/java/com/test/Solution.java | 55 +++++ src/main/java/com/test/TestSort.java | 231 +++++---------------- src/main/java/com/toc/ALGORITHM.md | 43 +++- src/main/java/com/toc/JVM.md | 6 +- src/main/java/com/toc/THREAD.md | 4 +- 8 files changed, 148 insertions(+), 198 deletions(-) create mode 100644 src/main/java/com/design/COMMENT-SYSTEM.md create mode 100644 src/main/java/com/design/NCOV-SYSTEM.md create mode 100644 src/main/java/com/test/Solution.java diff --git a/README.md b/README.md index d54a5dd..91b7698 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ - [本地缓存设计](/src/main/java/com/toc/LOCALCACHE.md) - [pvuv设计](/src/main/java/com/toc/PVUV_DESIGN.md) - [基于Feed流系统设计](/src/main/java/com/toc/PVUV_DESIGN.md) +- [评论系统](/src/main/java/com/toc/COMMENT-SYSTEM.md) +- [核酸系统](/src/main/java/com/toc/NCOV-SYSTEM.md) 拓展设计: - [接口设计](/src/main/java/com/toc/INTERFACE_DESIGN.md) diff --git a/src/main/java/com/design/COMMENT-SYSTEM.md b/src/main/java/com/design/COMMENT-SYSTEM.md new file mode 100644 index 0000000..303dea2 --- /dev/null +++ b/src/main/java/com/design/COMMENT-SYSTEM.md @@ -0,0 +1,3 @@ +# 评论系统设计 + +[如何设计评论系统](https://zhuanlan.zhihu.com/p/455199524) \ No newline at end of file diff --git a/src/main/java/com/design/NCOV-SYSTEM.md b/src/main/java/com/design/NCOV-SYSTEM.md new file mode 100644 index 0000000..4cdb6f8 --- /dev/null +++ b/src/main/java/com/design/NCOV-SYSTEM.md @@ -0,0 +1,2 @@ +# 核酸系统 +[假如我是核酸系统架构师](https://mp.weixin.qq.com/s/s2Q0qVYzB6oIz2VoVmnR8A) \ No newline at end of file diff --git a/src/main/java/com/test/Solution.java b/src/main/java/com/test/Solution.java new file mode 100644 index 0000000..30e9ce3 --- /dev/null +++ b/src/main/java/com/test/Solution.java @@ -0,0 +1,55 @@ +package com.test; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +public class Solution { + + public static void main(String[] args) { + System.out.println(solution(5)); + } + + private static int solution(int N) { + if(N> 45) { + return -1; + } + if (N>=0 && N<=9) { + return N; + } + List combineList = new LinkedList<>(); + for(int i = 1;i<=9;i++) { + int start = i; + int target = N; + List combine = new LinkedList<>(); + while(target>0 && start<=9) { + combine.add(start); + target-=start; + if(target<0 || targetstart && target<=9) { + combine.add(target); + combineList.add(combine.size()); + combine.remove(combine.size()-1); + } + start++; + } + } + int res = 0; + for(Integer tmp : combineList) { + res+= countCombine(tmp); + } + return res; + } + + private static int countCombine(int n) { + int res = 1; + while(n>0) { + res *=n; + n--; + } + return res; + } +} diff --git a/src/main/java/com/test/TestSort.java b/src/main/java/com/test/TestSort.java index 1ba2240..967b997 100644 --- a/src/main/java/com/test/TestSort.java +++ b/src/main/java/com/test/TestSort.java @@ -1,5 +1,6 @@ package com.test; +import java.util.Arrays; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -9,233 +10,97 @@ public class TestSort { public static void main(String[] args) throws InterruptedException { - ReentrantLock lock = new ReentrantLock(); - Condition condition1 = lock.newCondition(); - Condition condition2 = lock.newCondition(); - Condition condition3 = lock.newCondition(); - Thread thread = new Thread(runnable(lock, condition1, condition2, "A")); - thread.setName("AAA"); - Thread thread1 = new Thread(runnable(lock, condition2, condition3, "B")); - thread1.setName("BBB"); - Thread thread2 = new Thread(runnable(lock, condition3, condition1, "C")); - thread2.setName("CCC"); - thread.start(); - thread1.start(); - thread2.start(); - - lock.lock(); - condition1.signal(); - lock.unlock(); - - TimeUnit.SECONDS.sleep(10); + int[] array = {3, 1, 2, 2, 2, 5, 7, 23, 123, 45, 2, 15, 12}; + heapSort(array); + System.out.println(Arrays.toString(array)); } - private static Runnable runnable(ReentrantLock lock, Condition waitCondition, Condition signCondition, String msg) { - Runnable runnable = () -> { - try { - lock.lock(); - while (!Thread.currentThread().isInterrupted()) { - waitCondition.await(); - TimeUnit.MILLISECONDS.sleep(50); - System.out.println(msg); - signCondition.signal(); - } - } catch (InterruptedException e) { - System.out.println("asdfasdf" + e); - } finally { - lock.unlock(); - } - }; - return runnable; - } - - public static void heapsort(int[] nums) { + private static void heapSort(int[] nums) { int len = nums.length; - for (int i = len / 2 - 1; i >= 0; i--) { + for (int i = len/2+1; i >=0; i--) { adjustHeap(nums, i, len); } - for (int j = len - 1; j > 0; j--) { + for (int j = len-1; j >=0; j--) { swap(nums, 0, j); adjustHeap(nums, 0, j); } } - private static void adjustHeap(int[] nums, int i, int len) { + private static void adjustHeap(int[] nums, int i, int len) { int tmp = nums[i]; - for (int j = 2 * i + 1; j < len; j = j * 2 + 1) { - if (j + 1 < len && nums[j + 1] > nums[j]) { - j = j + 1; + for (int k = 2*i+1; k < len; k = 2*k+1) { + if (k+1nums[k]) { + k++; } - if (nums[j] > tmp) { - nums[i] = nums[j]; - i = j; - } else { - break; + if(nums[k] > tmp) { + nums[i] = nums[k]; + i = k; } } nums[i] = tmp; } - public static void redisSort(int[] nums) { - int max = Integer.MIN_VALUE; - for (int num : nums) { - max = Math.max(num, max); - } - LinkedList[] bucket = new LinkedList[10]; -// Arrays.fill(bucket, new LinkedList()); - for (int i = 0; i < bucket.length; i++) { - bucket[i] = new LinkedList<>(); - } - int len = String.valueOf(max).length(); - - int mod = 10; - int div = 1; - for (int i = 1; i <= len; i++, mod *= 10, div *= 10) { - for (int num : nums) { - int cur = (num % mod) / div; - bucket[cur].add(num); - } - int idx = 0; - for (int j = 0; j < 10; j++) { - LinkedList list = bucket[j]; - for (Integer num : list) { - nums[idx++] = num; - } - list.clear(); - } - } - } - - public static int[] mergeSort(int[] nums, int start, int end) { - if (start > end) { - return new int[0]; - } - if (start == end) { - return new int[]{nums[start]}; - } - int mid = (end - start) / 2 + start; - int[] left = mergeSort(nums, start, mid); - int[] right = mergeSort(nums, mid + 1, end); - int i = 0, j = 0, idx = 0; - int[] res = new int[left.length + right.length]; - while (i < left.length && j < right.length) { - res[idx++] = left[i] <= right[j] ? left[i++] : right[j++]; - } - while (i < left.length) { - res[idx++] = left[i++]; - } - while (j < right.length) { - res[idx++] = right[j++]; - } - return res; - } - - public static void countSort(int[] nums) { - int min = Integer.MAX_VALUE; - int max = Integer.MIN_VALUE; - for (int num : nums) { - min = Math.min(num, min); - max = Math.max(num, max); - } - int[] site = new int[max - min + 1]; - for (int num : nums) { - site[num - min]++; - } - int index = 0; - for (int i = 0; i < site.length; i++) { - while (site[i] > 0) { - nums[index] = i + min; - index++; - site[i]--; - } - } - } - - public static void bubbleSort(int[] nums) { + private static void bubbleSort(int[] nums) { int len = nums.length; - for (int i = len - 1; i >= 0; i--) { + for(int i = len-1;i>=0;i--){ for (int j = 0; j < i; j++) { - if (nums[j] > nums[j + 1]) { - swap(nums, j, j + 1); + if(nums[j]>nums[j+1]) { + swap(nums, j, j+1); } } } } - public static void insertSort(int[] nums) { - int len = nums.length; - for (int i = 1; i < len; i++) { - for (int j = i; j > 0; j--) { - if (nums[j - 1] > nums[j]) { - swap(nums, j - 1, j); - } - } + private static void quickSort2(int[] nums, int left, int right) { + if (left > right) { + return; } + int[] p = partition2(nums, left, right); + quickSort2(nums, left, p[0]); + quickSort2(nums, p[1], right); } - public static void selectionSort(int[] nums) { - int len = nums.length; - for (int i = len - 1; i > 0; i--) { - int maxIdx = i; - for (int j = 0; j < i; j++) { - if (nums[j] > nums[maxIdx]) { - maxIdx = j; - } + private static int[] partition2(int[] nums, int left, int right) { + int pivot = nums[left]; + int i = left - 1, j = right + 1; + int p = left; + while (p < j) { + if (nums[p] > pivot) { + swap(nums, --j, p); + } else if (nums[p] < pivot) { + swap(nums, ++i, p); + p++; + } else { + p++; } - swap(nums, maxIdx, i); } + return new int[]{i, j}; } - public static void quicksort(int[] nums, int start, int end) { - if (start > end) { + private static void quickSort(int[] nums, int left, int right) { + if (left > right) { return; } - int site = partition(nums, start, end); - quicksort(nums, start, site - 1); - quicksort(nums, site + 1, end); + int p = partition(nums, left, right); + quickSort(nums, left, p - 1); + quickSort(nums, p + 1, right); } - public static int partition(int[] nums, int start, int end) { - int i = start, j = end; - int site = nums[start]; + private static int partition(int[] nums, int left, int right) { + int pivot = nums[left]; + int i = left, j = right; while (i < j) { - while (i < j && nums[j] >= site) j--; - while (i < j && nums[i] <= site) i++; + while (i < j && nums[j] >= pivot) j--; + while (i < j && nums[i] <= pivot) i++; if (i < j) { swap(nums, i, j); } } - swap(nums, i, start); + swap(nums, i, left); return i; } - public static void quicksort2(int[] nums, int start, int end) { - if (start > end) { - return; - } - int[] sites = partition2(nums, start, end); - quicksort2(nums, start, sites[0]); - quicksort(nums, sites[1], end); - } - - public static int[] partition2(int[] nums, int start, int end) { - int i = start - 1, j = end + 1; - int site = nums[start]; - int index = 0; - while (index < j) { - if (nums[index] > site) { - swap(nums, index, --j); - } else if (nums[index] < site) { - swap(nums, index, ++i); - index++; - } else { - index++; - } - } - return new int[]{i, j}; - } - private static void swap(int[] nums, int i, int j) { int tmp = nums[i]; nums[i] = nums[j]; diff --git a/src/main/java/com/toc/ALGORITHM.md b/src/main/java/com/toc/ALGORITHM.md index 259dae1..3879647 100644 --- a/src/main/java/com/toc/ALGORITHM.md +++ b/src/main/java/com/toc/ALGORITHM.md @@ -81,11 +81,12 @@  17. KMP18. 其他   18.1. 前缀和 -  18.2. 求余数常见操作 -  18.3. Kanade 算法 -  18.4. 约瑟夫环问题 -  18.5. 拒绝采样 -  18.6. 字典序 +  18.2. 素数 +  18.3. 求余数常见操作 +  18.4. Kanade 算法 +  18.5. 约瑟夫环问题 +  18.6. 拒绝采样 +  18.7. 字典序 # 算法[Top] ## 链表[Top] @@ -2183,7 +2184,29 @@ private static boolean isPowerOfTwo(int n) { - [寻找数组的中心下标](https://leetcode-cn.com/problems/find-pivot-index/) -### 求余数常见操作[Top] +### 素数[Top] + +如何确定一个数是素数 +```java + +public class Solution { + + public static boolean isPrime(int n) { + if (n < 0) { + return false; + } + int k = (int) Math.sqrt(n); + for (int i = 2; i <= k; i++) { + if (n % i == 0) { + return false; + } + } + return true; + } +} +``` + +### 求余数常见操作[Top] ```java public class Solution { @@ -2202,7 +2225,7 @@ public class Solution { } ``` -### Kanade 算法[Top] +### Kanade 算法[Top] 对于一个给定数组 A,Kadane 算法可以用来找到 A 的最大子段和。 @@ -2221,7 +2244,7 @@ class Solution { } ``` -### 约瑟夫环问题[Top] +### 约瑟夫环问题[Top] 以**找出游戏的获胜者**该题为例: @@ -2238,10 +2261,10 @@ class Solution { - [找出游戏的获胜者](https://leetcode-cn.com/problems/find-the-winner-of-the-circular-game/) -### 拒绝采样[Top] +### 拒绝采样[Top] -[用 Rand7() 实现 Rand10()](https://leetcode.cn/problems/implement-rand10-using-rand7/) -### 字典序[Top] +### 字典序[Top] - [字典序排数](https://leetcode.cn/problems/lexicographical-numbers/) - [字典序的第K小数字](https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/) \ No newline at end of file diff --git a/src/main/java/com/toc/JVM.md b/src/main/java/com/toc/JVM.md index 0526f4a..62a7764 100644 --- a/src/main/java/com/toc/JVM.md +++ b/src/main/java/com/toc/JVM.md @@ -301,7 +301,7 @@ public class JavaMethodAreaOOM { ``` #### 本机直接内存溢出[Top] -特征是Heap dump很小,而程序中又间接使用了DirectMemory(如NIO) +特征是Heap dump很小,而程序中有间接使用了DirectMemory(如NIO) ```java //* 参数:-Xmx20M -XX:MaxDirectMemorySize=10M //* 本机直接内存溢出 @@ -433,7 +433,7 @@ G1收集器解决漏标问题:原始快照方式。 ### 回收方法区[Top] 方法区的回收主要是两部分内容:废弃的常量和不再使用的类型。 - 废弃的常量的例子:字符串常量进入到常量池中,但当前系统有没有任何一个字符串对象的值为“java”,则该常量就会被系统清理出常量池。 -- 不在使用的类,需同时满足一下三个条件: +- 不在使用的类,需同时满足以下三个条件: - 该类的所有实例已经被回收,也就是java对重不存在该类及其任何派生的子类实例。 - 加载该类的类加载器已经被回收。正常很难达成。如OSGi、JSP的重加载会产生。 - 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 @@ -1633,7 +1633,7 @@ JVM 的堆外内存泄漏,主要有两种的原因: > 太抽象了 #### 不恰当的数据结构导致内存过大[Top] -场景:-Xms4g -Xmx8g -Xmn1g 使用ParNew + CMS组合。业务上需要10min加载80MB的数据到内存,会产生100W HashMap entry, Minor GC超过500ms,因为新生代使用了标记复制算法\ +场景:-Xms4g -Xmx8g -Xmn1g 使用ParNew + CMS组合。业务上需要10min加载80MB的数据到内存,会产生100W HashMap entry, Minor GC超过500ms,因为新生代使用了标记复制算法 方案:不从修改程序,仅从GC调优,可以直接去掉SurvivorRatio,让新生代存活的对象一次Minor GC就进入到老年代` -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0`(或者-XX:+AlwaysTenure) #### 堆外内存导致溢出错误[Top] diff --git a/src/main/java/com/toc/THREAD.md b/src/main/java/com/toc/THREAD.md index 2764f1e..6f8eb39 100644 --- a/src/main/java/com/toc/THREAD.md +++ b/src/main/java/com/toc/THREAD.md @@ -454,7 +454,7 @@ Worker为线程池内部对于线程的包装类,继承了AQS抽象类,实 3. Worker使用HashSet进行保存,通过ReentrantLock方法保证线程安全,控制Worker集合的修改。 ```java -public class Test { +public class ThreadPoolExecutor { final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; @@ -507,7 +507,7 @@ public class Test { ```java -public class Test { +public class ThreadPoolExecutor { final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask;