diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76c3558 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Built application files and Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +# Compiled class files +*.class + +# Log Files +*.log + +# About IntelliJ +*.iml +/.idea/ +/out/ + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# macOS +.DS_Store + +# Package Files +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# CMake +cmake-build-debug/ + +# File-based project format +*.iws + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* \ No newline at end of file diff --git a/comxjtu/pom.xml b/comxjtu/pom.xml index 0183231..71e57b2 100644 --- a/comxjtu/pom.xml +++ b/comxjtu/pom.xml @@ -21,10 +21,57 @@ - - junit - junit - 4.12 - - + + junit + junit + 4.12 + + + org.projectlombok + lombok + 1.16.18 + + + log4j + log4j + 1.2.12 + + + org.slf4j + slf4j-log4j12 + 1.7.1 + + + org.slf4j + slf4j-api + 1.7.1 + + + + + com.google.guava + guava + 20.0 + + + + + org.apache.commons + commons-lang3 + 3.5 + + + + + commons-collections + commons-collections + 3.2.1 + + + + org.springframework + spring-jdbc + 4.0.3.RELEASE + + \ No newline at end of file diff --git a/comxjtu/src/main/java/A.java b/comxjtu/src/main/java/A.java index 163bbbf..39813cb 100644 --- a/comxjtu/src/main/java/A.java +++ b/comxjtu/src/main/java/A.java @@ -45,6 +45,47 @@ public void solve() { } public static void main(String[] args) { - new A().solve(); +// new A().solve(); +// new A().test("1"); + // 第一个字符串常量,存储在方法区的字符串常量池中。 + String str1 = "world"; + + // 使用 new 关键字创建的字符串对象,存储在堆内存中。 + String str2 = new String("world"); + + // 调用 intern() 方法创建字符串常量,存储在运行时常量池中。 + String str3 = str2.intern(); + + String str4 = new String("world"); + String str5 = "world"; + + System.out.println(str1); + System.out.println(str2); + System.out.println(str3); + System.out.println(str4); + System.out.println("str1 address: " + System.identityHashCode(str1)); + System.out.println("str2 address: " + System.identityHashCode(str2)); + System.out.println("str3 address: " + System.identityHashCode(str3)); + System.out.println("str3 address: " + System.identityHashCode(str4)); + System.out.println("str3 address: " + System.identityHashCode(str5)); + } + + private void test(String number) { + test2(1); + try{ + int ans = 0; + ans = 10/0; + }catch (ArithmeticException e){ + throw new ArithmeticException(); + }finally { + System.out.println(number); + } + } + + private void test2(int i) throws ArithmeticException{ + int ans = 0; + ans = 10/0; + System.out.println("end"); + System.out.println("test2"); } } \ No newline at end of file diff --git a/comxjtu/src/main/java/com/xjtu/Test.java b/comxjtu/src/main/java/com/algorithom4/Test.java similarity index 97% rename from comxjtu/src/main/java/com/xjtu/Test.java rename to comxjtu/src/main/java/com/algorithom4/Test.java index 6c2e093..b4e83f8 100644 --- a/comxjtu/src/main/java/com/xjtu/Test.java +++ b/comxjtu/src/main/java/com/algorithom4/Test.java @@ -1,4 +1,4 @@ -package com.xjtu; +package com.algorithom4; import java.util.LinkedList; import java.util.List; diff --git a/comxjtu/src/main/java/com/xjtu/ch1/BinarySearch.java b/comxjtu/src/main/java/com/algorithom4/ch1/BinarySearch.java similarity index 84% rename from comxjtu/src/main/java/com/xjtu/ch1/BinarySearch.java rename to comxjtu/src/main/java/com/algorithom4/ch1/BinarySearch.java index 1578db9..e3b6cd5 100644 --- a/comxjtu/src/main/java/com/xjtu/ch1/BinarySearch.java +++ b/comxjtu/src/main/java/com/algorithom4/ch1/BinarySearch.java @@ -1,4 +1,4 @@ -package com.xjtu.ch1; +package com.algorithom4.ch1; /** * @Author: Jay @@ -15,7 +15,7 @@ public int binarySearch(int[] a,int t){ while (lo<=hi){ int mid = lo + (hi-lo)/2; if (a[mid]>t) hi = mid - 1; - else if (a[mid]t) hi = mid - 1; - else if (a[mid](),Arrays.asList(1,2,3,4), 2); + availableSet.combinations( new ArrayList(), new ArrayList(), 2); + availableSet.combinations( new ArrayList(), new ArrayList(), 0); + availableSet.combinations( new ArrayList(),Arrays.asList(1,2,3,4), 1); + availableSet.combinations( new ArrayList(),Arrays.asList(1,2,3,4), 0); + availableSet.combinations( new ArrayList(),Arrays.asList(1,2,3,4,5,6,7,8,9,10), 4); + } + + public void combinations(List selected, List data, int n) { + + if (n == 0){ + for (Integer i : + selected) { + System.out.print(i); + System.out.print(" "); + } + System.out.println(); + return; + } + + if (data.isEmpty()){ + return; + } + + selected.add(data.get(0)); + combinations(selected, data.subList(1, data.size()), n-1); + + //selected.remove(data.get(0)); + selected.remove(selected.size()-1); + combinations(selected, data.subList(1, data.size()), n); + } +} diff --git a/comxjtu/src/main/java/interview/recursion/LinkedListCreator.java b/comxjtu/src/main/java/com/interview/recursion/LinkedListCreator.java similarity index 96% rename from comxjtu/src/main/java/interview/recursion/LinkedListCreator.java rename to comxjtu/src/main/java/com/interview/recursion/LinkedListCreator.java index 3e5ece9..44cbb59 100644 --- a/comxjtu/src/main/java/interview/recursion/LinkedListCreator.java +++ b/comxjtu/src/main/java/com/interview/recursion/LinkedListCreator.java @@ -1,6 +1,6 @@ -package interview.recursion; +package com.interview.recursion; -import interview.common.Node; +import com.interview.common.Node; import java.util.ArrayList; import java.util.Arrays; diff --git a/comxjtu/src/main/java/interview/recursion/LinkedListReverse.java b/comxjtu/src/main/java/com/interview/recursion/LinkedListReverse.java similarity index 96% rename from comxjtu/src/main/java/interview/recursion/LinkedListReverse.java rename to comxjtu/src/main/java/com/interview/recursion/LinkedListReverse.java index d9ca973..2296634 100644 --- a/comxjtu/src/main/java/interview/recursion/LinkedListReverse.java +++ b/comxjtu/src/main/java/com/interview/recursion/LinkedListReverse.java @@ -1,6 +1,6 @@ -package interview.recursion; +package com.interview.recursion; -import interview.common.Node; +import com.interview.common.Node; import java.util.ArrayList; import java.util.Arrays; diff --git a/comxjtu/src/main/java/com/java/DesignPatterns/Singleton.java b/comxjtu/src/main/java/com/java/DesignPatterns/Singleton.java deleted file mode 100644 index b2a96ea..0000000 --- a/comxjtu/src/main/java/com/java/DesignPatterns/Singleton.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.java.DesignPatterns; - -/** - * @Author: Jay - * @Date: Created in 7:31 2018年8月30日 - * @Modified By: - */ - -// 加同步锁时,前后两次判断实例是否存在 -public class Singleton { - private static Singleton instance=null; - private Singleton(){ - - } - public static Singleton getInstance(){ - if(instance==null){ - synchronized(Singleton.class){ - if(instance==null){ - instance=new Singleton(); - } - } - } - return instance; - } -} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/Singleton2.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/Singleton2.java new file mode 100644 index 0000000..13e59e2 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/Singleton2.java @@ -0,0 +1,52 @@ +package com.javaBasic.DesignPatterns; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +/** + * @author JS + * @version 1.0 + * @date 2023年3月31日 9:00 + * @description //练习写作singleton + */ +public class Singleton2 { + private static volatile Singleton2 singleton = null; + private static boolean flag=false; // 定义一个静态类型的flag变量 + private Singleton2() { + synchronized (Singleton2.class){ + if (!flag){ // 判断对象是否创建过 + flag=true; + }else { + throw new RuntimeException("请别用反射破坏单例模式"); + } + } +// if(singleton != null){ +// throw new RuntimeException("单例构造器禁止反射调用"); +// } + } + + public static Singleton2 getInstance(){ + if (singleton == null) { + synchronized (Singleton2.class){ + if (singleton == null) { + singleton = new Singleton2(); + } + } + } + return singleton; + } + + public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + + Constructor constructor = Singleton2.class.getDeclaredConstructor(); + + Singleton2 instance3 = constructor.newInstance(); + Singleton2 instance4 = Singleton2.class.newInstance(); + constructor.setAccessible(true); // 无视私有构造器 + Singleton2 instance2 = constructor.newInstance(); + Singleton2 instance5 = new Singleton2(); + Singleton2 instance1 = Singleton2.getInstance(); + System.out.println(instance1); + System.out.println(instance2); + } +} diff --git a/comxjtu/src/main/java/com/java/DesignPatterns/StaticFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/StaticFactory.java similarity index 95% rename from comxjtu/src/main/java/com/java/DesignPatterns/StaticFactory.java rename to comxjtu/src/main/java/com/javaBasic/DesignPatterns/StaticFactory.java index 751e707..8f78dc0 100644 --- a/comxjtu/src/main/java/com/java/DesignPatterns/StaticFactory.java +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/StaticFactory.java @@ -1,4 +1,4 @@ -package com.java.DesignPatterns; +package com.javaBasic.DesignPatterns; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler1.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler1.java new file mode 100644 index 0000000..858d085 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler1.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility; + +//具体处理者角色1 +class ConcreteHandler1 extends Handler { + public void handleRequest(String request) { + if (request.equals("one")) { + System.out.println("具体处理者1负责处理该请求!"); + } else { + if (getNext() != null) { + getNext().handleRequest(request); + } else { + System.out.println("没有人处理该请求!"); + } + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler2.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler2.java new file mode 100644 index 0000000..7eb9127 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/ConcreteHandler2.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility; + +//具体处理者角色2 +class ConcreteHandler2 extends Handler { + public void handleRequest(String request) { + if (request.equals("two")) { + System.out.println("具体处理者2负责处理该请求!"); + } else { + if (getNext() != null) { + getNext().handleRequest(request); + } else { + System.out.println("没有人处理该请求!"); + } + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Handler.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Handler.java new file mode 100644 index 0000000..2b70bec --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Handler.java @@ -0,0 +1,14 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility; + +//抽象处理者角色 +abstract class Handler { + private Handler next; + public void setNext(Handler next) { + this.next = next; + } + public Handler getNext() { + return next; + } + //处理请求的方法 + public abstract void handleRequest(String request); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Test.java new file mode 100644 index 0000000..0df8736 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/Test.java @@ -0,0 +1,20 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility; + +/** + * Created by JS. + * 模式的结构 + 职责链模式主要包含以下角色。 + 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。 + 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。 + 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。 + */ +public class Test { + public static void main(String[] args) { + //组装责任链 + Handler handler1 = new ConcreteHandler1(); + Handler handler2 = new ConcreteHandler2(); + handler1.setNext(handler2); + //提交请求 + handler1.handleRequest("two"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/ClassAdviser.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/ClassAdviser.java new file mode 100644 index 0000000..42f5d8b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/ClassAdviser.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + +//具体处理者1:班主任类 +class ClassAdviser extends Leader { + public void handleRequest(int LeaveDays) { + if (LeaveDays <= 2) { + System.out.println("班主任批准您请假" + LeaveDays + "天。"); + } else { + if (getNext() != null) { + getNext().handleRequest(LeaveDays); + } else { + System.out.println("请假天数太多,没有人批准该假条!"); + } + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Dean.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Dean.java new file mode 100644 index 0000000..23914a8 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Dean.java @@ -0,0 +1,18 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + + +//具体处理者3:院长类 +class Dean extends Leader { + public void handleRequest(int LeaveDays) { + if (LeaveDays <= 10) { + System.out.println("院长批准您请假" + LeaveDays + "天。"); + } else { + if (getNext() != null) { + getNext().handleRequest(LeaveDays); + } else { + System.out.println("请假天数太多,没有人批准该假条!"); + } + } + } +} + diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DeanOfStudies.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DeanOfStudies.java new file mode 100644 index 0000000..d179d6b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DeanOfStudies.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + +//具体处理者4:教务处长类 +class DeanOfStudies extends Leader { + public void handleRequest(int LeaveDays) { + if (LeaveDays <= 20) { + System.out.println("教务处长批准您请假" + LeaveDays + "天。"); + } else { + if (getNext() != null) { + getNext().handleRequest(LeaveDays); + } else { + System.out.println("请假天数太多,没有人批准该假条!"); + } + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DepartmentHead.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DepartmentHead.java new file mode 100644 index 0000000..5a60915 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/DepartmentHead.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + +//具体处理者2:系主任类 +class DepartmentHead extends Leader { + public void handleRequest(int LeaveDays) { + if (LeaveDays <= 7) { + System.out.println("系主任批准您请假" + LeaveDays + "天。"); + } else { + if (getNext() != null) { + getNext().handleRequest(LeaveDays); + } else { + System.out.println("请假天数太多,没有人批准该假条!"); + } + } + } +} \ No newline at end of file diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Leader.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Leader.java new file mode 100644 index 0000000..29e2fdf --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Leader.java @@ -0,0 +1,14 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + +abstract public class Leader { + + private Leader next; + public void setNext(Leader next) { + this.next = next; + } + public Leader getNext() { + return next; + } + //处理请求的方法 + public abstract void handleRequest(int LeaveDays); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Test2.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Test2.java new file mode 100644 index 0000000..8e5e47c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/example/Test2.java @@ -0,0 +1,23 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.example; + +/** + * 【例1】用责任链模式设计一个请假条审批模块。 + + 分析:假如规定学生请假小于或等于 2 天,班主任可以批准;小于或等于 7 天,系主任可以批准;小于或等于 10 天, + 院长可以批准;其他情况不予批准;这个实例适合使用职责链模式实现。 + */ +public class Test2 { + + public static void main(String[] args) { + //组装责任链 + Leader teacher1 = new ClassAdviser(); + Leader teacher2 = new DepartmentHead(); + Leader teacher3 = new Dean(); + Leader teacher4=new DeanOfStudies(); + teacher1.setNext(teacher2); + teacher2.setNext(teacher3); + //teacher3.setNext(teacher4); + //提交请求 + teacher1.handleRequest(8); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FaceFilter.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FaceFilter.java new file mode 100644 index 0000000..bb25e63 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FaceFilter.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + +public class FaceFilter implements Filter { + + @Override + public String dofilter(String msg) { + return msg.replace(":(", "^V^"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Filter.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Filter.java new file mode 100644 index 0000000..91500c0 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Filter.java @@ -0,0 +1,5 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + +public interface Filter { + public String dofilter(String msg); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FilterChain.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FilterChain.java new file mode 100644 index 0000000..cb53c37 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/FilterChain.java @@ -0,0 +1,24 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + +import java.util.ArrayList; +import java.util.List; + +public class FilterChain implements Filter{ + + List filters = new ArrayList(); + + @Override + public String dofilter(String msg) { + String r = msg; + for(Filter f : filters) + r = f.dofilter(r); + return r; + } + + public FilterChain addFilter(Filter f){ + filters.add(f); + return this; + } + +} + diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/SensitiveWordFilter.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/SensitiveWordFilter.java new file mode 100644 index 0000000..c0f3583 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/SensitiveWordFilter.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + +public class SensitiveWordFilter implements Filter { + + @Override + public String dofilter(String msg) { + return msg.replace("fuck", "f**k").replace("Fuck", "F**k"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/StopWordFilter.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/StopWordFilter.java new file mode 100644 index 0000000..d502bbb --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/StopWordFilter.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + +public class StopWordFilter implements Filter { + + @Override + public String dofilter(String msg) { + return msg.replace("and", "").replace("to", "").replace("ing", "").replace("is", ""); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Test.java new file mode 100644 index 0000000..185df79 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/ChainofResponsibility/filter/Test.java @@ -0,0 +1,28 @@ +package com.javaBasic.DesignPatterns.behavioral.ChainofResponsibility.filter; + + + +public class Test { + + public static void main(String[] args){ + + String msg = "Today is raining. What a fucking day! :("; + String msg2 = "Today is raining. What a beautiful day! "; + + FilterChain fc = new FilterChain(); + fc.addFilter(new SensitiveWordFilter()) + .addFilter(new StopWordFilter()) + .addFilter(new FaceFilter()); + + String result = fc.dofilter(msg); + System.out.println(msg); + System.out.println(result); + + String result2 = fc.dofilter(msg2); + System.out.println(msg2); + System.out.println(result2); + + } + +} + diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Colleague.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Colleague.java new file mode 100644 index 0000000..f576ed5 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Colleague.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +//抽象同事类 +abstract class Colleague { + protected Mediator mediator; + public void setMedium(Mediator mediator) { + this.mediator = mediator; + } + public abstract void receive(); + public abstract void send(); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague1.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague1.java new file mode 100644 index 0000000..0c57924 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague1.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +class ConcreteColleague1 extends Colleague { + public void receive() { + System.out.println("具体同事类1收到请求。"); + } + public void send() { + System.out.println("具体同事类1发出请求。"); + mediator.relay(this); //请中介者转发 + } +} \ No newline at end of file diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague2.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague2.java new file mode 100644 index 0000000..3c12537 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteColleague2.java @@ -0,0 +1,12 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +//具体同事类 +class ConcreteColleague2 extends Colleague { + public void receive() { + System.out.println("具体同事类2收到请求。"); + } + public void send() { + System.out.println("具体同事类2发出请求。"); + mediator.relay(this); //请中介者转发 + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteMediator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteMediator.java new file mode 100644 index 0000000..2de3c3b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/ConcreteMediator.java @@ -0,0 +1,22 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +import java.util.ArrayList; +import java.util.List; + +//具体中介者 +class ConcreteMediator extends Mediator { + private List colleagues = new ArrayList(); + public void register(Colleague colleague) { + if (!colleagues.contains(colleague)) { + colleagues.add(colleague); + colleague.setMedium(this); + } + } + public void relay(Colleague cl) { + for (Colleague ob : colleagues) { + if (!ob.equals(cl)) { + ((Colleague) ob).receive(); + } + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Mediator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Mediator.java new file mode 100644 index 0000000..3e429d3 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Mediator.java @@ -0,0 +1,6 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +abstract class Mediator { + public abstract void register(Colleague colleague); + public abstract void relay(Colleague cl); //转发 +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Test.java new file mode 100644 index 0000000..cfb7d95 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/Mediator/Test.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.behavioral.Mediator; + +public class Test { + + public static void main(String[] args) { + Mediator md = new ConcreteMediator(); + Colleague c1, c2; + c1 = new ConcreteColleague1(); + c2 = new ConcreteColleague2(); + md.register(c1); + md.register(c2); + c1.send(); + System.out.println("-------------"); + c2.send(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Course.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Course.java new file mode 100644 index 0000000..ca62ba4 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Course.java @@ -0,0 +1,17 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +/** + * Created by js. + */ +public class Course { + private String name; + + public Course(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregate.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregate.java new file mode 100644 index 0000000..c297e13 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregate.java @@ -0,0 +1,15 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +/** + * Created by js. + */ +public interface CourseAggregate { + + void addCourse(Course course); + void removeCourse(Course course); + + CourseIterator getCourseIterator(); + + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregateImpl.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregateImpl.java new file mode 100644 index 0000000..6fb4ea9 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseAggregateImpl.java @@ -0,0 +1,31 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by js. + */ +public class CourseAggregateImpl implements CourseAggregate { + + private List courseList; + + public CourseAggregateImpl() { + this.courseList = new ArrayList(); + } + + @Override + public void addCourse(Course course) { + courseList.add(course); + } + + @Override + public void removeCourse(Course course) { + courseList.remove(course); + } + + @Override + public CourseIterator getCourseIterator() { + return new CourseIteratorImpl(courseList); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIterator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIterator.java new file mode 100644 index 0000000..fcfd3fd --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIterator.java @@ -0,0 +1,10 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +/** + * Created by js. + */ +public interface CourseIterator { + Course nextCourse(); + boolean isLastCourse(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIteratorImpl.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIteratorImpl.java new file mode 100644 index 0000000..61eff1c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/CourseIteratorImpl.java @@ -0,0 +1,32 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +import java.util.List; + +/** + * Created by js. + */ +public class CourseIteratorImpl implements CourseIterator { + + private List courseList; + private int position; + private Course course; + public CourseIteratorImpl(List courseList){ + this.courseList=courseList; + } + + @Override + public Course nextCourse() { + System.out.println("返回课程,位置是: "+position); + course=(Course)courseList.get(position); + position++; + return course; + } + + @Override + public boolean isLastCourse(){ + if(position< courseList.size()){ + return false; + } + return true; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Test.java new file mode 100644 index 0000000..ef5facc --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/iterator/Test.java @@ -0,0 +1,47 @@ +package com.javaBasic.DesignPatterns.behavioral.iterator; + +/** + * Created by js. + */ +public class Test { + + + public static void main(String[] args) { + Course course1 = new Course("Java电商一期"); + Course course2 = new Course("Java电商二期"); + Course course3 = new Course("Java设计模式精讲"); + Course course4 = new Course("Python课程"); + Course course5 = new Course("算法课程"); + Course course6 = new Course("前端课程"); + + + CourseAggregate courseAggregate = new CourseAggregateImpl(); + + courseAggregate.addCourse(course1); + courseAggregate.addCourse(course2); + courseAggregate.addCourse(course3); + courseAggregate.addCourse(course4); + courseAggregate.addCourse(course5); + courseAggregate.addCourse(course6); + + System.out.println("-----课程列表-----"); + printCourses(courseAggregate); + + courseAggregate.removeCourse(course4); + courseAggregate.removeCourse(course5); + + System.out.println("-----删除操作之后的课程列表-----"); + printCourses(courseAggregate); + } + + + public static void printCourses(CourseAggregate courseAggregate){ + CourseIterator courseIterator= courseAggregate.getCourseIterator(); + while(!courseIterator.isLastCourse()){ + Course course=courseIterator.nextCourse(); + System.out.println(course.getName()); + } + } + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/FanXianPromotionStrategy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/FanXianPromotionStrategy.java new file mode 100644 index 0000000..caf4563 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/FanXianPromotionStrategy.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public class FanXianPromotionStrategy implements PromotionStrategy{ + @Override + public void doPromotion() { + System.out.println("返现促销,返回的金额存放到慕课网用户的余额中"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/LiJianPromotionStrategy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/LiJianPromotionStrategy.java new file mode 100644 index 0000000..41e288e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/LiJianPromotionStrategy.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public class LiJianPromotionStrategy implements PromotionStrategy { + @Override + public void doPromotion() { + System.out.println("立减促销,课程的价格直接减去配置的价格"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/ManJianPromotionStrategy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/ManJianPromotionStrategy.java new file mode 100644 index 0000000..215309d --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/ManJianPromotionStrategy.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public class ManJianPromotionStrategy implements PromotionStrategy{ + @Override + public void doPromotion() { + System.out.println("满减促销,满200-20元"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionActivity.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionActivity.java new file mode 100644 index 0000000..84a9e10 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionActivity.java @@ -0,0 +1,17 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public class PromotionActivity { + private PromotionStrategy promotionStrategy; + + public PromotionActivity(PromotionStrategy promotionStrategy) { + this.promotionStrategy = promotionStrategy; + } + + public void executePromotionStrategy(){ + promotionStrategy.doPromotion(); + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionStrategy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionStrategy.java new file mode 100644 index 0000000..6e31c75 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/PromotionStrategy.java @@ -0,0 +1,8 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public interface PromotionStrategy { + void doPromotion(); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/Test.java new file mode 100644 index 0000000..9193077 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/strategy/Test.java @@ -0,0 +1,14 @@ +package com.javaBasic.DesignPatterns.behavioral.strategy; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy()); + PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy()); + + promotionActivity618.executePromotionStrategy(); + promotionActivity1111.executePromotionStrategy(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/ACourse.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/ACourse.java new file mode 100644 index 0000000..0996202 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/ACourse.java @@ -0,0 +1,37 @@ +package com.javaBasic.DesignPatterns.behavioral.templatemethod; + +/** + * Created by js + */ +public abstract class ACourse { + + protected final void makeCourse(){ + this.makePPT(); + this.makeVideo(); + if(needWriteArticle()){ + this.writeArticle(); + } + this.packageCourse(); + } + + + final void makePPT(){ + System.out.println("制作PPT"); + } + final void makeVideo(){ + System.out.println("制作视频"); + } + final void writeArticle(){ + System.out.println("编写手记"); + } + //钩子方法 + protected boolean needWriteArticle(){ + return false; + } + abstract void packageCourse(); + + + + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/DesignPatternCourse.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/DesignPatternCourse.java new file mode 100644 index 0000000..86df928 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/DesignPatternCourse.java @@ -0,0 +1,17 @@ +package com.javaBasic.DesignPatterns.behavioral.templatemethod; + +/** + * Created by js + */ +public class DesignPatternCourse extends ACourse { + @Override + void packageCourse() { + System.out.println("提供课程Java源代码"); + } + + @Override + protected boolean needWriteArticle() { + return true; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/FECourse.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/FECourse.java new file mode 100644 index 0000000..2cf0135 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/FECourse.java @@ -0,0 +1,22 @@ +package com.javaBasic.DesignPatterns.behavioral.templatemethod; + +/** + * Created by js + */ +public class FECourse extends ACourse { + private boolean needWriteArticleFlag = false; + @Override + void packageCourse() { + System.out.println("提供课程的前端代码"); + System.out.println("提供课程的图片等多媒体素材"); + } + + public FECourse(boolean needWriteArticleFlag) { + this.needWriteArticleFlag = needWriteArticleFlag; + } + + @Override + protected boolean needWriteArticle() { + return this.needWriteArticleFlag; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/Test.java new file mode 100644 index 0000000..bd8f1b2 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/behavioral/templatemethod/Test.java @@ -0,0 +1,21 @@ +package com.javaBasic.DesignPatterns.behavioral.templatemethod; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { +// System.out.println("后端设计模式课程start---"); +// ACourse designPatternCourse = new DesignPatternCourse(); +// designPatternCourse.makeCourse(); +// System.out.println("后端设计模式课程end---"); + + + System.out.println("前端课程start---"); + ACourse feCourse = new FECourse(false); + feCourse.makeCourse(); + System.out.println("前端课程end---"); + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Article.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Article.java new file mode 100644 index 0000000..13123cb --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Article.java @@ -0,0 +1,8 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public abstract class Article { + public abstract void produce(); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/CourseFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/CourseFactory.java new file mode 100644 index 0000000..ff5b1f8 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/CourseFactory.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + + +/** + * Created by js + */ +public interface CourseFactory { + Video getVideo(); + Article getArticle(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaArticle.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaArticle.java new file mode 100644 index 0000000..43acf4e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaArticle.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class JavaArticle extends Article { + @Override + public void produce() { + System.out.println("编写Java课程手记"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaCourseFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaCourseFactory.java new file mode 100644 index 0000000..bc0f96a --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaCourseFactory.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class JavaCourseFactory implements CourseFactory { + @Override + public Video getVideo() { + return new JavaVideo(); + } + + @Override + public Article getArticle() { + return new JavaArticle(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaVideo.java new file mode 100644 index 0000000..636f3af --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/JavaVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class JavaVideo extends Video { + @Override + public void produce() { + System.out.println("录制Java课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonArticle.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonArticle.java new file mode 100644 index 0000000..4952137 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonArticle.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class PythonArticle extends Article { + @Override + public void produce() { + System.out.println("编写Python课程手记"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonCourseFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonCourseFactory.java new file mode 100644 index 0000000..4c828d4 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonCourseFactory.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class PythonCourseFactory implements CourseFactory { + @Override + public Video getVideo() { + return new PythonVideo(); + } + + @Override + public Article getArticle() { + return new PythonArticle(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonVideo.java new file mode 100644 index 0000000..b788495 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/PythonVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class PythonVideo extends Video { + @Override + public void produce() { + System.out.println("录制Python课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Test.java new file mode 100644 index 0000000..9b489e9 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Test.java @@ -0,0 +1,14 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + CourseFactory courseFactory = new JavaCourseFactory(); + Video video = courseFactory.getVideo(); + Article article = courseFactory.getArticle(); + video.produce(); + article.produce(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Video.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Video.java new file mode 100644 index 0000000..6a1cdcc --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/abstractfactory/Video.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.creational.abstractfactory; + +/** + * Created by js + */ +public abstract class Video { + public abstract void produce(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Coach.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Coach.java new file mode 100644 index 0000000..cfdaa2d --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Coach.java @@ -0,0 +1,23 @@ +package com.javaBasic.DesignPatterns.creational.builder; + +/** + * Created by js + */ +public class Coach { + private CourseBuilder courseBuilder; + + public void setCourseBuilder(CourseBuilder courseBuilder) { + this.courseBuilder = courseBuilder; + } + + public Course makeCourse(String courseName,String coursePPT, + String courseVideo,String courseArticle, + String courseQA){ + this.courseBuilder.buildCourseName(courseName); + this.courseBuilder.buildCoursePPT(coursePPT); + this.courseBuilder.buildCourseVideo(courseVideo); + this.courseBuilder.buildCourseArticle(courseArticle); + this.courseBuilder.buildCourseQA(courseQA); + return this.courseBuilder.makeCourse(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Course.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Course.java new file mode 100644 index 0000000..b881bf5 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Course.java @@ -0,0 +1,65 @@ +package com.javaBasic.DesignPatterns.creational.builder; + +/** + * Created by js + */ +public class Course { + private String courseName; + private String coursePPT; + private String courseVideo; + private String courseArticle; + + //question & answer + private String courseQA; + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public String getCoursePPT() { + return coursePPT; + } + + public void setCoursePPT(String coursePPT) { + this.coursePPT = coursePPT; + } + + public String getCourseVideo() { + return courseVideo; + } + + public void setCourseVideo(String courseVideo) { + this.courseVideo = courseVideo; + } + + public String getCourseArticle() { + return courseArticle; + } + + public void setCourseArticle(String courseArticle) { + this.courseArticle = courseArticle; + } + + public String getCourseQA() { + return courseQA; + } + + public void setCourseQA(String courseQA) { + this.courseQA = courseQA; + } + + @Override + public String toString() { + return "Course{" + + "courseName='" + courseName + '\'' + + ", coursePPT='" + coursePPT + '\'' + + ", courseVideo='" + courseVideo + '\'' + + ", courseArticle='" + courseArticle + '\'' + + ", courseQA='" + courseQA + '\'' + + '}'; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseActualBuilder.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseActualBuilder.java new file mode 100644 index 0000000..71c252c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseActualBuilder.java @@ -0,0 +1,40 @@ +package com.javaBasic.DesignPatterns.creational.builder; + +/** + * Created by js + */ +public class CourseActualBuilder extends CourseBuilder { + + private Course course = new Course(); + + + @Override + public void buildCourseName(String courseName) { + course.setCourseName(courseName); + } + + @Override + public void buildCoursePPT(String coursePPT) { + course.setCoursePPT(coursePPT); + } + + @Override + public void buildCourseVideo(String courseVideo) { + course.setCourseVideo(courseVideo); + } + + @Override + public void buildCourseArticle(String courseArticle) { + course.setCourseArticle(courseArticle); + } + + @Override + public void buildCourseQA(String courseQA) { + course.setCourseQA(courseQA); + } + + @Override + public Course makeCourse() { + return course; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseBuilder.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseBuilder.java new file mode 100644 index 0000000..512749e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/CourseBuilder.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.creational.builder; + +/** + * Created by js + */ +public abstract class CourseBuilder { + + public abstract void buildCourseName(String courseName); + public abstract void buildCoursePPT(String coursePPT); + public abstract void buildCourseVideo(String courseVideo); + public abstract void buildCourseArticle(String courseArticle); + public abstract void buildCourseQA(String courseQA); + + public abstract Course makeCourse(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Test.java new file mode 100644 index 0000000..b089d2a --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/Test.java @@ -0,0 +1,22 @@ +package com.javaBasic.DesignPatterns.creational.builder; + +/** + * Created by JS + * 建造者(Builder)模式在应用过程中可以根据需要改变,如果创建的产品种类只有一种,只需要一个具体建造者, + * 这时可以省略掉抽象建造者,甚至可以省略掉指挥者角色。 + */ +public class Test { + public static void main(String[] args) { + CourseBuilder courseBuilder = new CourseActualBuilder(); + Coach coach = new Coach(); + coach.setCourseBuilder(courseBuilder); + + Course course = coach.makeCourse("Java设计模式精讲", + "Java设计模式精讲PPT", + "Java设计模式精讲视频", + "Java设计模式精讲手记", + "Java设计模式精讲问答"); + System.out.println(course); + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Course.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Course.java new file mode 100644 index 0000000..2bc8a8a --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Course.java @@ -0,0 +1,78 @@ +package com.javaBasic.DesignPatterns.creational.builder.v2; + +/** + * Created by js + */ +public class Course { + + private String courseName; + private String coursePPT; + private String courseVideo; + private String courseArticle; + + //question & answer + private String courseQA; + + public Course(CourseBuilder courseBuilder) { + this.courseName = courseBuilder.courseName; + this.coursePPT = courseBuilder.coursePPT; + this.courseVideo = courseBuilder.courseVideo; + this.courseArticle = courseBuilder.courseArticle; + this.courseQA = courseBuilder.courseQA; + } + + + @Override + public String toString() { + return "Course{" + + "courseName='" + courseName + '\'' + + ", coursePPT='" + coursePPT + '\'' + + ", courseVideo='" + courseVideo + '\'' + + ", courseArticle='" + courseArticle + '\'' + + ", courseQA='" + courseQA + '\'' + + '}'; + } + + public static class CourseBuilder{ + private String courseName; + private String coursePPT; + private String courseVideo; + private String courseArticle; + + //question & answer + private String courseQA; + + public CourseBuilder buildCourseName(String courseName){ + this.courseName = courseName; + return this; + } + + + public CourseBuilder buildCoursePPT(String coursePPT) { + this.coursePPT = coursePPT; + return this; + } + + public CourseBuilder buildCourseVideo(String courseVideo) { + this.courseVideo = courseVideo; + return this; + } + + public CourseBuilder buildCourseArticle(String courseArticle) { + this.courseArticle = courseArticle; + return this; + } + + public CourseBuilder buildCourseQA(String courseQA) { + this.courseQA = courseQA; + return this; + } + + public Course build(){ + return new Course(this); + } + + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Test.java new file mode 100644 index 0000000..2c7c41f --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/builder/v2/Test.java @@ -0,0 +1,19 @@ +package com.javaBasic.DesignPatterns.creational.builder.v2; + +import com.google.common.collect.ImmutableSet; + +import java.util.Set; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + Course course = new Course.CourseBuilder().buildCourseName("Java设计模式精讲").buildCoursePPT("Java设计模式精讲PPT").buildCourseVideo("Java设计模式精讲视频").build(); + System.out.println(course); + + Set set = ImmutableSet.builder().add("a").add("b").build(); + + System.out.println(set); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideo.java new file mode 100644 index 0000000..67c625c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class FEVideo extends Video{ + @Override + public void produce() { + System.out.println("录制FE课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideoFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideoFactory.java new file mode 100644 index 0000000..4d7a6ff --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/FEVideoFactory.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class FEVideoFactory extends VideoFactory{ + @Override + public Video getVideo() { + return new FEVideo(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideo.java new file mode 100644 index 0000000..9f3d458 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class JavaVideo extends Video { + @Override + public void produce() { + System.out.println("录制Java课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideoFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideoFactory.java new file mode 100644 index 0000000..f6767a4 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/JavaVideoFactory.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class JavaVideoFactory extends VideoFactory { + @Override + public Video getVideo() { + return new JavaVideo(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideo.java new file mode 100644 index 0000000..1cddfe7 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class PythonVideo extends Video { + @Override + public void produce() { + System.out.println("录制Python课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideoFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideoFactory.java new file mode 100644 index 0000000..4d9fdc1 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/PythonVideoFactory.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public class PythonVideoFactory extends VideoFactory { + @Override + public Video getVideo() { + return new PythonVideo(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/ReadXML1.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/ReadXML1.java new file mode 100644 index 0000000..1056ecf --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/ReadXML1.java @@ -0,0 +1,34 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; + +public class ReadXML1 { + //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 + public static Object getObject() { + try { + //创建文档对象 + DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = dFactory.newDocumentBuilder(); + Document doc; + doc = builder.parse(new File("H:\\workspace_idea\\javapattern\\src\\main\\java\\com\\js\\design\\pattern\\creational\\factorymethod\\config1.xml")); + //获取包含类名的文本节点 + NodeList nl = doc.getElementsByTagName("className"); + Node classNode = nl.item(0).getFirstChild(); + String cName = "com.js.design.pattern.creational.factorymethod." + classNode.getNodeValue(); + //System.out.println("新类名:"+cName); + //通过类名生成实例对象并将其返回 + Class c = Class.forName(cName); + Object obj = c.newInstance(); + return obj; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Test.java new file mode 100644 index 0000000..d6f8a2c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Test.java @@ -0,0 +1,23 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by JS + * 在实际过程中,并不是通过显式的new具体的工厂类,而是通过读配置文件等方式生成。例如通过Test中的方式 + * 工厂方法模式的主要角色如下。 + 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。 + 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。 + 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。 + 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。 + */ +public class Test { + public static void main(String[] args) { +// VideoFactory videoFactory = new PythonVideoFactory(); +// VideoFactory videoFactory2 = new JavaVideoFactory(); +// VideoFactory videoFactory3 = new FEVideoFactory(); + VideoFactory videoFactory = (VideoFactory)ReadXML1.getObject(); + Video video = videoFactory.getVideo(); + video.produce(); + + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Video.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Video.java new file mode 100644 index 0000000..cc9917c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/Video.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public abstract class Video { + public abstract void produce(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/VideoFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/VideoFactory.java new file mode 100644 index 0000000..8dedbf2 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/VideoFactory.java @@ -0,0 +1,34 @@ +package com.javaBasic.DesignPatterns.creational.factorymethod; + +/** + * Created by js + */ +public abstract class VideoFactory { + + public abstract Video getVideo(); + +// public Video getVideo(Class c){ +// Video video = null; +// try { +// video = (Video) Class.forName(c.getName()).newInstance(); +// } catch (InstantiationException e) { +// e.printStackTrace(); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } +// return video; +// } +// +// +// public Video getVideo(String type){ +// if("java".equalsIgnoreCase(type)){ +// return new JavaVideo(); +// }else if("python".equalsIgnoreCase(type)){ +// return new PythonVideo(); +// } +// return null; +// } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/config1.xml b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/config1.xml new file mode 100644 index 0000000..83fc0ba --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/factorymethod/config1.xml @@ -0,0 +1,4 @@ + + + FEVideoFactory + \ No newline at end of file diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Mail.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Mail.java new file mode 100644 index 0000000..adbdcbe --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Mail.java @@ -0,0 +1,52 @@ +package com.javaBasic.DesignPatterns.creational.prototype; + +/** + * Created by js + */ +public class Mail implements Cloneable{ + private String name; + private String emailAddress; + private String content; + public Mail(){ + System.out.println("Mail Class Constructor"); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(String emailAddress) { + this.emailAddress = emailAddress; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "Mail{" + + "name='" + name + '\'' + + ", emailAddress='" + emailAddress + '\'' + + ", content='" + content + '\'' + + '}'+super.toString(); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + System.out.println("clone mail object"); + return super.clone(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/MailUtil.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/MailUtil.java new file mode 100644 index 0000000..07ab7c4 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/MailUtil.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.creational.prototype; + +import java.text.MessageFormat; + +/** + * Created by js + */ +public class MailUtil { + public static void sendMail(Mail mail){ + String outputContent = "向{0}同学,邮件地址:{1},邮件内容:{2}发送邮件成功"; + System.out.println(MessageFormat.format(outputContent,mail.getName(),mail.getEmailAddress(),mail.getContent())); + } + public static void saveOriginMailRecord(Mail mail){ + System.out.println("存储originMail记录,originMail:"+mail.getContent()); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Test.java new file mode 100644 index 0000000..e59c005 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/Test.java @@ -0,0 +1,21 @@ +package com.javaBasic.DesignPatterns.creational.prototype; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) throws CloneNotSupportedException { + Mail mail = new Mail(); + mail.setContent("初始化模板"); + System.out.println("初始化mail:"+mail); + for(int i = 0;i < 10;i++){ + Mail mailTemp = (Mail) mail.clone(); + mailTemp.setName("姓名"+i); + mailTemp.setEmailAddress("姓名"+i+"@imooc.com"); + mailTemp.setContent("恭喜您,此次慕课网活动中奖了"); + MailUtil.sendMail(mailTemp); + System.out.println("克隆的mailTemp:"+mailTemp); + } + MailUtil.saveOriginMailRecord(mail); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/A.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/A.java new file mode 100644 index 0000000..ff7bf2a --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/A.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.prototype.abstractprototype; + +/** + * Created by js + */ +public abstract class A implements Cloneable{ + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/B.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/B.java new file mode 100644 index 0000000..b8bba5c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/abstractprototype/B.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.prototype.abstractprototype; + +/** + * Created by js + */ +public class B extends A { + public static void main(String[] args) throws CloneNotSupportedException { + B b = new B(); + b.clone(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Pig.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Pig.java new file mode 100644 index 0000000..31cf587 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Pig.java @@ -0,0 +1,49 @@ +package com.javaBasic.DesignPatterns.creational.prototype.clone; + +import java.util.Date; + +/** + * Created by js + */ +public class Pig implements Cloneable{ + private String name; + private Date birthday; + + public Pig(String name, Date birthday) { + this.name = name; + this.birthday = birthday; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + Pig pig = (Pig)super.clone(); + + //深克隆 + pig.birthday = (Date) pig.birthday.clone(); + return pig; + } + + @Override + public String toString() { + return "Pig{" + + "name='" + name + '\'' + + ", birthday=" + birthday + + '}'+super.toString(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Test.java new file mode 100644 index 0000000..55f65ac --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/prototype/clone/Test.java @@ -0,0 +1,32 @@ +package com.javaBasic.DesignPatterns.creational.prototype.clone; + +import java.lang.reflect.InvocationTargetException; +import java.util.Date; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) throws CloneNotSupportedException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Date birthday = new Date(0L); + Pig pig1 = new Pig("佩奇",birthday); + Pig pig2 = (Pig) pig1.clone(); + System.out.println(pig1); + System.out.println(pig2); + + pig1.getBirthday().setTime(666666666666L); + + System.out.println(pig1); + System.out.println(pig2); + +// HungrySingleton hungrySingleton = HungrySingleton.getInstance(); +// Method method = hungrySingleton.getClass().getDeclaredMethod("clone"); +// method.setAccessible(true); +// HungrySingleton cloneHungrySingleton = (HungrySingleton) method.invoke(hungrySingleton); +// System.out.println(hungrySingleton); +// System.out.println(cloneHungrySingleton); + + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/JavaVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/JavaVideo.java new file mode 100644 index 0000000..33e6865 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/JavaVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.simplefactory; + +/** + * Created by js + */ +public class JavaVideo extends Video { + @Override + public void produce() { + System.out.println("录制Java课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/PythonVideo.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/PythonVideo.java new file mode 100644 index 0000000..a903a62 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/PythonVideo.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.creational.simplefactory; + +/** + * Created by js + */ +public class PythonVideo extends Video { + @Override + public void produce() { + System.out.println("录制Python课程视频"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Test.java new file mode 100644 index 0000000..b789a71 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Test.java @@ -0,0 +1,26 @@ +package com.javaBasic.DesignPatterns.creational.simplefactory; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { +// VideoFactory videoFactory = new VideoFactory(); +// Video video = videoFactory.getVideo("java"); +// if(video == null){ +// return; +// } +// video.produce(); + + VideoFactory videoFactory = new VideoFactory(); + Video video = videoFactory.getVideo(JavaVideo.class); + if(video == null){ + return; + } + video.produce(); + + + + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Video.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Video.java new file mode 100644 index 0000000..c10927c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/Video.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.creational.simplefactory; + +/** + * Created by js + */ +public abstract class Video { + public abstract void produce(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/VideoFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/VideoFactory.java new file mode 100644 index 0000000..cf6038d --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/simplefactory/VideoFactory.java @@ -0,0 +1,31 @@ +package com.javaBasic.DesignPatterns.creational.simplefactory; + +/** + * Created by js + */ +public class VideoFactory { + public Video getVideo(Class c){ + Video video = null; + try { + video = (Video) Class.forName(c.getName()).newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return video; + } + + + public Video getVideo(String type){ + if("java".equalsIgnoreCase(type)){ + return new JavaVideo(); + }else if("python".equalsIgnoreCase(type)){ + return new PythonVideo(); + } + return null; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ContainerSingleton.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ContainerSingleton.java new file mode 100644 index 0000000..7caff77 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ContainerSingleton.java @@ -0,0 +1,31 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by js + */ +public class ContainerSingleton { + + private ContainerSingleton(){ + + } + private static Map singletonMap = new HashMap(); + + public static void putInstance(String key,Object instance){ + if(StringUtils.isNotBlank(key) && instance != null){ + if(!singletonMap.containsKey(key)){ + singletonMap.put(key,instance); + } + } + } + + public static Object getInstance(String key){ + return singletonMap.get(key); + } + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/EnumInstance.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/EnumInstance.java new file mode 100644 index 0000000..c628ab9 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/EnumInstance.java @@ -0,0 +1,26 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public enum EnumInstance { + INSTANCE{ + protected void printTest(){ + System.out.println("js Print Test"); + } + }; + protected abstract void printTest(); + private Object data; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + public static EnumInstance getInstance(){ + return INSTANCE; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/HungrySingleton.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/HungrySingleton.java new file mode 100644 index 0000000..5fc6537 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/HungrySingleton.java @@ -0,0 +1,32 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import java.io.Serializable; + +/** + * Created by js + */ +public class HungrySingleton implements Serializable,Cloneable{ + + private final static HungrySingleton hungrySingleton; + + static{ + hungrySingleton = new HungrySingleton(); + } + private HungrySingleton(){ + if(hungrySingleton != null){ + throw new RuntimeException("单例构造器禁止反射调用"); + } + } + public static HungrySingleton getInstance(){ + return hungrySingleton; + } + + private Object readResolve(){ + return hungrySingleton; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return getInstance(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazyDoubleCheckSingleton.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazyDoubleCheckSingleton.java new file mode 100644 index 0000000..86a470e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazyDoubleCheckSingleton.java @@ -0,0 +1,26 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public class LazyDoubleCheckSingleton { + private volatile static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null; + private LazyDoubleCheckSingleton(){ + + } + public static LazyDoubleCheckSingleton getInstance(){ + if(lazyDoubleCheckSingleton == null){ + synchronized (LazyDoubleCheckSingleton.class){ + if(lazyDoubleCheckSingleton == null){ + lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton(); + //1.分配内存给这个对象 +// //3.设置lazyDoubleCheckSingleton 指向刚分配的内存地址 + //2.初始化对象 +// intra-thread semantics +// ---------------//3.设置lazyDoubleCheckSingleton 指向刚分配的内存地址 + } + } + } + return lazyDoubleCheckSingleton; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingleton.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingleton.java new file mode 100644 index 0000000..b3e50fb --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingleton.java @@ -0,0 +1,48 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + +/** + * Created by js + */ +public class LazySingleton implements Cloneable{ + private static LazySingleton lazySingleton = null; + private LazySingleton(){ + if(lazySingleton != null){ + throw new RuntimeException("单例构造器禁止反射调用"); + } + } + public synchronized static LazySingleton getInstance(){ + if(lazySingleton == null){ + lazySingleton = new LazySingleton(); + } + return lazySingleton; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return getInstance(); + } + + public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, CloneNotSupportedException { + Class objectClass = LazySingleton.class; + Constructor c = objectClass.getDeclaredConstructor(); + c.setAccessible(true); + + System.out.println(c); + LazySingleton o2 = (LazySingleton) c.newInstance(); + LazySingleton o3 = new LazySingleton(); + LazySingleton o1 = LazySingleton.getInstance(); + + System.out.println(o1); + System.out.println(o2); + System.out.println(o1==o2); + System.out.println(o3); + + LazySingleton o4 = (LazySingleton) o1.clone(); + System.out.println(o4); + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingletonUnsafe.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingletonUnsafe.java new file mode 100644 index 0000000..e5b15cc --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/LazySingletonUnsafe.java @@ -0,0 +1,36 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public class LazySingletonUnsafe { + private static LazySingletonUnsafe lazySingleton = null; + private LazySingletonUnsafe(){ + } + public static LazySingletonUnsafe getInstance(){ + if(lazySingleton == null){ + lazySingleton = new LazySingletonUnsafe(); + } + return lazySingleton; + } + +// public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException { +// Class objectClass = LazySingleton.class; +// Constructor c = objectClass.getDeclaredConstructor(); +// c.setAccessible(true); +// +// LazySingleton o1 = LazySingleton.getInstance(); +// +// Field flag = o1.getClass().getDeclaredField("flag"); +// flag.setAccessible(true); +// flag.set(o1,true); +// +// +// LazySingleton o2 = (LazySingleton) c.newInstance(); +// +// System.out.println(o1); +// System.out.println(o2); +// System.out.println(o1==o2); +// } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/StaticInnerClassSingleton.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/StaticInnerClassSingleton.java new file mode 100644 index 0000000..d61566d --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/StaticInnerClassSingleton.java @@ -0,0 +1,20 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public class StaticInnerClassSingleton { + private static class InnerClass{ + private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton(); + } + public static StaticInnerClassSingleton getInstance(){ + return InnerClass.staticInnerClassSingleton; + } + private StaticInnerClassSingleton(){ + if(InnerClass.staticInnerClassSingleton != null){ + throw new RuntimeException("单例构造器禁止反射调用"); + } + } + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/T.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/T.java new file mode 100644 index 0000000..1820584 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/T.java @@ -0,0 +1,23 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public class T implements Runnable { + @Override + public void run() { +// LazySingleton lazySingleton = LazySingleton.getInstance(); +// LazyDoubleCheckSingleton instance = LazyDoubleCheckSingleton.getInstance(); +// StaticInnerClassSingleton instance = StaticInnerClassSingleton.getInstance();; + +// ContainerSingleton.putInstance("object",new Object()); +// Object instance = ContainerSingleton.getInstance("object"); +// +// +// ThreadLocalInstance instance = ThreadLocalInstance.getInstance(); + + LazySingletonUnsafe lazySingletonUnsafe = LazySingletonUnsafe.getInstance(); + System.out.println(Thread.currentThread().getName()+" "+lazySingletonUnsafe); + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test.java new file mode 100644 index 0000000..a51f0e7 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test.java @@ -0,0 +1,84 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { +// LazySingleton lazySingleton = LazySingleton.getInstance(); + + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + System.out.println("main thread"+ThreadLocalInstance.getInstance()); + + Thread t1 = new Thread(new T()); + Thread t2 = new Thread(new T()); + t1.start(); + t2.start(); + System.out.println("program end"); + +// HungrySingleton instance = HungrySingleton.getInstance(); +// EnumInstance instance = EnumInstance.getInstance(); +// instance.setData(new Object()); +// +// ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton_file")); +// oos.writeObject(instance); +// +// File file = new File("singleton_file"); +// ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); +// +//// HungrySingleton newInstance = (HungrySingleton) ois.readObject(); +// EnumInstance newInstance = (EnumInstance) ois.readObject(); +// +// System.out.println(instance.getData()); +// System.out.println(newInstance.getData()); +// System.out.println(instance.getData() == newInstance.getData()); + +// Class objectClass = HungrySingleton.class; +// Class objectClass = StaticInnerClassSingleton.class; + +// Class objectClass = LazySingleton.class; +// Class objectClass = EnumInstance.class; +//// +// Constructor constructor = objectClass.getDeclaredConstructor(String.class,int.class); +// +// constructor.setAccessible(true); +// EnumInstance instance = (EnumInstance) constructor.newInstance("js",666); + + +// +// LazySingleton newInstance = (LazySingleton) constructor.newInstance(); +// LazySingleton instance = LazySingleton.getInstance(); + + + +// StaticInnerClassSingleton instance = StaticInnerClassSingleton.getInstance(); +// StaticInnerClassSingleton newInstance = (StaticInnerClassSingleton) constructor.newInstance(); + +// HungrySingleton newInstance = (HungrySingleton) constructor.newInstance(); +// HungrySingleton instance = HungrySingleton.getInstance(); + + +// System.out.println(instance); +// System.out.println(newInstance); +// System.out.println(instance == newInstance); + + EnumInstance instance = EnumInstance.getInstance(); + instance.printTest(); + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test2.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test2.java new file mode 100644 index 0000000..141ceed --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Test2.java @@ -0,0 +1,13 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +public class Test2 { + public static void main(String[] args) { + Thread t1 = new Thread(new T()); + Thread t2 = new Thread(new T()); + + t1.start(); + t2.start(); + + System.out.println("end"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ThreadLocalInstance.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ThreadLocalInstance.java new file mode 100644 index 0000000..c8e6eb5 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/ThreadLocalInstance.java @@ -0,0 +1,22 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +/** + * Created by js + */ +public class ThreadLocalInstance { + private static final ThreadLocal threadLocalInstanceThreadLocal + = new ThreadLocal(){ + @Override + protected ThreadLocalInstance initialValue() { + return new ThreadLocalInstance(); + } + }; + private ThreadLocalInstance(){ + + } + + public static ThreadLocalInstance getInstance(){ + return threadLocalInstanceThreadLocal.get(); + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/TicketTest.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/TicketTest.java new file mode 100644 index 0000000..0979073 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/TicketTest.java @@ -0,0 +1,41 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import java.util.Random; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +/** + * @author JS + * @version 1.0 + * @date 2023年3月31日 11:15 + * @description //TODO + */ +public class TicketTest { + public static void main(String[] args) throws InterruptedException, BrokenBarrierException { + CyclicBarrier cyclicBarrier = new CyclicBarrier(3); + for (int i = 0; i < 3; i++) { + + new Thread(() -> { + try { + Thread.sleep((long)(Math.random() * 2000)); + int randomInt = new Random().nextInt(500); + System.out.println("准备 " + randomInt); + + cyclicBarrier.await(); + while (true) { + Tickets tickets = Tickets.createTickets(); + if (tickets == null) { + System.out.println("对不起,门票已经卖完"); + break; + } + } + System.out.println("结束 " + randomInt); + } catch (InterruptedException | BrokenBarrierException e) { + throw new RuntimeException(e); + } + }).start(); + } + + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Tickets.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Tickets.java new file mode 100644 index 0000000..4090e33 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/creational/singleton/Tickets.java @@ -0,0 +1,60 @@ +package com.javaBasic.DesignPatterns.creational.singleton; + +import java.util.Date; + +/** + * @author JS + * @version 1.0 + * @date 2023年3月31日 11:14 + * @description //要求:创建一个门票类,开启3个线程进行售卖,总共只有500张票。 + * 这里采用DCL懒汉式实现。 + */ +public class Tickets { + private static int count = 0; // 以售卖票数 + private final static int num = 500; // 门票数目 + private Date time; + private Double price; + + private Tickets() { + count++; + } + + private Tickets(Date time, Double price) { + this.time = time; + this.price = price; + count++; + } + + // 无参 + public static Tickets createTickets(){ + if (count items = new ArrayList(); + private String name; + private Integer level; + + + public CourseCatalog(String name,Integer level) { + this.name = name; + this.level = level; + } + + @Override + public void add(CatalogComponent catalogComponent) { + items.add(catalogComponent); + } + + @Override + public String getName(CatalogComponent catalogComponent) { + return this.name; + } + + @Override + public void remove(CatalogComponent catalogComponent) { + items.remove(catalogComponent); + } + + @Override + public void print() { + System.out.println(this.name); + for(CatalogComponent catalogComponent : items){ + if(this.level != null){ + for(int i = 0; i < this.level; i++){ + System.out.print(" "); + } + } + catalogComponent.print(); + } + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/composite/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/composite/Test.java new file mode 100644 index 0000000..b282fb8 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/composite/Test.java @@ -0,0 +1,31 @@ +package com.javaBasic.DesignPatterns.structural.composite; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + CatalogComponent linuxCourse = new Course("Linux课程",11); + CatalogComponent windowsCourse = new Course("Windows课程",11); + + CatalogComponent javaCourseCatalog = new CourseCatalog("Java课程目录",2); + + CatalogComponent mmallCourse1 = new Course("Java电商一期",55); + CatalogComponent mmallCourse2 = new Course("Java电商二期",66); + CatalogComponent designPattern = new Course("Java设计模式",77); + + javaCourseCatalog.add(mmallCourse1); + javaCourseCatalog.add(mmallCourse2); + javaCourseCatalog.add(designPattern); + + CatalogComponent imoocMainCourseCatalog = new CourseCatalog("慕课网课程主目录",1); + imoocMainCourseCatalog.add(linuxCourse); + imoocMainCourseCatalog.add(windowsCourse); + imoocMainCourseCatalog.add(javaCourseCatalog); + + imoocMainCourseCatalog.print(); + + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Battercake.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Battercake.java new file mode 100644 index 0000000..3a0e153 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Battercake.java @@ -0,0 +1,14 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v1; + +/** + * Created by js + */ +public class Battercake { + protected String getDesc(){ + return "煎饼"; + } + protected int cost(){ + return 8; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEgg.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEgg.java new file mode 100644 index 0000000..9b7c3e5 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEgg.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v1; + +/** + * Created by js + */ +public class BattercakeWithEgg extends Battercake { + @Override + public String getDesc() { + return super.getDesc()+" 加一个鸡蛋"; + } + + @Override + public int cost() { + return super.cost()+1; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEggSausage.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEggSausage.java new file mode 100644 index 0000000..9aee694 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/BattercakeWithEggSausage.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v1; + +/** + * Created by js + */ +public class BattercakeWithEggSausage extends BattercakeWithEgg { + @Override + public String getDesc() { + return super.getDesc()+ " 加一根香肠"; + } + + @Override + public int cost() { + return super.cost()+2; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Test.java new file mode 100644 index 0000000..0150216 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v1/Test.java @@ -0,0 +1,20 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v1; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + Battercake battercake = new Battercake(); + System.out.println(battercake.getDesc()+" 销售价格:"+battercake.cost()); + + Battercake battercakeWithEgg = new BattercakeWithEgg(); + System.out.println(battercakeWithEgg.getDesc()+" 销售价格:"+battercakeWithEgg.cost()); + + + Battercake battercakeWithEggSausage = new BattercakeWithEggSausage(); + System.out.println(battercakeWithEggSausage.getDesc()+" 销售价格:"+battercakeWithEggSausage.cost()); + + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/ABattercake.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/ABattercake.java new file mode 100644 index 0000000..5f3633c --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/ABattercake.java @@ -0,0 +1,10 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +/** + * Created by js + */ +public abstract class ABattercake { + protected abstract String getDesc(); + protected abstract int cost(); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/AbstractDecorator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/AbstractDecorator.java new file mode 100644 index 0000000..060d64b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/AbstractDecorator.java @@ -0,0 +1,24 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +/** + * Created by js + */ +public abstract class AbstractDecorator extends ABattercake { + private ABattercake aBattercake; + + public AbstractDecorator(ABattercake aBattercake) { + this.aBattercake = aBattercake; + } + + protected abstract void doSomething(); + + @Override + protected String getDesc() { + return this.aBattercake.getDesc(); + } + + @Override + protected int cost() { + return this.aBattercake.cost(); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Battercake.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Battercake.java new file mode 100644 index 0000000..df50405 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Battercake.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +/** + * Created by js + */ +public class Battercake extends ABattercake { + @Override + protected String getDesc() { + return "煎饼"; + } + + @Override + protected int cost() { + return 8; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/EggDecorator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/EggDecorator.java new file mode 100644 index 0000000..b7fbc4e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/EggDecorator.java @@ -0,0 +1,25 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +/** + * Created by js + */ +public class EggDecorator extends AbstractDecorator { + public EggDecorator(ABattercake aBattercake) { + super(aBattercake); + } + + @Override + protected void doSomething() { + + } + + @Override + protected String getDesc() { + return super.getDesc()+" 加一个鸡蛋"; + } + + @Override + protected int cost() { + return super.cost()+1; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/SausageDecorator.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/SausageDecorator.java new file mode 100644 index 0000000..72936c9 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/SausageDecorator.java @@ -0,0 +1,25 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +/** + * Created by js + */ +public class SausageDecorator extends AbstractDecorator{ + public SausageDecorator(ABattercake aBattercake) { + super(aBattercake); + } + + @Override + protected void doSomething() { + + } + + @Override + protected String getDesc() { + return super.getDesc()+" 加一根香肠"; + } + + @Override + protected int cost() { + return super.cost()+2; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Test.java new file mode 100644 index 0000000..336d298 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/decorator/v2/Test.java @@ -0,0 +1,31 @@ +package com.javaBasic.DesignPatterns.structural.decorator.v2; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + ABattercake aBattercake; + aBattercake = new Battercake(); + aBattercake = new EggDecorator(aBattercake); + aBattercake = new EggDecorator(aBattercake); + aBattercake = new SausageDecorator(aBattercake); + + System.out.println(aBattercake.getDesc()+" 销售价格:"+aBattercake.cost()); + + InputStreamReader isr = new InputStreamReader(System.in); // 读取 + // 创建字符流缓冲区 + BufferedReader br = new BufferedReader(isr); // 缓冲 + // 读取一个文本行 + try { + String s = br.readLine(); // 阻塞式,当没有数据读取时,就一直会阻塞,而不是返回null + } catch (IOException e) { + e.printStackTrace(); + } + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/GiftExchangeService.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/GiftExchangeService.java new file mode 100644 index 0000000..d221da3 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/GiftExchangeService.java @@ -0,0 +1,22 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class GiftExchangeService { + private QualifyService qualifyService = new QualifyService(); + private PointsPaymentService pointsPaymentService = new PointsPaymentService(); + private ShippingService shippingService = new ShippingService(); + + public void giftExchange(PointsGift pointsGift){ + if(qualifyService.isAvailable(pointsGift)){ + //资格校验通过 + if(pointsPaymentService.pay(pointsGift)){ + //如果支付积分成功 + String shippingOrderNo = shippingService.shipGift(pointsGift); + System.out.println("物流系统下单成功,订单号是:"+shippingOrderNo); + } + } + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsGift.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsGift.java new file mode 100644 index 0000000..7c8ead4 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsGift.java @@ -0,0 +1,16 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class PointsGift { + private String name; + + public PointsGift(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsPaymentService.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsPaymentService.java new file mode 100644 index 0000000..9417b0b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/PointsPaymentService.java @@ -0,0 +1,13 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class PointsPaymentService { + public boolean pay(PointsGift pointsGift){ + //扣减积分 + System.out.println("支付"+pointsGift.getName()+" 积分成功"); + return true; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/QualifyService.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/QualifyService.java new file mode 100644 index 0000000..22ae858 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/QualifyService.java @@ -0,0 +1,11 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class QualifyService { + public boolean isAvailable(PointsGift pointsGift){ + System.out.println("校验"+pointsGift.getName()+" 积分资格通过,库存通过"); + return true; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/ShippingService.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/ShippingService.java new file mode 100644 index 0000000..61e21fa --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/ShippingService.java @@ -0,0 +1,13 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class ShippingService { + public String shipGift(PointsGift pointsGift){ + //物流系统的对接逻辑 + System.out.println(pointsGift.getName()+"进入物流系统"); + String shippingOrderNo = "666"; + return shippingOrderNo; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/Test.java new file mode 100644 index 0000000..aef9b24 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/facade/Test.java @@ -0,0 +1,12 @@ +package com.javaBasic.DesignPatterns.structural.facade; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + PointsGift pointsGift = new PointsGift("T恤"); + GiftExchangeService giftExchangeService = new GiftExchangeService(); + giftExchangeService.giftExchange(pointsGift); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Employee.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Employee.java new file mode 100644 index 0000000..22a2745 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Employee.java @@ -0,0 +1,8 @@ +package com.javaBasic.DesignPatterns.structural.flyweight; + +/** + * Created by js + */ +public interface Employee { + void report(); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/EmployeeFactory.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/EmployeeFactory.java new file mode 100644 index 0000000..547bd9f --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/EmployeeFactory.java @@ -0,0 +1,27 @@ +package com.javaBasic.DesignPatterns.structural.flyweight; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by js + */ +public class EmployeeFactory { + private static final Map EMPLOYEE_MAP = new HashMap(); + + public static Employee getManager(String department){ + Manager manager = (Manager) EMPLOYEE_MAP.get(department); + + if(manager == null){ + manager = new Manager(department); + System.out.print("创建部门经理:"+department); + String reportContent = department+"部门汇报:此次报告的主要内容是......"; + manager.setReportContent(reportContent); + System.out.println(" 创建报告:"+reportContent); + EMPLOYEE_MAP.put(department,manager); + + } + return manager; + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Manager.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Manager.java new file mode 100644 index 0000000..12c3157 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Manager.java @@ -0,0 +1,24 @@ +package com.javaBasic.DesignPatterns.structural.flyweight; + +/** + * Created by js + */ +public class Manager implements Employee { + @Override + public void report() { + System.out.println(reportContent); + } + private String title = "部门经理"; + private String department; + private String reportContent; + + public void setReportContent(String reportContent) { + this.reportContent = reportContent; + } + + public Manager(String department) { + this.department = department; + } + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Test.java new file mode 100644 index 0000000..51f8f28 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/flyweight/Test.java @@ -0,0 +1,27 @@ +package com.javaBasic.DesignPatterns.structural.flyweight; + +/** + * Created by js + */ +public class Test { + private static final String departments[] = {"RD","QA","PM","BD"}; + + public static void main(String[] args) { +// for(int i=0; i<10; i++){ +// String department = departments[(int)(Math.random() * departments.length)]; +// Manager manager = (Manager) EmployeeFactory.getManager(department); +// manager.report(); +// +// } + Integer a = Integer.valueOf(100); + Integer b = 100; + + Integer c = Integer.valueOf(1000); + Integer d = 1000; + + System.out.println("a==b:"+(a==b)); + + System.out.println("c==d:"+(c==d)); + + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderDao.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderDao.java new file mode 100644 index 0000000..7800c85 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderDao.java @@ -0,0 +1,9 @@ +package com.javaBasic.DesignPatterns.structural.proxy; + +/** + * Created by js + */ +public interface IOrderDao { + int insert(Order order); + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderService.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderService.java new file mode 100644 index 0000000..10b3f49 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/IOrderService.java @@ -0,0 +1,8 @@ +package com.javaBasic.DesignPatterns.structural.proxy; + +/** + * Created by js + */ +public interface IOrderService { + int saveOrder(Order order); +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/Order.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/Order.java new file mode 100644 index 0000000..8cf465e --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/Order.java @@ -0,0 +1,25 @@ +package com.javaBasic.DesignPatterns.structural.proxy; + +/** + * Created by js + */ +public class Order { + private Object orderInfo; + private Integer userId; + + public Object getOrderInfo() { + return orderInfo; + } + + public void setOrderInfo(Object orderInfo) { + this.orderInfo = orderInfo; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderDaoImpl.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderDaoImpl.java new file mode 100644 index 0000000..89c6fb9 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderDaoImpl.java @@ -0,0 +1,12 @@ +package com.javaBasic.DesignPatterns.structural.proxy; + +/** + * Created by js + */ +public class OrderDaoImpl implements IOrderDao { + @Override + public int insert(Order order) { + System.out.println("Dao层添加Order成功"); + return 1; + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderServiceImpl.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderServiceImpl.java new file mode 100644 index 0000000..7c19193 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/OrderServiceImpl.java @@ -0,0 +1,18 @@ +package com.javaBasic.DesignPatterns.structural.proxy; + +/** + * Created by js + */ +public class OrderServiceImpl implements IOrderService { + private IOrderDao iOrderDao; + + + @Override + public int saveOrder(Order order) { + //Spring会自己注入,我们课程中就直接new了 + iOrderDao = new OrderDaoImpl(); + System.out.println("Service层调用Dao层添加Order"); + return iOrderDao.insert(order); + } + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DataSourceContextHolder.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DataSourceContextHolder.java new file mode 100644 index 0000000..4a7e143 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DataSourceContextHolder.java @@ -0,0 +1,20 @@ +package com.javaBasic.DesignPatterns.structural.proxy.db; + +/** + * Created by js + */ +public class DataSourceContextHolder { + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal(); + + public static void setDBType(String dbType){ + CONTEXT_HOLDER.set(dbType); + } + public static String getDBType(){ + return (String)CONTEXT_HOLDER.get(); + } + public static void clearDBType(){ + CONTEXT_HOLDER.remove(); + } + + +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DynamicDataSource.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DynamicDataSource.java new file mode 100644 index 0000000..7c2448b --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/db/DynamicDataSource.java @@ -0,0 +1,99 @@ +package com.javaBasic.DesignPatterns.structural.proxy.db; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * Created by js + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + @Override + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDBType(); + } + + + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + +// +// +//
    +// +// +//
+//
+// +//
+ + +// +// +// +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/OrderServiceDynamicProxy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/OrderServiceDynamicProxy.java new file mode 100644 index 0000000..f4b62eb --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/OrderServiceDynamicProxy.java @@ -0,0 +1,55 @@ +package com.javaBasic.DesignPatterns.structural.proxy.dynamicproxy; + +import com.javaBasic.DesignPatterns.structural.proxy.Order; +import com.javaBasic.DesignPatterns.structural.proxy.db.DataSourceContextHolder; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * Created by js + */ +public class OrderServiceDynamicProxy implements InvocationHandler { + + private Object target; + + public OrderServiceDynamicProxy(Object target) { + this.target = target; + } + + public Object bind(){ + Class cls = target.getClass(); + return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),this); + } + + + + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object argObject = args[0]; + beforeMethod(argObject); + Object object = method.invoke(target,args); + afterMethod(); + return object; + } + + private void beforeMethod(Object obj){ + int userId = 0; + System.out.println("动态代理 before code"); + if(obj instanceof Order){ + Order order = (Order)obj; + userId = order.getUserId(); + } + int dbRouter = userId % 2; + System.out.println("动态代理分配到【db"+dbRouter+"】处理数据"); + + //todo 设置dataSource; + DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter)); + } + + private void afterMethod(){ + System.out.println("动态代理 after code"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/Test.java new file mode 100644 index 0000000..d2880d0 --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/dynamicproxy/Test.java @@ -0,0 +1,20 @@ +package com.javaBasic.DesignPatterns.structural.proxy.dynamicproxy; + + +import com.javaBasic.DesignPatterns.structural.proxy.IOrderService; +import com.javaBasic.DesignPatterns.structural.proxy.Order; +import com.javaBasic.DesignPatterns.structural.proxy.OrderServiceImpl; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + Order order = new Order(); +// order.setUserId(2); + order.setUserId(1); + IOrderService orderServiceDynamicProxy = (IOrderService) new OrderServiceDynamicProxy(new OrderServiceImpl()).bind(); + + orderServiceDynamicProxy.saveOrder(order); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/OrderServiceStaticProxy.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/OrderServiceStaticProxy.java new file mode 100644 index 0000000..05063bf --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/OrderServiceStaticProxy.java @@ -0,0 +1,35 @@ +package com.javaBasic.DesignPatterns.structural.proxy.staticproxy; + + +import com.javaBasic.DesignPatterns.structural.proxy.IOrderService; +import com.javaBasic.DesignPatterns.structural.proxy.Order; +import com.javaBasic.DesignPatterns.structural.proxy.OrderServiceImpl; +import com.javaBasic.DesignPatterns.structural.proxy.db.DataSourceContextHolder; + +/** + * Created by js + */ +public class OrderServiceStaticProxy { + private IOrderService iOrderService; + + public int saveOrder(Order order){ + beforeMethod(order); + iOrderService = new OrderServiceImpl(); + int result = iOrderService.saveOrder(order); + afterMethod(); + return result; + } + + private void beforeMethod(Order order){ + int userId = order.getUserId(); + int dbRouter = userId % 2; + System.out.println("静态代理分配到【db"+dbRouter+"】处理数据"); + + //todo 设置dataSource; + DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter)); + System.out.println("静态代理 before code"); + } + private void afterMethod(){ + System.out.println("静态代理 after code"); + } +} diff --git a/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/Test.java b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/Test.java new file mode 100644 index 0000000..d8215fd --- /dev/null +++ b/comxjtu/src/main/java/com/javaBasic/DesignPatterns/structural/proxy/staticproxy/Test.java @@ -0,0 +1,17 @@ +package com.javaBasic.DesignPatterns.structural.proxy.staticproxy; + + +import com.javaBasic.DesignPatterns.structural.proxy.Order; + +/** + * Created by js + */ +public class Test { + public static void main(String[] args) { + Order order = new Order(); + order.setUserId(2); + + OrderServiceStaticProxy orderServiceStaticProxy = new OrderServiceStaticProxy(); + orderServiceStaticProxy.saveOrder(order); + } +} diff --git a/comxjtu/src/main/java/com/java/Dijkstra/Dijkstra.java b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Dijkstra.java similarity index 99% rename from comxjtu/src/main/java/com/java/Dijkstra/Dijkstra.java rename to comxjtu/src/main/java/com/javaBasic/Dijkstra/Dijkstra.java index 640df48..ce71e05 100644 --- a/comxjtu/src/main/java/com/java/Dijkstra/Dijkstra.java +++ b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Dijkstra.java @@ -1,4 +1,4 @@ -package com.java.Dijkstra; +package com.javaBasic.Dijkstra; import java.util.ArrayList; import java.util.Collections; diff --git a/comxjtu/src/main/java/com/java/Dijkstra/Edge.java b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Edge.java similarity index 95% rename from comxjtu/src/main/java/com/java/Dijkstra/Edge.java rename to comxjtu/src/main/java/com/javaBasic/Dijkstra/Edge.java index 1477ec9..291b79b 100644 --- a/comxjtu/src/main/java/com/java/Dijkstra/Edge.java +++ b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Edge.java @@ -1,4 +1,4 @@ -package com.java.Dijkstra; +package com.javaBasic.Dijkstra; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/java/Dijkstra/Graph.java b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Graph.java similarity index 97% rename from comxjtu/src/main/java/com/java/Dijkstra/Graph.java rename to comxjtu/src/main/java/com/javaBasic/Dijkstra/Graph.java index c7b6890..dbde8de 100644 --- a/comxjtu/src/main/java/com/java/Dijkstra/Graph.java +++ b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Graph.java @@ -1,4 +1,4 @@ -package com.java.Dijkstra; +package com.javaBasic.Dijkstra; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/java/Dijkstra/Vertex.java b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Vertex.java similarity index 87% rename from comxjtu/src/main/java/com/java/Dijkstra/Vertex.java rename to comxjtu/src/main/java/com/javaBasic/Dijkstra/Vertex.java index e4eb663..4d2a08e 100644 --- a/comxjtu/src/main/java/com/java/Dijkstra/Vertex.java +++ b/comxjtu/src/main/java/com/javaBasic/Dijkstra/Vertex.java @@ -1,4 +1,4 @@ -package com.java.Dijkstra; +package com.javaBasic.Dijkstra; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/java/concurrent/AtomicTest.java b/comxjtu/src/main/java/com/javaBasic/concurrent/AtomicTest.java similarity index 99% rename from comxjtu/src/main/java/com/java/concurrent/AtomicTest.java rename to comxjtu/src/main/java/com/javaBasic/concurrent/AtomicTest.java index a625ef1..c2e8306 100644 --- a/comxjtu/src/main/java/com/java/concurrent/AtomicTest.java +++ b/comxjtu/src/main/java/com/javaBasic/concurrent/AtomicTest.java @@ -1,4 +1,4 @@ -package com.java.concurrent; +package com.javaBasic.concurrent; import java.io.File; import java.io.FileFilter; diff --git a/comxjtu/src/main/java/com/java/concurrent/CountDownL.java b/comxjtu/src/main/java/com/javaBasic/concurrent/CountDownL.java similarity index 97% rename from comxjtu/src/main/java/com/java/concurrent/CountDownL.java rename to comxjtu/src/main/java/com/javaBasic/concurrent/CountDownL.java index 576f8f0..1b99a83 100644 --- a/comxjtu/src/main/java/com/java/concurrent/CountDownL.java +++ b/comxjtu/src/main/java/com/javaBasic/concurrent/CountDownL.java @@ -1,4 +1,4 @@ -package com.java.concurrent; +package com.javaBasic.concurrent; import java.util.concurrent.CountDownLatch; diff --git a/comxjtu/src/main/java/com/java/concurrent/CycliBarr.java b/comxjtu/src/main/java/com/javaBasic/concurrent/CycliBarr.java similarity index 97% rename from comxjtu/src/main/java/com/java/concurrent/CycliBarr.java rename to comxjtu/src/main/java/com/javaBasic/concurrent/CycliBarr.java index 4762742..feea068 100644 --- a/comxjtu/src/main/java/com/java/concurrent/CycliBarr.java +++ b/comxjtu/src/main/java/com/javaBasic/concurrent/CycliBarr.java @@ -1,4 +1,4 @@ -package com.java.concurrent; +package com.javaBasic.concurrent; import java.util.Random; import java.util.concurrent.BrokenBarrierException; diff --git a/comxjtu/src/main/java/com/java/concurrent/ThreadCommunication.java b/comxjtu/src/main/java/com/javaBasic/concurrent/ThreadCommunication.java similarity index 97% rename from comxjtu/src/main/java/com/java/concurrent/ThreadCommunication.java rename to comxjtu/src/main/java/com/javaBasic/concurrent/ThreadCommunication.java index 195be26..1854f47 100644 --- a/comxjtu/src/main/java/com/java/concurrent/ThreadCommunication.java +++ b/comxjtu/src/main/java/com/javaBasic/concurrent/ThreadCommunication.java @@ -1,4 +1,4 @@ -package com.java.concurrent; +package com.javaBasic.concurrent; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/java/concurrent/ThreadPoolTest.java b/comxjtu/src/main/java/com/javaBasic/concurrent/ThreadPoolTest.java similarity index 97% rename from comxjtu/src/main/java/com/java/concurrent/ThreadPoolTest.java rename to comxjtu/src/main/java/com/javaBasic/concurrent/ThreadPoolTest.java index df69ee5..b1101c6 100644 --- a/comxjtu/src/main/java/com/java/concurrent/ThreadPoolTest.java +++ b/comxjtu/src/main/java/com/javaBasic/concurrent/ThreadPoolTest.java @@ -1,4 +1,4 @@ -package com.java.concurrent; +package com.javaBasic.concurrent; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; diff --git a/comxjtu/src/main/java/com/java/other/FanShe.java b/comxjtu/src/main/java/com/javaBasic/other/FanShe.java similarity index 82% rename from comxjtu/src/main/java/com/java/other/FanShe.java rename to comxjtu/src/main/java/com/javaBasic/other/FanShe.java index 5f76165..627f9aa 100644 --- a/comxjtu/src/main/java/com/java/other/FanShe.java +++ b/comxjtu/src/main/java/com/javaBasic/other/FanShe.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; /** * @Author: Jay @@ -18,7 +18,7 @@ public static void main(String[] args) { //第三种方式获取Class对象 try { - Class stuClass3 = Class.forName("com.java.other.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 + Class stuClass3 = Class.forName("com.javaBasic.other.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象 } catch (ClassNotFoundException e) { e.printStackTrace(); diff --git a/comxjtu/src/main/java/com/java/other/Hash.java b/comxjtu/src/main/java/com/javaBasic/other/Hash.java similarity index 93% rename from comxjtu/src/main/java/com/java/other/Hash.java rename to comxjtu/src/main/java/com/javaBasic/other/Hash.java index 768116f..a2a3fbe 100644 --- a/comxjtu/src/main/java/com/java/other/Hash.java +++ b/comxjtu/src/main/java/com/javaBasic/other/Hash.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; import java.util.HashSet; diff --git a/comxjtu/src/main/java/com/java/other/LinkedHashMapTest.java b/comxjtu/src/main/java/com/javaBasic/other/LinkedHashMapTest.java similarity index 96% rename from comxjtu/src/main/java/com/java/other/LinkedHashMapTest.java rename to comxjtu/src/main/java/com/javaBasic/other/LinkedHashMapTest.java index c82b575..ce8d55d 100644 --- a/comxjtu/src/main/java/com/java/other/LinkedHashMapTest.java +++ b/comxjtu/src/main/java/com/javaBasic/other/LinkedHashMapTest.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; import java.util.LinkedHashMap; diff --git a/comxjtu/src/main/java/com/java/other/Student.java b/comxjtu/src/main/java/com/javaBasic/other/Student.java similarity index 97% rename from comxjtu/src/main/java/com/java/other/Student.java rename to comxjtu/src/main/java/com/javaBasic/other/Student.java index 61c79c6..984edaf 100644 --- a/comxjtu/src/main/java/com/java/other/Student.java +++ b/comxjtu/src/main/java/com/javaBasic/other/Student.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; /** * @Author: Jay diff --git a/comxjtu/src/main/java/com/java/other/Test.java b/comxjtu/src/main/java/com/javaBasic/other/Test.java similarity index 97% rename from comxjtu/src/main/java/com/java/other/Test.java rename to comxjtu/src/main/java/com/javaBasic/other/Test.java index 3b77ee1..09dadfa 100644 --- a/comxjtu/src/main/java/com/java/other/Test.java +++ b/comxjtu/src/main/java/com/javaBasic/other/Test.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; diff --git a/comxjtu/src/main/java/com/java/other/TreeMapTest.java b/comxjtu/src/main/java/com/javaBasic/other/TreeMapTest.java similarity index 96% rename from comxjtu/src/main/java/com/java/other/TreeMapTest.java rename to comxjtu/src/main/java/com/javaBasic/other/TreeMapTest.java index 12540fa..06e1273 100644 --- a/comxjtu/src/main/java/com/java/other/TreeMapTest.java +++ b/comxjtu/src/main/java/com/javaBasic/other/TreeMapTest.java @@ -1,4 +1,4 @@ -package com.java.other; +package com.javaBasic.other; import java.util.*; diff --git a/comxjtu/src/main/java/com/leetcode/Question/Compare.java b/comxjtu/src/main/java/com/leetcode/Question/Compare.java new file mode 100644 index 0000000..0244e6c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/Compare.java @@ -0,0 +1,24 @@ +package com.leetcode.Question; + +public class Compare { + + public int compare(int a, int b){ + int c = a-b; + int scA = sign(c); + int scB = flip(scA); + return a*scA + b*scB; + } + + private int flip(int n) { + return n^1; + } + + private int sign(int n) { + return flip((n>>31)&1); + } + + public static void main(String[] args) { + Compare compare = new Compare(); + System.out.println(compare.compare(3,8)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/LC39.java b/comxjtu/src/main/java/com/leetcode/Question/LC39.java new file mode 100644 index 0000000..b05e663 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/LC39.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 17:07 + * @description //TODO + */ +public class LC39 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/LC40.java b/comxjtu/src/main/java/com/leetcode/Question/LC40.java new file mode 100644 index 0000000..6633935 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/LC40.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 17:07 + * @description //TODO + */ +public class LC40 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/ListNode.java b/comxjtu/src/main/java/com/leetcode/Question/ListNode.java index 3f366cc..3574dce 100644 --- a/comxjtu/src/main/java/com/leetcode/Question/ListNode.java +++ b/comxjtu/src/main/java/com/leetcode/Question/ListNode.java @@ -12,4 +12,6 @@ public class ListNode { ListNode(int x) { val = x; } + + ListNode(int val, ListNode next) { this.val = val; this.next = next;} } diff --git a/comxjtu/src/main/java/com/leetcode/Question/ValidParentheses.java b/comxjtu/src/main/java/com/leetcode/Question/ValidParentheses.java index a098ace..6144abd 100644 --- a/comxjtu/src/main/java/com/leetcode/Question/ValidParentheses.java +++ b/comxjtu/src/main/java/com/leetcode/Question/ValidParentheses.java @@ -6,7 +6,7 @@ * @Modified By: */ -import com.xjtu.ch1.Stack; +import com.algorithom4.ch1.Stack; import java.util.HashSet; import java.util.Set; diff --git a/comxjtu/src/main/java/com/leetcode/Question/hard/lc4.java b/comxjtu/src/main/java/com/leetcode/Question/hard/lc4.java new file mode 100644 index 0000000..7fde29a --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/hard/lc4.java @@ -0,0 +1,47 @@ +package com.leetcode.Question.hard; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月9日 17:47 + * @description //TODO + */ +public class lc4 { + public double findMedianSortedArrays(int[] nums1, int[] nums2) { + if (nums1.length==0 && nums2.length==0) return 0; + int i=0, j=0, len=nums1.length+nums2.length; + //len为偶数,则中位数是(len-1)/2与(len-1)/2+1的平均值;奇数:(len-1)/2 + while (i+j<(len-1)/2){ + if (i==nums1.length){ + int left = (len-1)/2-nums1.length; + if (len%2==1){ + return nums2[left]; + }else { + if (left==0){ + return (double) (nums1[nums1.length-1]+nums2[j])/2; + }else { + return (double) (nums2[left]+nums2[left+1])/2; + } + } + } + if (j==nums2.length){ + int left = (len-1)/2-nums2.length; + if (len%2==1){ + return nums1[left]; + }else { + if (left==0){ + return (double) (nums2[nums2.length-1]+nums1[i])/2; + }else { + return (double) (nums1[left]+nums1[left+1])/2; + } + } + } + if (nums1[i]= 2 * n * n) ans = 0; + else if (ans == -1) { + if (k % 2 == 0) { // mouse + boolean win = false, draw = false; + for (int ne : g[a]) { + int t = dfs(k + 1, ne, b); + if (t == 1) win = true; + else if (t == 0) draw = true; + if (win) break; + } + if (win) ans = 1; + else if (draw) ans = 0; + else ans = 2; + } else { // cat + boolean win = false, draw = false; + for (int ne : g[b]) { + if (ne == 0) continue; + int t = dfs(k + 1, a, ne); + if (t == 2) win = true; + else if (t == 0) draw = true; + if (win) break; + } + if (win) ans = 2; + else if (draw) ans = 0; + else ans = 1; + } + } + f[k][a][b] = ans; + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc123.java b/comxjtu/src/main/java/com/leetcode/Question/lc123.java new file mode 100644 index 0000000..3a76f31 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc123.java @@ -0,0 +1,23 @@ +package com.leetcode.Question; + +public class lc123 { + + public static void main(String[] args) { + + } + + public int maxProfit(int[] prices) { + int n = prices.length; + int buy1 = -prices[0], sell1 = 0; + int buy2 = -prices[0], sell2 = 0; + for (int i = 1; i < n; ++i) { + buy1 = Math.max(buy1, -prices[i]); + sell1 = Math.max(sell1, buy1 + prices[i]); + buy2 = Math.max(buy2, sell1 - prices[i]); + sell2 = Math.max(sell2, buy2 + prices[i]); + } + return sell2; + } + + +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc130.java b/comxjtu/src/main/java/com/leetcode/Question/lc130.java new file mode 100644 index 0000000..a64f6a2 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc130.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:30 + * @description //TODO + */ +public class lc130 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc131.java b/comxjtu/src/main/java/com/leetcode/Question/lc131.java new file mode 100644 index 0000000..6ee5e45 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc131.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 16:41 + * @description //TODO + */ +public class lc131 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc17.java b/comxjtu/src/main/java/com/leetcode/Question/lc17.java new file mode 100644 index 0000000..f4f309c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc17.java @@ -0,0 +1,47 @@ +package com.leetcode.Question; + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/19 15:16 + * @description + */ +public class lc17 { + + public List letterCombinations(String digits) { + List combinations = new ArrayList(); + if (digits.length() == 0) { + return combinations; + } + Map phoneMap = new HashMap() {{ + put('2', "abc"); + put('3', "def"); + put('4', "ghi"); + put('5', "jkl"); + put('6', "mno"); + put('7', "pqrs"); + put('8', "tuv"); + put('9', "wxyz"); + }}; + backtrack(combinations, phoneMap, digits, 0, new StringBuffer()); + return combinations; + } + + public void backtrack(List combinations, Map phoneMap, String digits, int index, StringBuffer combination) { + if (index == digits.length()) { + combinations.add(combination.toString()); + } else { + char digit = digits.charAt(index); + String letters = phoneMap.get(digit); + int lettersCount = letters.length(); + for (int i = 0; i < lettersCount; i++) { + combination.append(letters.charAt(i)); + backtrack(combinations, phoneMap, digits, index + 1, combination); + combination.deleteCharAt(index); + } + } + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc198.java b/comxjtu/src/main/java/com/leetcode/Question/lc198.java new file mode 100644 index 0000000..59c921b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc198.java @@ -0,0 +1,28 @@ +package com.leetcode.Question; + +public class lc198 { + public static void main(String[] args) { + } + + public int rob(int[] nums) { + + //入参判断及边界控制 + if (nums == null || nums.length == 0){ + return 0; + } + + // 状态定义:dp[i]表示第i个房子获得最大值 + //因为第 i 个位置和前面的两个位置都有关,这个时候我们可以把状态多开一格,dp[0] 表示的是一个房子都不抢的状态 + int[] dp = new int[nums.length+1]; + + //初始化 + dp[1] = nums[0]; + + for (int i = 2; i <= nums.length; i++) { + //状态转移方程:两种情况,抢或不抢 + dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i-1]); + } + + return dp[nums.length]; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc200.java b/comxjtu/src/main/java/com/leetcode/Question/lc200.java new file mode 100644 index 0000000..51dcef3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc200.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:25 + * @description //TODO + */ +public class lc200 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc213.java b/comxjtu/src/main/java/com/leetcode/Question/lc213.java new file mode 100644 index 0000000..984e4cc --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc213.java @@ -0,0 +1,45 @@ +package com.leetcode.Question; + +import java.util.Arrays; + +public class lc213 { + + public static void main(String[] args) { + + } + + public int rob(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + + if (nums.length == 1) { + return nums[0]; + } + + int n = nums.length; + + return Math.max( + robI(Arrays.copyOfRange(nums, 0, n - 1)), + robI(Arrays.copyOfRange(nums, 1, n)) + ); + } + + public int robI(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + + int n = nums.length; + + int[] dp = new int[n + 1]; + + dp[1] = nums[0]; + + for (int i = 2; i <= n; ++i) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]); + } + + return dp[n]; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc216.java b/comxjtu/src/main/java/com/leetcode/Question/lc216.java new file mode 100644 index 0000000..53591bb --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc216.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:09 + * @description //TODO + */ +public class lc216 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc300.java b/comxjtu/src/main/java/com/leetcode/Question/lc300.java new file mode 100644 index 0000000..45be2cb --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc300.java @@ -0,0 +1,64 @@ +package com.leetcode.Question; + +import java.util.Arrays; + +public class lc300 { + + public static void main(String[] args) { + + } + + /** + * 最长递增子序列(动态规划) + * @param nums + * @return + * 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 + */ + public int lengthOfLIS(int[] nums) { + //处理边界 + + //状态定义:dp[i]表示以nums[i]为结尾的最长递增子序列的长度 + int[] dp = new int[nums.length]; + int max = 1; + + //初始化 + Arrays.fill(dp,1); + + for (int i = 0; i < nums.length; i++) { + //状态转移方程:将nums[i]添加入最长递增子序列或不。 + //需要和之前的所有进行比较 + for (int j = 0; j < i; j++) { + if (nums[i]> nums[j]){ + dp[i] = Math.max(dp[j]+1, dp[i]); + } + } + max = Math.max(max, dp[i]); + } + return max; + } + + /** + * 动态规划改良版 + * @param nums + * @return + * 降低复杂度切入点: + * 解法一中,遍历计算 dpdp 列表需 O(N)O(N),计算每个 dp[k]dp[k] 需 O(N)O(N)。 + 动态规划中,通过线性遍历来计算 dpdp 的复杂度无法降低; + 每轮计算中,需要通过线性遍历 [0,k)[0,k) 区间元素来得到 dp[k]dp[k] 。我们考虑:是否可以通过重新设计状态定义, + 使整个 dpdp 为一个排序列表;这样在计算每个 dp[k]dp[k] 时,就可以通过二分法遍历 [0,k)[0,k) 区间元素, + 将此部分复杂度由 O(N)O(N) 降至 O(logN)O(logN)。 + */ + public int lengthOfLIS2(int[] nums) { + int[] dp = new int[nums.length]; + int len = 0; + + for(int x : nums) { + int i = Arrays.binarySearch(dp, 0, len, x); + if(i < 0) i = -(i + 1); + dp[i] = x; + if(i == len) len++; + } + + return len; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc37.java b/comxjtu/src/main/java/com/leetcode/Question/lc37.java new file mode 100644 index 0000000..84ea3b1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc37.java @@ -0,0 +1,13 @@ +package com.leetcode.Question; + +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:42 + * @description //TODO + */ +public class lc37 { + +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc401.java b/comxjtu/src/main/java/com/leetcode/Question/lc401.java new file mode 100644 index 0000000..6e0952b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc401.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:10 + * @description //TODO + */ +public class lc401 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc417.java b/comxjtu/src/main/java/com/leetcode/Question/lc417.java new file mode 100644 index 0000000..35ae58f --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc417.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:31 + * @description //TODO + */ +public class lc417 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc438.java b/comxjtu/src/main/java/com/leetcode/Question/lc438.java index 2db471f..bc5e8cd 100644 --- a/comxjtu/src/main/java/com/leetcode/Question/lc438.java +++ b/comxjtu/src/main/java/com/leetcode/Question/lc438.java @@ -1,5 +1,6 @@ package com.leetcode.Question; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -48,6 +49,58 @@ public List findAnagrams(String s, String p) { return list; } + public List findAnagrams2(String s, String p) { + // 输入参数有效性判断 + if (s.length() < p.length()) { + return new ArrayList(); + } + + // 申请一个散列,用于记录窗口中具体元素的个数情况 + // 这里用数组的形式呈现,也可以考虑其他数据结构 + char[] sArr = s.toCharArray(); + char[] pArr = p.toCharArray(); + + int[] hash = new int[26]; + + for (int i = 0; i < pArr.length; ++i) { + hash[pArr[i] - 'a']++; + } + + // l 表示左指针 + // count 记录当前的条件,具体根据题目要求来定义 + // result 用来存放结果 + List results = new ArrayList(); + int l = 0, count = 0, pLength = p.length(); + + for (int r = 0; r < sArr.length; ++r) { + // 更新新元素在散列中的数量 + hash[sArr[r] - 'a']--; + + // 根据窗口的变更结果来改变条件值 + if (hash[sArr[r] - 'a']>= 0) { + count++; + } + + // 如果当前条件不满足,移动左指针直至条件满足为止 + if (r> pLength - 1) { + hash[sArr[l] - 'a']++; + + if (hash[sArr[l] - 'a']> 0) { + count--; + } + + l++; + } + + // 更新结果 + if (count == pLength) { + results.add(l); + } + } + + return results; + } + public static void main(String[] args){ lc438 lc = new lc438(); List result = lc.findAnagrams("cbaebabacd","abc"); diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc46.java b/comxjtu/src/main/java/com/leetcode/Question/lc46.java new file mode 100644 index 0000000..aaace6b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc46.java @@ -0,0 +1,52 @@ +package com.leetcode.Question; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 16:43 + * @description 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 + */ +public class lc46 { + + public List> permute(int[] nums) { + List> res = new ArrayList>(); + + List output = new ArrayList(); + for (int num : nums) { + output.add(num); + } + + int n = nums.length; + backtrack(n, output, res, 0); + return res; + } + + /** + * 使用标记数组来处理填过的数是一个很直观的思路,但是可不可以去掉这个标记数组呢?毕竟标记数组也增加了我们算法的空间复杂度。 + 答案是可以的,我们可以将题目给定的 nn 个数的数组 \textit{nums}nums 划分成左右两个部分,左边的表示已经填过的数,右边表示待填的数,我们在回溯的时候只要动态维护这个数组即可。 + * @param n + * @param output + * @param res + * @param first + */ + public void backtrack(int n, List output, List> res, int first) { + // 所有数都填完了 + if (first == n) { + res.add(new ArrayList(output)); + } + for (int i = first; i < n; i++) { + // 动态维护数组 + Collections.swap(output, first, i); + // 继续递归填下一个数 + backtrack(n, output, res, first + 1); + // 撤销操作 + Collections.swap(output, first, i); + } + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc47.java b/comxjtu/src/main/java/com/leetcode/Question/lc47.java new file mode 100644 index 0000000..5a9385c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc47.java @@ -0,0 +1,45 @@ +package com.leetcode.Question; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 16:54 + * @description + */ +public class lc47 { + + boolean[] vis; + + public List> permuteUnique(int[] nums) { + List> ans = new ArrayList>(); + List perm = new ArrayList(); + vis = new boolean[nums.length]; + Arrays.sort(nums); + backtrack(nums, ans, 0, perm); + return ans; + } + + public void backtrack(int[] nums, List> ans, int idx, List perm) { + if (idx == nums.length) { + ans.add(new ArrayList(perm)); + return; + } + for (int i = 0; i < nums.length; ++i) { + if (vis[i] || (i> 0 && nums[i] == nums[i - 1] && !vis[i - 1])) { + continue; + } + perm.add(nums[i]); + vis[i] = true; + backtrack(nums, ans, idx + 1, perm); + vis[i] = false; + perm.remove(idx); + } + } + + + +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc51.java b/comxjtu/src/main/java/com/leetcode/Question/lc51.java new file mode 100644 index 0000000..b901c74 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc51.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 17:42 + * @description //TODO + */ +public class lc51 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc52.java b/comxjtu/src/main/java/com/leetcode/Question/lc52.java new file mode 100644 index 0000000..3d89382 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc52.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 17:42 + * @description //TODO + */ +public class lc52 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc71.java b/comxjtu/src/main/java/com/leetcode/Question/lc71.java index 6d294e6..1f481a0 100644 --- a/comxjtu/src/main/java/com/leetcode/Question/lc71.java +++ b/comxjtu/src/main/java/com/leetcode/Question/lc71.java @@ -1,6 +1,6 @@ package com.leetcode.Question; -import com.xjtu.ch1.Stack; +import com.algorithom4.ch1.Stack; import java.util.ArrayList; import java.util.List; diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc78.java b/comxjtu/src/main/java/com/leetcode/Question/lc78.java new file mode 100644 index 0000000..47f06e2 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc78.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021年3月18日 17:10 + * @description //TODO + */ +public class lc78 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc784.java b/comxjtu/src/main/java/com/leetcode/Question/lc784.java new file mode 100644 index 0000000..238dc4b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc784.java @@ -0,0 +1,34 @@ +package com.leetcode.Question; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月7日 11:43 + * @description //TODO + */ +public class lc784 { + + public List letterCasePermutation(String s) { + List result = new LinkedList(); + backtrack(result, s, "", 0); + return result; + } + + private void backtrack(List result, String s, String now, int i) { + if (i==s.length()){ + result.add(now); + return; + } + + backtrack(result, s, now+s.charAt(i), i+1); + if (s.charAt(i)>='a' && s.charAt(i)<='z'){ + backtrack(result, s, now+(char)(s.charAt(i)-32), i+1); + } + if (s.charAt(i)>='A' && s.charAt(i)<='z'){ + backtrack(result, s, now+(char)(s.charAt(i)+32), i+1); + } + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc79.java b/comxjtu/src/main/java/com/leetcode/Question/lc79.java new file mode 100644 index 0000000..b1d7205 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc79.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:11 + * @description //TODO + */ +public class lc79 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc90.java b/comxjtu/src/main/java/com/leetcode/Question/lc90.java new file mode 100644 index 0000000..124925b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc90.java @@ -0,0 +1,10 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 17:10 + * @description //TODO + */ +public class lc90 { +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/lc93.java b/comxjtu/src/main/java/com/leetcode/Question/lc93.java new file mode 100644 index 0000000..7e69a2e --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/lc93.java @@ -0,0 +1,14 @@ +package com.leetcode.Question; + +/** + * @author JS + * @version 1.0 + * @date 2021/3/18 16:31 + * //TODO + */ +public class lc93 { + + public static void main(String[] args) { + + } +} diff --git a/comxjtu/src/main/java/com/leetcode/Question/middle/lc5.java b/comxjtu/src/main/java/com/leetcode/Question/middle/lc5.java new file mode 100644 index 0000000..e50411f --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/Question/middle/lc5.java @@ -0,0 +1,75 @@ +package com.leetcode.Question.middle; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/12 10:05 + * @description //最长回文子串 + */ +public class lc5 { +// 动态规划 + public static String longestPalindrome(String s) { + //边界条件判断 + if (s.length() < 2) + return s; + //start表示最长回文串开始的位置, + //maxLen表示最长回文串的长度 + int start = 0, maxLen = 1; + int length = s.length(); + boolean[][] dp = new boolean[length][length]; + for (int right = 1; right < length; right++) { + for (int left = 0; left < right; left++) { + //如果两种字符不相同,肯定不能构成回文子串 + if (s.charAt(left) != s.charAt(right)) + continue; + + //下面是s.charAt(left)和s.charAt(right)两个 + //字符相同情况下的判断 + //如果只有一个字符,肯定是回文子串 + if (right == left) { + dp[left][right] = true; + } else if (right - left <= 2) { + //类似于"aa"和"aba",也是回文子串 + dp[left][right] = true; + } else { + //类似于"a******a",要判断他是否是回文子串,只需要 + //判断"******"是否是回文子串即可 + dp[left][right] = dp[left + 1][right - 1]; + } + //如果字符串从left到right是回文子串,只需要保存最长的即可 + if (dp[left][right] && right - left + 1> maxLen) { + maxLen = right - left + 1; + start = left; + } + } + } + //截取最长的回文子串 + return s.substring(start, start + maxLen); + } + +// 中心扩散法 + public String longestPalindrome2(String s) { + if (s == null || s.length() < 1) { + return ""; + } + int start = 0, end = 0; + for (int i = 0; i < s.length(); i++) { + int len1 = expandAroundCenter(s, i, i); + int len2 = expandAroundCenter(s, i, i + 1); + int len = Math.max(len1, len2); + if (len> end - start) { + start = i - (len - 1) / 2; + end = i + len / 2; + } + } + return s.substring(start, end + 1); + } + + public int expandAroundCenter(String s, int left, int right) { + while (left>= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { + --left; + ++right; + } + return right - left - 1; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/base/Back.java b/comxjtu/src/main/java/com/leetcode/base/Back.java deleted file mode 100644 index 7498582..0000000 --- a/comxjtu/src/main/java/com/leetcode/base/Back.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.leetcode.base; - -/** - * @Author: Jay - * @Date: Created in 21:22 2018/9/3 - * @Modified By: - */ -public class Back { -} diff --git a/comxjtu/src/main/java/com/leetcode/base/Link.java b/comxjtu/src/main/java/com/leetcode/base/Link.java deleted file mode 100644 index 02d3791..0000000 --- a/comxjtu/src/main/java/com/leetcode/base/Link.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.leetcode.base; - -/** - * @Author: Jay - * @Date: Created in 16:34 2018/8/22 - * @Modified By: - */ -public class Link { -} diff --git a/comxjtu/src/main/java/com/leetcode/base/ListProblem.java b/comxjtu/src/main/java/com/leetcode/base/ListProblem.java new file mode 100644 index 0000000..c715ffe --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/base/ListProblem.java @@ -0,0 +1,232 @@ +package com.leetcode.base; + +import com.leetcode.middle.Link; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/2 15:53 + * @description //leetcode链表专题:https://leetcode.cn/leetbook/read/linked-list/ + */ +public class ListProblem { + + + /** + * + * @Description //环形链表II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 + * @Date 15:55 2022/5/2 + * @return + **/ + public ListNode detectCycle(ListNode head) { + ListNode slow = head, fast = head; + //快慢指针相遇 + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + //第一次相遇退出循环 + if (slow == fast) break; + } + //判断是否有环 + if(fast==null||fast.next==null)return null; + //有环则将fast移动至head并移动S2距离 + fast=head; + while(fast!=slow){ + slow=slow.next; + fast=fast.next; + } + return fast; + } + + /** + * + * @Description //相交链表:双指针. + * 我这种方法算是比较复杂的了,看题解有的直接将两个链表首位续起来,成为两个新的链表,即A+B和B+A,然后同时向后走就行。 + * @Date 16:19 2022/5/2 + * @return + **/ + public ListNode getIntersectionNode(ListNode headA, ListNode headB) { + if (headA==null|| headB== null) return null; + ListNode a = headA, b=headB; + int lengthA = 0,lengthB=0; + while (a!=null){ + lengthA++; + a = a.next; + } + while (b!=null){ + lengthB++; + b = b.next; + } + a = headA; + b=headB; + if (lengthA>lengthB){ + for (int i = 0; i < lengthA - lengthB; i++) { + a = a.next; + } + }else { + for (int i = 0; i < lengthB - lengthA; i++) { + b = b.next; + } + } + while (a!=null || b!=null){ + if (a == b) return a; + a = a.next; + b = b.next; + } + return null; + } + + /** + * + * @Param + * @Description //删除链表的倒数第N个节点 + * @Date 16:43 2022/5/2 + * @return + **/ + public ListNode removeNthFromEnd(ListNode head, int n) { + if (head==null || head.next==null) return null; + ListNode dummyNode = new ListNode(-1); + dummyNode.next = head; + ListNode fast = head, slow = dummyNode; + + for (int i = 0; i < n; i++) { + fast = fast.next; + } + while (fast!=null){ + fast = fast.next; + slow = slow.next; + } + slow.next = slow.next.next; + return dummyNode.next; + } + + /** + * + * @Param + * @Description //反转链表: + * way1:迭代法 + * way2:递归 + * @Date 17:12 2022/5/2 + * @return + **/ + public ListNode reverseList(ListNode head) { + if (head==null || head.next==null) return head; + ListNode dummyNode = null; + ListNode prev = dummyNode, now = head, next = head.next; + while (next!=null){ + now.next = prev; + prev = now; + now = next; + next = next.next; + } + now.next = prev; + return now; + } + public ListNode reverseList2(ListNode head) { + if (head==null || head.next==null) return head; + + return recursionReverse(head); + } + + //返回数组分别是,反转后的首尾节点 + private ListNode recursionReverse(ListNode head) { + if (head.next==null) return head; + + ListNode completed = recursionReverse(head.next); + head.next.next = head; + head.next = null; + return completed; + } + + + /** + * + * @Param + * @Description //给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 + * 思路:呀节点 + * @Date 17:50 2022/5/2 + * @return + **/ + public ListNode removeElements(ListNode head, int val) { + if (head==null || val<0 || val>50) return head; + ListNode dummyNode = new ListNode(-1); + dummyNode.next = head; + ListNode node = head, prev = dummyNode; + while (node!=null){ + if (node.val==val){ + prev.next = node.next; + node = node.next; + }else{ + node = node.next; + prev = prev.next; + } + } + return dummyNode.next; + } + + /** + * + * @Param + * @Description //奇偶链表:给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 + * 注意下面这种方法是个错误示范,因为成环了,因为直接等的话其实是同一个节点,因此同时操作多个变量的指针很容易对一个节点进行操作。 + * 已改正:错误在于将even连接于odd之后时,even最后一个的next并不为空,处理一下。 + * @Date 18:09 2022年5月2日 + * @return + **/ + public ListNode oddEvenList(ListNode head) { + if (head == null || head.next==null) return head; + ListNode node = head.next.next, odd = head, even = head.next, evenFisrt = even; + boolean oddFlag = true; + while (node!=null){ + if (oddFlag){ + odd.next = node; + odd = odd.next; + } else{ + even.next = node; + even = even.next; + } + oddFlag = !oddFlag; + node = node.next; + } + if (odd.next==null){ + even.next=null; + } + odd.next = evenFisrt; + return head; + } + public ListNode oddEvenList2(ListNode head) { + if (head != null) { + + ListNode odd = head, even = head.next, evenHead = even; + + while (even != null && even.next != null) { + odd.next = odd.next.next; + even.next = even.next.next; + odd = odd.next; + even = even.next; + } + odd.next = evenHead; + } + return head; + } + + public static void main(String[] args) { + ListProblem list = new ListProblem(); + ListNode listNode = list.new ListNode(1); + ListNode old = listNode; + for (int i = 2; i < 6; i++) { + ListNode listNode1 = list.new ListNode(i); + old.next = listNode1; + old = listNode1; + } + ListNode ans = list.oddEvenList(listNode); + } + //Definition for singly-linked list. + class ListNode { + int val; + ListNode next; + ListNode(int x) { + val = x; + next = null; + } + } +} diff --git a/comxjtu/src/main/java/com/leetcode/base/MyLinkedList.java b/comxjtu/src/main/java/com/leetcode/base/MyLinkedList.java deleted file mode 100644 index 5b6c985..0000000 --- a/comxjtu/src/main/java/com/leetcode/base/MyLinkedList.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.leetcode.base; - -/** - * @Author: Jay - * @Date: Created in 16:47 2018/8/22 - * @Modified By: - */ -class MyLinkedList { - - -} diff --git a/comxjtu/src/main/java/com/leetcode/base/Tree.java b/comxjtu/src/main/java/com/leetcode/base/Tree.java index 0e58769..35b7cfc 100644 --- a/comxjtu/src/main/java/com/leetcode/base/Tree.java +++ b/comxjtu/src/main/java/com/leetcode/base/Tree.java @@ -5,15 +5,14 @@ /** * @Author: Jay - * @Date: Created in 17:06 2018/6/1 - * @Modified By: + * @Date: */ /** - * 遍历方法及通用方法; - * 根据一棵树的中序遍历与后序遍历(前序)构造二叉树。 - * 每个节点的右向指针,填充同一层的兄弟节点 - * 二叉树的序列与反序列化Codec + * 二叉树的基本方法: + * 1.遍历方法及通用方法; + * 2.根据一棵树的中序遍历与后序遍历(前序)构造二叉树。 + * 3.每个节点的右向指针,填充同一层的兄弟节点 */ public class Tree { /** @@ -22,19 +21,20 @@ public class Tree { * @param root * @return */ - List list = new LinkedList(); + public List preorderTraversal(TreeNode root) { + List list = new LinkedList(); if (root == null) return list; - preorder(root); + preorder(root, list); return list; } - private void preorder(TreeNode root) { + private void preorder(TreeNode root, List list) { if (root == null) return; list.add(root.val); - preorder(root.left); - preorder(root.right); + preorder(root.left, list); + preorder(root.right, list); } /** @@ -44,17 +44,18 @@ private void preorder(TreeNode root) { * @return */ public List inorderTraversal(TreeNode root) { + List list = new LinkedList(); if (root == null) return list; - inorder(root); + inorder(root, list); return list; } - private void inorder(TreeNode root) { + private void inorder(TreeNode root, List list) { if (root == null) return; - inorder(root.left); + inorder(root.left, list); list.add(root.val); - inorder(root.right); + inorder(root.right, list); } /** @@ -64,14 +65,15 @@ private void inorder(TreeNode root) { * @return */ public List postorderTraversal(TreeNode root) { - postorder(root); + List list = new LinkedList(); + postorder(root, list); return list; } - private void postorder(TreeNode root) { + private void postorder(TreeNode root, List list) { if (root == null) return; - postorder(root.left); - postorder(root.right); + postorder(root.left,list); + postorder(root.right, list); list.add(root.val); } @@ -339,68 +341,4 @@ public class TreeLinkNode { } } -class Codec { - - //tools for reconstruct treenode - Queue
queue = new LinkedList
(); - boolean isLeft = true; - TreeNode root = null; - - // Encodes a tree to a single string. - public String serialize(TreeNode root) { - StringBuilder builder = new StringBuilder(); - Queue
queue = new LinkedList(); - queue.offer(root); - while(!queue.isEmpty()){ - TreeNode top = queue.poll(); - if(top == null){ - builder.append('#'); - builder.append(','); - } - else{ - builder.append(top.val); - builder.append(',');//以,作为分割 - queue.offer(top.left); - queue.offer(top.right); - } - } - return builder.toString(); - } - - // Decodes your encoded data to tree. - public TreeNode deserialize(String data) { - String[] strs = data.split(","); - int size = strs.length; - - for(int i = 0;i stack; + List top; + TreeSet poppedPos; + + public DinnerPlates(int capacity) { + this.capacity = capacity; + stack = new LinkedList(); + top = new ArrayList(); + poppedPos = new TreeSet(); + } + + public void push(int val) { + if (poppedPos.isEmpty()) { + int pos = stack.size(); + stack.add(val); + if (pos % capacity == 0) { + top.add(0); + } + else { + int stackPos = top.size()-1; + int stackTop = top.get(stackPos); + top.set(stackPos, stackTop + 1); + } + } else { + int pos = poppedPos.pollFirst(); + stack.set(pos, val); + int index = pos / capacity; + int stackTop = top.get(index); + top.set(index, stackTop + 1); + } + } + + public int pop() { + while (!stack.isEmpty() && poppedPos.contains(stack.size()-1)) { + stack.remove(stack.size()-1); + int pos = poppedPos.pollLast(); + if (pos % capacity == 0) { + top.remove(top.size()-1); + } + } + if (stack.isEmpty()) { + return -1; + } else { + int pos = stack.size() - 1; + int val = stack.get(pos); + stack.remove(pos); + int index = top.size()-1; + if (pos % capacity == 0) { + top.remove(index); + } else { + top.set(index, index - 1); + } + return val; + } + } + + public int popAtStack(int index) { + if (index>= top.size()) { + return -1; + } + int stackTop = top.get(index); + if (stackTop < 0) { + return -1; + } + top.set(index, stackTop - 1); + int pos = index * capacity + stackTop; + poppedPos.add(pos); + return stack.get(pos); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/ArithmeticTriplets.java b/comxjtu/src/main/java/com/leetcode/everyday/ArithmeticTriplets.java new file mode 100644 index 0000000..0ff48d9 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/ArithmeticTriplets.java @@ -0,0 +1,59 @@ +package com.leetcode.everyday; + + +/** + * @author JS + * @version 1.0 + * @date 2023/3/31 14:35 + * @description //2367,算术三元组的数目,简单题 + */ +public class ArithmeticTriplets { + + public int arithmeticTriplets(int[] nums, int diff) { + int length = nums.length; + int count = 0; + int mark[] = new int[length]; + for (int i = 0; i < length; i++) { + if (mark[i]!=1){ + int base = nums[i]+diff; + int position = binarySearch(nums,i,length-1,base); + if (position!=-1){ + mark[position]=1; + while (baseres) { + hi = mid-1; + }else { + return mid; + } +// mid = (hi - low)/2 + low; + } + return -1; + } + + public static void main(String[] args) { + int[] nums = new int[]{0,1,4,6,7,10}; + int diff = 3; + ArithmeticTriplets solver = new ArithmeticTriplets(); + int ans = solver.arithmeticTriplets(nums, diff); + System.out.println(ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/AverageValue.java b/comxjtu/src/main/java/com/leetcode/everyday/AverageValue.java new file mode 100644 index 0000000..58f85e9 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/AverageValue.java @@ -0,0 +1,23 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月29日 16:26 + * @description //2455. 可被三整除的偶数的平均值 + */ +public class AverageValue { + + public int averageValue(int[] nums) { + int count = 0; + int sum = 0; + + for (int num : nums) { + if (num%6==0) { + count++; + sum += num; + } + } + return count==0? 0 : sum/count; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/BaseNeg2.java b/comxjtu/src/main/java/com/leetcode/everyday/BaseNeg2.java new file mode 100644 index 0000000..d2e05c0 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/BaseNeg2.java @@ -0,0 +1,23 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月6日 12:02 + * @description //lc1017 + */ +public class BaseNeg2 { + public String baseNeg2(int n) { + if (n == 0 || n == 1) { + return String.valueOf(n); + } + StringBuilder res = new StringBuilder(); + while (n != 0) { + int remainder = n & 1; + res.append(remainder); + n -= remainder; + n /= -2; + } + return res.reverse().toString(); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/CatAndMouse.java b/comxjtu/src/main/java/com/leetcode/everyday/CatAndMouse.java new file mode 100644 index 0000000..7d685df --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/CatAndMouse.java @@ -0,0 +1,169 @@ +package com.leetcode.everyday; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月10日 9:45 + * @description //lc1728 拓扑排序 + */ +public class CatAndMouse { + static final int MOUSE_TURN = 0, CAT_TURN = 1; + static final int UNKNOWN = 0, MOUSE_WIN = 1, CAT_WIN = 2; + static final int MAX_MOVES = 1000; + int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; + int rows, cols; + String[] grid; + int catJump, mouseJump; + int food; + int[][][] degrees; + int[][][][] results; + + public boolean canMouseWin(String[] grid, int catJump, int mouseJump) { + this.rows = grid.length; + this.cols = grid[0].length(); + this.grid = grid; + this.catJump = catJump; + this.mouseJump = mouseJump; + int startMouse = -1, startCat = -1; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + char c = grid[i].charAt(j); + if (c == 'M') { + startMouse = getPos(i, j); + } else if (c == 'C') { + startCat = getPos(i, j); + } else if (c == 'F') { + food = getPos(i, j); + } + } + } + int total = rows * cols; + degrees = new int[total][total][2]; + results = new int[total][total][2][2]; + Queue queue = new ArrayDeque(); + // 计算每个状态的度 + for (int mouse = 0; mouse < total; mouse++) { + int mouseRow = mouse / cols, mouseCol = mouse % cols; + if (grid[mouseRow].charAt(mouseCol) == '#') { + continue; + } + for (int cat = 0; cat < total; cat++) { + int catRow = cat / cols, catCol = cat % cols; + if (grid[catRow].charAt(catCol) == '#') { + continue; + } + degrees[mouse][cat][MOUSE_TURN]++; + degrees[mouse][cat][CAT_TURN]++; + for (int[] dir : dirs) { + for (int row = mouseRow + dir[0], col = mouseCol + dir[1], jump = 1; row>= 0 && row < rows && col>= 0 && col < cols && grid[row].charAt(col) != '#' && jump <= mouseJump; row += dir[0], col += dir[1], jump++) { + int nextMouse = getPos(row, col), nextCat = getPos(catRow, catCol); + degrees[nextMouse][nextCat][MOUSE_TURN]++; + } + for (int row = catRow + dir[0], col = catCol + dir[1], jump = 1; row>= 0 && row < rows && col>= 0 && col < cols && grid[row].charAt(col) != '#' && jump <= catJump; row += dir[0], col += dir[1], jump++) { + int nextMouse = getPos(mouseRow, mouseCol), nextCat = getPos(row, col); + degrees[nextMouse][nextCat][CAT_TURN]++; + } + } + } + } + // 猫和老鼠在同一个单元格,猫获胜 + for (int pos = 0; pos < total; pos++) { + int row = pos / cols, col = pos % cols; + if (grid[row].charAt(col) == '#') { + continue; + } + results[pos][pos][MOUSE_TURN][0] = CAT_WIN; + results[pos][pos][MOUSE_TURN][1] = 0; + results[pos][pos][CAT_TURN][0] = CAT_WIN; + results[pos][pos][CAT_TURN][1] = 0; + queue.offer(new int[]{pos, pos, MOUSE_TURN}); + queue.offer(new int[]{pos, pos, CAT_TURN}); + } + // 猫和食物在同一个单元格,猫获胜 + for (int mouse = 0; mouse < total; mouse++) { + int mouseRow = mouse / cols, mouseCol = mouse % cols; + if (grid[mouseRow].charAt(mouseCol) == '#' || mouse == food) { + continue; + } + results[mouse][food][MOUSE_TURN][0] = CAT_WIN; + results[mouse][food][MOUSE_TURN][1] = 0; + results[mouse][food][CAT_TURN][0] = CAT_WIN; + results[mouse][food][CAT_TURN][1] = 0; + queue.offer(new int[]{mouse, food, MOUSE_TURN}); + queue.offer(new int[]{mouse, food, CAT_TURN}); + } + // 老鼠和食物在同一个单元格且猫和食物不在同一个单元格,老鼠获胜 + for (int cat = 0; cat < total; cat++) { + int catRow = cat / cols, catCol = cat % cols; + if (grid[catRow].charAt(catCol) == '#' || cat == food) { + continue; + } + results[food][cat][MOUSE_TURN][0] = MOUSE_WIN; + results[food][cat][MOUSE_TURN][1] = 0; + results[food][cat][CAT_TURN][0] = MOUSE_WIN; + results[food][cat][CAT_TURN][1] = 0; + queue.offer(new int[]{food, cat, MOUSE_TURN}); + queue.offer(new int[]{food, cat, CAT_TURN}); + } + // 拓扑排序 + while (!queue.isEmpty()) { + int[] state = queue.poll(); + int mouse = state[0], cat = state[1], turn = state[2]; + int result = results[mouse][cat][turn][0]; + int moves = results[mouse][cat][turn][1]; + List prevStates = getPrevStates(mouse, cat, turn); + for (int[] prevState : prevStates) { + int prevMouse = prevState[0], prevCat = prevState[1], prevTurn = prevState[2]; + if (results[prevMouse][prevCat][prevTurn][0] == UNKNOWN) { + boolean canWin = (result == MOUSE_WIN && prevTurn == MOUSE_TURN) || (result == CAT_WIN && prevTurn == CAT_TURN); + if (canWin) { + results[prevMouse][prevCat][prevTurn][0] = result; + results[prevMouse][prevCat][prevTurn][1] = moves + 1; + queue.offer(new int[]{prevMouse, prevCat, prevTurn}); + } else { + degrees[prevMouse][prevCat][prevTurn]--; + if (degrees[prevMouse][prevCat][prevTurn] == 0) { + int loseResult = prevTurn == MOUSE_TURN ? CAT_WIN : MOUSE_WIN; + results[prevMouse][prevCat][prevTurn][0] = loseResult; + results[prevMouse][prevCat][prevTurn][1] = moves + 1; + queue.offer(new int[]{prevMouse, prevCat, prevTurn}); + } + } + } + } + } + return results[startMouse][startCat][MOUSE_TURN][0] == MOUSE_WIN && results[startMouse][startCat][MOUSE_TURN][1] <= MAX_MOVES; + } + + public List getPrevStates(int mouse, int cat, int turn) { + List prevStates = new ArrayList(); + int mouseRow = mouse / cols, mouseCol = mouse % cols; + int catRow = cat / cols, catCol = cat % cols; + int prevTurn = turn == MOUSE_TURN ? CAT_TURN : MOUSE_TURN; + int maxJump = prevTurn == MOUSE_TURN ? mouseJump : catJump; + int startRow = prevTurn == MOUSE_TURN ? mouseRow : catRow; + int startCol = prevTurn == MOUSE_TURN ? mouseCol : catCol; + prevStates.add(new int[]{mouse, cat, prevTurn}); + for (int[] dir : dirs) { + for (int i = startRow + dir[0], j = startCol + dir[1], jump = 1; i>= 0 && i < rows && j>= 0 && j < cols && grid[i].charAt(j) != '#' && jump <= maxJump; i += dir[0], j += dir[1], jump++) { + int prevMouseRow = prevTurn == MOUSE_TURN ? i : mouseRow; + int prevMouseCol = prevTurn == MOUSE_TURN ? j : mouseCol; + int prevCatRow = prevTurn == MOUSE_TURN ? catRow : i; + int prevCatCol = prevTurn == MOUSE_TURN ? catCol : j; + int prevMouse = getPos(prevMouseRow, prevMouseCol); + int prevCat = getPos(prevCatRow, prevCatCol); + prevStates.add(new int[]{prevMouse, prevCat, prevTurn}); + } + } + return prevStates; + } + + public int getPos(int row, int col) { + return row * cols + col; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/CombinationSum.java b/comxjtu/src/main/java/com/leetcode/everyday/CombinationSum.java new file mode 100644 index 0000000..60fc756 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/CombinationSum.java @@ -0,0 +1,42 @@ +package com.leetcode.everyday; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/19 12:07 + * @description //力扣 39. 组合总和 使用动态规划算法 + * 0-1背包问题 + * dp[i]表示和为i的组合总数 + * 状态转移方程:dp[i] = dp[i] + dp[i - candidates[j]] + * 可以参考: + * https://leetcode.cn/problems/combination-sum/solution/chao-qiang-gifzhu-ni-shi-yong-dong-tai-gui-hua-qiu/ + */ +public class CombinationSum { + public List> combinationSum(int[] candidates, int target) { + // 1.定义dp数组 + List>[] dp = new ArrayList[target + 1]; + // 2.初始化 + dp[0] = new ArrayList(); + dp[0].add(new ArrayList()); + // 3.遍历 + for (int i = 0; i < candidates.length; i++) { + for (int j = candidates[i]; j <= target; j++) { + // 4.状态转移方程 + if (dp[j - candidates[i]] != null) { + if (dp[j] == null) { + dp[j] = new ArrayList(); + } + for (List list : dp[j - candidates[i]]) { + List tmp = new ArrayList(list); + tmp.add(candidates[i]); + dp[j].add(tmp); + } + } + } + } + return dp[target] == null ? new ArrayList() : dp[target]; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/CommonFactors.java b/comxjtu/src/main/java/com/leetcode/everyday/CommonFactors.java new file mode 100644 index 0000000..3e1c6ad --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/CommonFactors.java @@ -0,0 +1,33 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月5日 16:21 + * @description //2427. 公因子的数目 + */ +public class CommonFactors { + public int commonFactors(int a, int b) { + int c = gcd(a, b), ans = 0; + for (int x = 1; x * x <= c; ++x) { + if (c % x == 0) { + ++ans; + if (x * x != c) { + ++ans; + } + } + } + return ans; + } + +// 最大公约数 + public int gcd(int a, int b) { + while (b != 0) { + a %= b; + a ^= b; + b ^= a; + a ^= b; + } + return a; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/CountSubIslands.java b/comxjtu/src/main/java/com/leetcode/everyday/CountSubIslands.java new file mode 100644 index 0000000..b588c8e --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/CountSubIslands.java @@ -0,0 +1,49 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/23 11:18 + * @description //子岛屿的数目 + */ +public class CountSubIslands { + + public int countSubIslands(int[][] grid1, int[][] grid2) { + int m = grid1.length, n=grid1[0].length; + int ans=0; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (grid2[i][j]==1){ + if(dfs(grid1, grid2, i, j)){ + ans++; + } + } + } + } + return ans; + } + + boolean dfs(int[][] grid, int[][] grid2,int r, int c) { + int nr = grid.length; + int nc = grid[0].length; + + if (r < 0 || c < 0 || r>= nr || c>= nc || grid2[r][c] == 0) { + return true; + } + + grid2[r][c] = 0; + boolean flag = true; + if(grid[r][c] == 0){ + // ⭐这里不能直接返回false,否则后面的dfs递归代码就不再执行了 + flag = false; + return false; + } + boolean flag1=dfs(grid, grid2,r - 1, c); + boolean flag2=dfs(grid, grid2,r + 1, c); + boolean flag3=dfs(grid, grid2,r, c - 1); + boolean flag4=dfs(grid, grid2,r, c + 1); + + return flag&&flag1&&flag2&&flag3&&flag4; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/DelNodes.java b/comxjtu/src/main/java/com/leetcode/everyday/DelNodes.java new file mode 100644 index 0000000..2e7428d --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/DelNodes.java @@ -0,0 +1,74 @@ +package com.leetcode.everyday; + +import com.leetcode.util.Construct; +import com.leetcode.util.TreeNode; +import lombok.val; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月30日 9:01 + * @description //1110. 删点成林 + */ +public class DelNodes { +// 记录答案 + List
ans = new LinkedList(); +// 记录要删除的节点,为了方便查找,用set + Set deleteSet = new HashSet(); + + public List
delNodes(TreeNode root, int[] to_delete) { +// 将要删除的节点放入set + for (int i : to_delete) { + deleteSet.add(i); + } +// 判断根节点是否要删除,如果不删除,就加入答案 + boolean delete = deleteSet.contains(root.val); + if (!delete){ + ans.add(root); + } +// 递归遍历 + bfs(root,delete); + return ans; + } + + private void bfs(TreeNode root, boolean delete) { + if (root==null) return; +// 判断左右子节点是否要删除,如果要删除,就递归删除,如果不删除,判断是否加入答案。 +// 是否加入答案的依据是,如果父节点要删除,那么子节点就是新的根节点,加入答案,否则不加入答案 + if (root.left!=null){ + if (deleteSet.contains(root.left.val)){ + bfs(root.left, true); + root.left=null; + }else { + if (delete) ans.add(root.left); + bfs(root.left, false); + } + } + if(root.right != null ){ + if (deleteSet.contains(root.right.val)){ + bfs(root.right, true); + root.right=null; + }else { + if (delete) ans.add(root.right); + bfs(root.right, false); + } + } + } + + public static void main(String[] args) { + val to_delete = new int[]{3,5}; + Construct construct = new Construct(); + TreeNode treeNode = construct.deserialize("1,2,3,4,5,6,7"); + List
ansNow = new DelNodes().delNodes(treeNode, to_delete); + for (TreeNode node : ansNow) { + String serialize = construct.serialize(node); + System.out.printf("serialize = " + serialize + "\n"); + } + System.out.printf("end"); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/DiStringMatch.java b/comxjtu/src/main/java/com/leetcode/everyday/DiStringMatch.java new file mode 100644 index 0000000..6d3cba1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/DiStringMatch.java @@ -0,0 +1,19 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月9日 17:09 + * @description //TODO + */ +public class DiStringMatch { + + public int[] diStringMatch(String s) { + int[] reslut = new int[s.length()+1]; + int max = s.length(), min = 0; + for (int i = 0; i < s.length(); i++) + reslut[i] = s.charAt(i)=='I'?reslut[i]=min++:max--; + reslut[s.length()] = s.charAt(s.length()-1)=='I'? min : max; + return reslut; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FallingSquares.java b/comxjtu/src/main/java/com/leetcode/everyday/FallingSquares.java new file mode 100644 index 0000000..c355215 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FallingSquares.java @@ -0,0 +1,48 @@ +package com.leetcode.everyday; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/26 19:55 + * @description //699. 掉落的方块 + */ +public class FallingSquares { +// 内存超过限制而且,以下这种方法对这个案例是错的: +//输入: +//[[2,1],[2,9],[1,8]] +//输出: +//[1,9,17] +//预期结果: +//[1,10,18] + int MAX_COUNT = 100000001; + public List fallingSquares(int[][] positions) { + int[] lowArray = new int[MAX_COUNT]; + int[] highArray = new int[MAX_COUNT]; + List ans = new LinkedList(); + int max=0; + for (int i = 0; i < positions.length; i++) { + int left = positions[i][0]; + int side = positions[i][1]; + int right = left + side; + int base = lowArray[left]; + for (int j = left; j < right+1; j++) { + base = Math.max(base, lowArray[j]); + } + for (int j = left+1; j < right; j++) { + highArray[j]=base+side; + lowArray[j]=base+side; + } + lowArray[left]=Math.min(base+side, highArray[left]); + highArray[left] = Math.max(base+side, highArray[left]); + lowArray[right]=Math.min(base+side, highArray[right]); + highArray[right]=Math.max(base+side, highArray[right]); + max=Math.max(max, base+side); + ans.add(max); + } + return ans; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FindBottomLeftValue.java b/comxjtu/src/main/java/com/leetcode/everyday/FindBottomLeftValue.java new file mode 100644 index 0000000..057347c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FindBottomLeftValue.java @@ -0,0 +1,51 @@ +package com.leetcode.everyday; + +import com.leetcode.util.Construct; +import com.leetcode.util.TreeNode; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2022/6/22 15:42 + * @description //513. 找树左下角的值 + */ +public class FindBottomLeftValue { + public int findBottomLeftValue(TreeNode root) { + int ans = root.val; + + Queue
queue = new LinkedList(); + queue.offer(root); + while (!queue.isEmpty()){ + int length = queue.size(); + int left_count= 0; + for (int i = 0; i < length; i++) { + TreeNode treeNode = queue.poll(); + if(treeNode.left!=null) { + if (left_count==0){ + ans = treeNode.left.val; + left_count++; + } + queue.offer(treeNode.left); + } + if (treeNode.right!=null){ + if (left_count==0){ + ans = treeNode.right.val; + left_count++; + } + queue.offer(treeNode.right); + } + } + } + + return ans; + } + + public static void main(String[] args) { + TreeNode root = Construct.deserialize("1,2,3,4,#,5,6,#,#,7"); + int ans = new FindBottomLeftValue().findBottomLeftValue(root); + System.out.println(ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FindDiagonalOrder.java b/comxjtu/src/main/java/com/leetcode/everyday/FindDiagonalOrder.java new file mode 100644 index 0000000..c99b805 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FindDiagonalOrder.java @@ -0,0 +1,51 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022/6/14 15:04 + * @description //498. 对角线遍历 + */ +public class FindDiagonalOrder { + + /** + * + * @Param + * @Description 分三步:起点到左下至右上、右上至左下,确定什么时候变方向。 + * @Date 15:05 2022/6/14 + * @return + **/ + public int[] findDiagonalOrder(int[][] mat) { + int m = mat.length, n=mat[0].length; + int[] ans = new int[m*n]; + ans[0] = mat[0][0]; + int index= 0, i= 0, j=0; + + while (i=0 && j=0 ){ + ans[index++] = mat[i++][j--]; + } + if (i+1 == m-1 && j-1 == n-1)break; + if (i==m){ + i=i-1; + j=j+2; + }else { + j=j+1; + } + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FindLUSlength.java b/comxjtu/src/main/java/com/leetcode/everyday/FindLUSlength.java new file mode 100644 index 0000000..ddc622b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FindLUSlength.java @@ -0,0 +1,12 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022年6月27日 10:38 + * @description //522. 最长特殊序列 II + */ +public class FindLUSlength { + + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FindMaxK.java b/comxjtu/src/main/java/com/leetcode/everyday/FindMaxK.java new file mode 100644 index 0000000..5593e02 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FindMaxK.java @@ -0,0 +1,28 @@ +package com.leetcode.everyday; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月13日 21:46 + * @description //2441. 与对应负数同时存在的最大正整数 + */ +public class FindMaxK { +// 给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。返回正整数 k ,如果不存在这样的整数,返回 -1 。 + public int findMaxK(int[] nums) { + int k = -1; + Set set = new HashSet(); + for (int x : nums) { + set.add(x); + } + for (int x : nums) { + if (set.contains(-x)) { + k = Math.max(k, x); + } + } + return k; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FindRightInterval.java b/comxjtu/src/main/java/com/leetcode/everyday/FindRightInterval.java new file mode 100644 index 0000000..7eb33eb --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FindRightInterval.java @@ -0,0 +1,62 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import static java.util.Arrays.binarySearch; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月20日 10:31 + * @description //436. 寻找右区间 + */ +public class FindRightInterval { + + public int[] findRightInterval(int[][] intervals) { + if (intervals.length<2) return new int[]{-1}; + int[] ans = new int[intervals.length]; + int[] indexArray = new int[intervals.length]; + Arrays.fill(ans, -1); + Arrays.sort(indexArray); + Map indexMap = new TreeMap(); + for (int i = 0; i < intervals.length; i++) { + indexMap.put(intervals[i][0], i); + indexArray[i] = intervals[i][0]; + } + Arrays.sort(indexArray); + for (int i = 0; i < intervals.length; i++) { + int index = rank(indexArray, intervals[i][1]); + if (indext) hi = mid - 1; + else if (a[mid]用队列,直接将出局的弹出即可; + * 另一种:约瑟夫环问题,关键在于找到递归表达式,递推公式: f(n)= (f(n - 1) + k - s) % n + 1 (s 代表起点编号) + * @Date 9:44 2022年5月4日 + * @return + **/ + public int findTheWinner(int n, int k) { + if (n<2) return n; + int count = n, start = 1, itrK = 1; + boolean[] flags = new boolean[n+1]; + while (count!=1){ + + if (flags[start]){ + //已被淘汰 + }else { + if (itrK==k){ + flags[start]=true; + count--; + itrK=1; + } + else itrK++; + } + if (start==n) start=1; + else start++; + } + for (int i = 1; i < n+1; i++) { + if (!flags[i]) return i; + } + return n; + } + + public int findTheWinner2(int n, int k) { + if (n == 1) { + return 1; + } + return (k + findTheWinner2(n - 1, k) - 1) % n + 1; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/FrogPosition.java b/comxjtu/src/main/java/com/leetcode/everyday/FrogPosition.java new file mode 100644 index 0000000..2b3ea15 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/FrogPosition.java @@ -0,0 +1,56 @@ +package com.leetcode.everyday; + +import lombok.experimental.var; + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/24 9:48 + * @description //1377. T 秒后青蛙的位置 + */ +public class FrogPosition { + + public double frogPosition(int n, int[][] edges, int t, int target) { + Map> graph = new HashMap(); + for (int[] edge : edges) { + graph.computeIfAbsent(edge[0], key -> new ArrayList()).add(edge[1]); + graph.computeIfAbsent(edge[1], key -> new ArrayList()).add(edge[0]); + } + Queue queue = new LinkedList(); + queue.offer(1); + double[] prob = new double[n + 1]; + prob[1] = 1.0; + while (!queue.isEmpty() && t--> 0) { + for (int sz = queue.size(); sz> 0; --sz) { + int cur = queue.poll(); + int nextCount = 0; + for (int next : graph.getOrDefault(cur, new ArrayList())) { + if (prob[next] == 0) { + ++nextCount; + } + } + for (int next : graph.getOrDefault(cur, new ArrayList())) { + if (prob[next] == 0) { + queue.offer(next); + prob[next] = prob[cur] / nextCount; + } + } + if (nextCount> 0) { + prob[cur] = 0; + } + } + } + return prob[target]; + } + + public static void main(String[] args) { + FrogPosition solver = new FrogPosition(); + int n = 7; + int[][] edges = {{1,2},{1,3},{1,7},{2,4},{2,6},{3,5}}; + int t = 2; + int target = 4; + System.out.println(solver.frogPosition(n,edges,t,target)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/GetAllElements.java b/comxjtu/src/main/java/com/leetcode/everyday/GetAllElements.java new file mode 100644 index 0000000..3358907 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/GetAllElements.java @@ -0,0 +1,88 @@ +package com.leetcode.everyday; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月1日 10:13 + * @description //lc1305 给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。. + */ +public class GetAllElements { + + /** + * + * @Description 中序遍历+归并排序 + * @Date 10:16 2022年5月1日 + * @return + **/ + public List getAllElements(TreeNode root1, TreeNode root2) { + List result = new LinkedList(); + List result1 = midOrder(root1); + List result2 = midOrder(root2); + if (result1.size()==0){ + return result2; + }else if (result2.size()==0){ + return result1; + } + result = merge(result1, result2); + return result; + } + + private List merge(List result1, List result2) { + List result = new LinkedList(); + int i = 0, j=0; + while (i midOrder(TreeNode root) { + List result = new ArrayList(); + inOrder(root, result); + return result; + } + + private void inOrder(TreeNode root, List result) { + if (root == null) return; + inOrder(root.left, result); + result.add(root.val); + inOrder(root.right, result); + } + + + //Definition for a binary tree node. + public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode() {} + TreeNode(int val) { this.val = val; } + TreeNode(int val, TreeNode left, TreeNode right) { + this.val = val; + this.left = left; + this.right = right; + } + } +} + + + + diff --git a/comxjtu/src/main/java/com/leetcode/everyday/InorderSuccessor.java b/comxjtu/src/main/java/com/leetcode/everyday/InorderSuccessor.java new file mode 100644 index 0000000..7387d2f --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/InorderSuccessor.java @@ -0,0 +1,33 @@ +package com.leetcode.everyday; + +import com.leetcode.util.TreeNode; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月16日 9:07 + * @description //面试题 04.06. 后继者 + */ +public class InorderSuccessor { + + public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { + if (root == null) return null; + + return inorder(root, p); + } + + private TreeNode inorder(TreeNode root, TreeNode p) { + if (root == null) return null; + + TreeNode post = inorder(root.right, p); + if (root == p) return post; + else { + TreeNode pre = inorder(root.left, p); + post = inorder(root.right, p); + } + + return post; + } +} + + diff --git a/comxjtu/src/main/java/com/leetcode/everyday/KSmallestPairs.java b/comxjtu/src/main/java/com/leetcode/everyday/KSmallestPairs.java new file mode 100644 index 0000000..cd69889 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/KSmallestPairs.java @@ -0,0 +1,10 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月28日 11:02 + * @description //373. 查找和最小的 K 对数字 + */ +public class KSmallestPairs { +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/LargestTriangleArea.java b/comxjtu/src/main/java/com/leetcode/everyday/LargestTriangleArea.java new file mode 100644 index 0000000..9d2ccf3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/LargestTriangleArea.java @@ -0,0 +1,29 @@ +package com.leetcode.everyday; + +import java.lang.ref.PhantomReference; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月15日 9:55 + * @description //lc812 + */ +public class LargestTriangleArea { + + public double largestTriangleArea(int[][] points) { + int n = points.length; + double ret = 0.0; + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + for (int k = j + 1; k < n; k++) { + ret = Math.max(ret, triangleArea(points[i][0], points[i][1], points[j][0], points[j][1], points[k][0], points[k][1])); + } + } + } + return ret; + } + + public double triangleArea(int x1, int y1, int x2, int y2, int x3, int y3) { + return 0.5 * Math.abs(x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/LargestValsFromLabels.java b/comxjtu/src/main/java/com/leetcode/everyday/LargestValsFromLabels.java new file mode 100644 index 0000000..3057826 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/LargestValsFromLabels.java @@ -0,0 +1,38 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/23 10:13 + * @description //1090. 受标签影响的最大值 + */ +public class LargestValsFromLabels { + public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) { + Integer[] id = new Integer[values.length]; + for (int i = 0; i < values.length; i++) { + id[i] = i; + } + Arrays.sort(id, (a, b) -> values[b] - values[a]); + + HashMap hashMap = new LinkedHashMap(); + for (int label : labels) { + hashMap.put(label, 0); + } + int ans = 0, numCount = 0; + for (int j = 0; j < id.length && numCount> levelOrder (TreeNode root) { + // 二叉树层序遍历 + ArrayList> res = new ArrayList(); + if (root == null) { + return res; + } + ArrayList
queue = new ArrayList(); + queue.add(root); + while (!queue.isEmpty()) { + ArrayList list = new ArrayList(); + ArrayList
temp = new ArrayList(); + for (TreeNode node : queue) { + list.add(node.val); + if (node.left != null) { + temp.add(node.left); + } + if (node.right != null) { + temp.add(node.right); + } + + } + res.add(list); + queue = temp; + } + return res; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/LongestDecomposition.java b/comxjtu/src/main/java/com/leetcode/everyday/LongestDecomposition.java new file mode 100644 index 0000000..e9a2e82 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/LongestDecomposition.java @@ -0,0 +1,59 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月12日 9:25 + * @description //1147. 段式回文 + */ +public class LongestDecomposition { + + public int longestDecomposition(String text) { + int ans = 0; + int left = 0, right = text.length()-1; + for (;left <= right;){ + for (int size = 1;; size++) { + if (size*2>right-left+1){ + ans++; + left = right+1; + break; + } + if (text.substring(left, left+size).equals(text.substring(right-size+1,right+1))){ + ans++; + left += size; + right -= size; + if (left-1 majorityElement(int[] nums) { + int element1 = 0; + int element2 = 0; + int vote1 = 0; + int vote2 = 0; + + for (int num : nums) { + if (vote1> 0 && num == element1) { //如果该元素为第一个元素,则计数加1 + vote1++; + } else if (vote2> 0 && num == element2) { //如果该元素为第二个元素,则计数加1 + vote2++; + } else if (vote1 == 0) { // 选择第一个元素 + element1 = num; + vote1++; + } else if (vote2 == 0) { // 选择第二个元素 + element2 = num; + vote2++; + } else { //如果三个元素均不相同,则相互抵消1次 + vote1--; + vote2--; + } + } + + int cnt1 = 0; + int cnt2 = 0; + for (int num : nums) { + if (vote1> 0 && num == element1) { + cnt1++; + } + if (vote2> 0 && num == element2) { + cnt2++; + } + } + // 检测元素出现的次数是否满足要求 + List ans = new ArrayList(); + if (vote1> 0 && cnt1> nums.length / 3) { + ans.add(element1); + } + if (vote2> 0 && cnt2> nums.length / 3) { + ans.add(element2); + } + + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/Makesquare.java b/comxjtu/src/main/java/com/leetcode/everyday/Makesquare.java new file mode 100644 index 0000000..3bb44d5 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/Makesquare.java @@ -0,0 +1,44 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2022年6月1日 10:26 + * @description 473. 火柴拼正方形 + */ +public class Makesquare { + + class Solution { + public boolean makesquare(int[] matchsticks) { + int totalLen = Arrays.stream(matchsticks).sum(); + if (totalLen % 4 != 0) { + return false; + } + Arrays.sort(matchsticks); + for (int i = 0, j = matchsticks.length - 1; i < j; i++, j--) { + int temp = matchsticks[i]; + matchsticks[i] = matchsticks[j]; + matchsticks[j] = temp; + } + + int[] edges = new int[4]; + return dfs(0, matchsticks, edges, totalLen / 4); + } + + public boolean dfs(int index, int[] matchsticks, int[] edges, int len) { + if (index == matchsticks.length) { + return true; + } + for (int i = 0; i < edges.length; i++) { + edges[i] += matchsticks[index]; + if (edges[i] <= len && dfs(index + 1, matchsticks, edges, len)) { + return true; + } + edges[i] -= matchsticks[index]; + } + return false; + } + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaskPII.java b/comxjtu/src/main/java/com/leetcode/everyday/MaskPII.java new file mode 100644 index 0000000..9821801 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaskPII.java @@ -0,0 +1,79 @@ +package com.leetcode.everyday; + +import java.util.HashSet; +import java.util.Scanner; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/1 16:25 + * @description //831 + */ +public class MaskPII { + + public String maskPII(String s) { +// 1.判断是邮箱还是电话;@ + StringBuilder ans = new StringBuilder(""); + if (s.contains("@")){ + // 2.邮箱:(1)转小写;(2)分割,@;(3)替换,拼接 + s = s.toLowerCase(); + String[] strs = s.split("@"); + int len = strs[0].length(); + ans.append(strs[0].charAt(0)).append("*****").append(strs[0].charAt(len-1)).append("@").append(strs[1]); + }else { + // 3.电话:(1)只留下数字;(2)判断长度;(4)按照对应模式拼接+最后四位 + char[] chars = s.toCharArray(); + HashSet characterHashSet = new HashSet(); + characterHashSet.add(' '); + characterHashSet.add('('); + characterHashSet.add(')'); + characterHashSet.add('-'); + characterHashSet.add('+'); + int count = 0; + StringBuilder sb = new StringBuilder(); + for (char aChar : chars) { + if (!characterHashSet.contains(aChar) ){ + count++; + sb.append(aChar); + } + } + switch (count){ + case 10: + ans.append("***-***-"); + break; + case 11: + ans.append("+*-***-***-"); + break; + case 12: + ans.append("+**-***-***-"); + break; + default: + ans.append("+***-***-***-"); + } + ans.append(sb.toString().substring(count-4)); + + } + + return String.valueOf(ans); + } + + public static void main(String[] args) { + StringBuilder ans = new StringBuilder(""); + String s = "LeetCode@LeetCode.com"; + s = s.toLowerCase(); + String[] strs = s.split("@"); + int len = strs[0].length(); + ans.append(strs[0].charAt(0)).append("*****").append(strs[0].charAt(len-1)).append("@").append(strs[1]); + System.out.println(ans); + + MaskPII solver = new MaskPII(); + Scanner sc = new Scanner(System.in); + while (true){ + String line = sc.nextLine(); + System.out.println(solver.maskPII(line)); + } + +// String ss = s.substring(s.length()-4); +// System.out.println(ss); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxAncestorDiff.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxAncestorDiff.java new file mode 100644 index 0000000..50983e3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxAncestorDiff.java @@ -0,0 +1,27 @@ +package com.leetcode.everyday; + +import com.leetcode.base.TreeNode; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月18日 9:24 + * @description //1026. 节点与其祖先之间的最大差值 + */ +public class MaxAncestorDiff { + public int maxAncestorDiff(TreeNode root) { + return dfs(root, root.val, root.val); + } + + public int dfs(TreeNode root, int mi, int ma) { + if (root == null) { + return 0; + } + int diff = Math.max(Math.abs(root.val - mi), Math.abs(root.val - ma)); + mi = Math.min(mi, root.val); + ma = Math.max(ma, root.val); + diff = Math.max(diff, dfs(root.left, mi, ma)); + diff = Math.max(diff, dfs(root.right, mi, ma)); + return diff; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxEqulaK.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxEqulaK.java new file mode 100644 index 0000000..58e8ef3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxEqulaK.java @@ -0,0 +1,37 @@ +package com.leetcode.everyday; + +import com.leetcode.base.TreeNode; + +import java.util.ArrayList; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月24日 12:21 + * @description // + */ +public class MaxEqulaK { + +// 使用哈希表+前缀和 + public int maxlenEqualK (int[] arr, int k) { + // write code here + int n = arr.length; + int[] preSum = new int[n + 1]; + for (int i = 1; i <= n; i++) { + preSum[i] = preSum[i-1] + arr[i-1]; + } + int res = 0; + ArrayList list = new ArrayList(); + for (int i = 0; i <= n; i++) { + if (list.contains(preSum[i] - k)) { + res = Math.max(res, i - list.indexOf(preSum[i] - k)); + } + if (!list.contains(preSum[i])) { + list.add(preSum[i]); + } + } + return res; + } + + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxSubArray.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxSubArray.java new file mode 100644 index 0000000..01c5845 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxSubArray.java @@ -0,0 +1,49 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/8 20:17 + * @description //53. 最大子数组和 + */ +public class MaxSubArray { + private int maxCrossingSum(int[] nums, int left, int mid, int right) { + // 一定会包含 nums[mid] 这个元素 + int sum = 0; + int leftSum = Integer.MIN_VALUE; + // 左半边包含 nums[mid] 元素,最多可以到什么地方 + // 走到最边界,看看最值是什么 + // 计算以 mid 结尾的最大的子数组的和 + for (int i = mid; i>= left; i--) { + sum += nums[i]; + if (sum> leftSum) { + leftSum = sum; + } + } + sum = 0; + int rightSum = Integer.MIN_VALUE; + // 右半边不包含 nums[mid] 元素,最多可以到什么地方 + // 计算以 mid+1 开始的最大的子数组的和 + for (int i = mid + 1; i <= right; i++) { + sum += nums[i]; + if (sum> rightSum) { + rightSum = sum; + } + } + return leftSum + rightSum; + } + + private int maxSubArraySum(int[] nums, int left, int right) { + if (left == right) { + return nums[left]; + } + int mid = left + (right - left) / 2; + return max3(maxSubArraySum(nums, left, mid), + maxSubArraySum(nums, mid + 1, right), + maxCrossingSum(nums, left, mid, right)); + } + + private int max3(int num1, int num2, int num3) { + return Math.max(num1, Math.max(num2, num3)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxSubarraySumCircular.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxSubarraySumCircular.java new file mode 100644 index 0000000..6a45753 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxSubarraySumCircular.java @@ -0,0 +1,22 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年7月20日 11:15 + * @description //918. 环形子数组的最大和 + */ +public class MaxSubarraySumCircular { + + public int maxSubarraySumCircular(int[] A) { + int total = 0, maxSum = A[0], curMax = 0, minSum = A[0], curMin = 0; + for (int a : A) { + curMax = Math.max(curMax + a, a); + maxSum = Math.max(maxSum, curMax); + curMin = Math.min(curMin + a, a); + minSum = Math.min(minSum, curMin); + total += a; + } + return maxSum> 0 ? Math.max(maxSum, total - minSum) : maxSum; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxSumAfterPartitioning.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxSumAfterPartitioning.java new file mode 100644 index 0000000..87c8f48 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxSumAfterPartitioning.java @@ -0,0 +1,40 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月19日 15:46 + * @description //1043. 分隔数组以得到最大和 + */ +public class MaxSumAfterPartitioning { + + public int maxSumAfterPartitioning(int[] arr, int k) { + int n = arr.length; + int[] d = new int[n + 1]; + for (int i = 1; i <= n; i++) { + int maxValue = arr[i - 1]; + for (int j = i - 1; j>= 0 && j>= i - k; j--) { + d[i] = Math.max(d[i], d[j] + maxValue * (i - j)); + if (j> 0) { + maxValue = Math.max(maxValue, arr[j - 1]); + } + } + } + return d[n]; + } + + public static void main(String[] args) { + int ans =0; + MaxSumAfterPartitioning solver = new MaxSumAfterPartitioning(); + ans = solver.maxSumAfterPartitioning(new int[]{1,15,7,9,2,5,10}, 3); + System.out.println(ans); + ans = solver.maxSumAfterPartitioning(new int[]{1,4,1,5,7,3,6,1,9,9,3}, 4); + System.out.println(ans); + ans = solver.maxSumAfterPartitioning(new int[]{1}, 1); + System.out.println(ans); + ans = solver.maxSumAfterPartitioning(new int[]{1,2}, 3); + System.out.println(ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxSumDivThree.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxSumDivThree.java new file mode 100644 index 0000000..350a88e --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxSumDivThree.java @@ -0,0 +1,23 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年6月19日 11:45 + * @description //1262. 可被三整除的最大和 + */ +public class MaxSumDivThree { + + public int maxSumDivThree(int[] nums) { + int[] f = {0, Integer.MIN_VALUE, Integer.MIN_VALUE}; + for (int num : nums) { + int[] g = new int[3]; + System.arraycopy(f, 0, g, 0, 3); + for (int i = 0; i < 3; ++i) { + g[(i + num % 3) % 3] = Math.max(g[(i + num % 3) % 3], f[i] + num); + } + f = g; + } + return f[0]; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MaxValueAfterReverse.java b/comxjtu/src/main/java/com/leetcode/everyday/MaxValueAfterReverse.java new file mode 100644 index 0000000..6805720 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MaxValueAfterReverse.java @@ -0,0 +1,28 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/12 16:02 + * @description //1330. 翻转子数组得到最大的数组值 + */ +public class MaxValueAfterReverse { + public int maxValueAfterReverse(int[] nums) { + int value = 0, n = nums.length; + for (int i = 0; i < n - 1; i++) { + value += Math.abs(nums[i] - nums[i + 1]); + } + int mx1 = 0; + for (int i = 1; i < n - 1; i++) { + mx1 = Math.max(mx1, Math.abs(nums[0] - nums[i + 1]) - Math.abs(nums[i] - nums[i + 1])); + mx1 = Math.max(mx1, Math.abs(nums[n - 1] - nums[i - 1]) - Math.abs(nums[i] - nums[i - 1])); + } + int mx2 = Integer.MIN_VALUE, mn2 = Integer.MAX_VALUE; + for (int i = 0; i < n - 1; i++) { + int x = nums[i], y = nums[i + 1]; + mx2 = Math.max(mx2, Math.min(x, y)); + mn2 = Math.min(mn2, Math.max(x, y)); + } + return value + Math.max(mx1, 2 * (mx2 - mn2)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MctFromLeafValues.java b/comxjtu/src/main/java/com/leetcode/everyday/MctFromLeafValues.java new file mode 100644 index 0000000..1c5506a --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MctFromLeafValues.java @@ -0,0 +1,36 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/31 10:40 + * @description //1130. 叶值的最小代价生成树 + * 这个问题竟然是区间dp,区间dp各个区间的有效性是如何保证的? + * 设dp[i][j]表示从i到j这段区间中所有非叶节点的最小可能总和。然后对于每个区间[i,j],我们可以枚举最后一步的操作, + * 即把区间[i,j]分成两个子区间[l,k]和[k+1,r],使得[l,k]和[k+1,r]分别是其中一个非叶节点的左子树和右子树。 + * 那么非叶节点的值就是max{arr[p]}, l <= p <= k和l <= p <= r-k。 + * 我们可以用一个变量maxNum记录[p,k]和[k+1,r]中的最大值,然后再把左右子树的dp值相乘,加上这个maxNum,就可以得到区间[i,j]中所有非叶节点的最小值。 + * 由于我们需要对所有的区间[i,j]进行计算,所以可以使用二维数组dp来保存每个区间的结果,最后返回dp[0][n-1]即可。 + */ +public class MctFromLeafValues { + + public int mctFromLeafValues(int[] arr) { + int n = arr.length; + int[][] dp = new int[n][n]; + for (int len = 2; len <= n; len++) { + for (int i = 0; i + len - 1 < n; i++) { + int j = i + len - 1; + dp[i][j] = Integer.MAX_VALUE; + for (int k = i; k < j; k++) { + int maxNumL = Arrays.stream(arr, i, k+1).max().orElse(0); + int maxNumR = Arrays.stream(arr, k+1, j+1).max().orElse(0); + int nonLeafVal = maxNumL * maxNumR; + dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k+1][j] + nonLeafVal); + } + } + } + return dp[0][n-1]; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MedianFinder.java b/comxjtu/src/main/java/com/leetcode/everyday/MedianFinder.java new file mode 100644 index 0000000..303f3c9 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MedianFinder.java @@ -0,0 +1,31 @@ +package com.leetcode.everyday; + +import java.util.PriorityQueue; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/19 21:16 + * @Description //剑指 Offer 41. 数据流中的中位数 + * 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 + * + */ +public class MedianFinder { + /** initialize your data structure here. */ + PriorityQueue left;//大顶 + PriorityQueue right;//小顶 + public MedianFinder() { + left=new PriorityQueue((n1,n2)->n2-n1); + right=new PriorityQueue(); + } + public void addNum(int num) { + left.add(num); + right.add(left.poll()); + if(left.size()+1left.size())return right.peek(); + return (double)(left.peek()+right.peek())/2; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MedianSlidingWindow.java b/comxjtu/src/main/java/com/leetcode/everyday/MedianSlidingWindow.java new file mode 100644 index 0000000..c667047 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MedianSlidingWindow.java @@ -0,0 +1,63 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.Collections; +import java.util.PriorityQueue; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月19日 21:30 + * @description //力扣 480. 滑动窗口中位数 + */ +public class MedianSlidingWindow { + +// 中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 + public double[] medianSlidingWindow(int[] nums, int k) { + PriorityQueue maxHeap = new PriorityQueue(Collections.reverseOrder()); // 大根堆 + PriorityQueue minHeap = new PriorityQueue(); // 小根堆 + double[] medians = new double[nums.length - k + 1]; + for (int i = 0; i < nums.length; i++) { + // Step 1: 维护两个堆的大小,并将元素分别插入 + if (i>= k) { + // 判断堆顶元素是否失效 + if (maxHeap.contains(nums[i - k])) { + maxHeap.remove(nums[i - k]); + } else { + minHeap.remove(nums[i - k]); + } + } + if (maxHeap.size() <= minHeap.size()) { + maxHeap.offer(nums[i]); + } else { + minHeap.offer(nums[i]); + } + // Step 2: 平衡两个堆 + if (!minHeap.isEmpty() && maxHeap.peek()> minHeap.peek()) { + int maxHeapTop = maxHeap.poll(); + int minHeapTop = minHeap.poll(); + maxHeap.offer(minHeapTop); + minHeap.offer(maxHeapTop); + } + // Step 3: 找中位数 + if (i>= k - 1) { // 当窗口的大小大于等于k时,才可以找到中位数 + double median; + if (k % 2 == 0) { + median = ((double) maxHeap.peek() + minHeap.peek()) / 2; + } else { + median = maxHeap.peek(); + } + medians[i - k + 1] = median; + } + } + return medians; + } + + public static void main(String[] args) { + MedianSlidingWindow s = new MedianSlidingWindow(); + int[] nums = {1, 3, -1, -3, 5, 3, 6, 7}; + int k = 3; + double[] result = s.medianSlidingWindow(nums, k); + System.out.println(Arrays.toString(result)); // [1.0, -1.0, -1.0, 3.0, 5.0, 6.0] + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MergeStones.java b/comxjtu/src/main/java/com/leetcode/everyday/MergeStones.java new file mode 100644 index 0000000..5336005 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MergeStones.java @@ -0,0 +1,63 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月4日 12:50 + * @description //1000. 合并石头的最低成本 + */ +public class MergeStones { + static final int INF = 0x3f3f3f3f; + int[][][] d; + int[] sum; + int k; + + public int mergeStones(int[] stones, int k) { + int n = stones.length; + if ((n - 1) % (k - 1) != 0) { + return -1; + } + this.k = k; + d = new int[n][n][k + 1]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + Arrays.fill(d[i][j], -1); + } + } + sum = new int[n]; + + // 初始化 + for (int i = 0, s = 0; i < n; i++) { + d[i][i][1] = 0; + s += stones[i]; + sum[i] = s; + } + int res = get(0, n - 1, 1); + return res; + } + + public int get(int l, int r, int t) { + // 若 d[l][r][t] 不为 -1,表示已经在之前的递归被求解过,直接返回答案 + if (d[l][r][t] != -1) { + return d[l][r][t]; + } + // 当石头堆数小于 t 时,一定无解 + if (t> r - l + 1) { + return INF; + } + if (t == 1) { + int res = get(l, r, k); + if (res == INF) { + return d[l][r][t] = INF; + } + return d[l][r][t] = res + (sum[r] - (l == 0 ? 0 : sum[l - 1])); + } + int val = INF; + for (int p = l; p < r; p += (k - 1)) { + val = Math.min(val, get(l, p, 1) + get(p + 1, r, t - 1)); + } + return d[l][r][t] = val; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MinDeletionLength.java b/comxjtu/src/main/java/com/leetcode/everyday/MinDeletionLength.java new file mode 100644 index 0000000..0316a72 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MinDeletionLength.java @@ -0,0 +1,24 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/12 9:41 + * @description //lc944 + */ +public class MinDeletionLength { + + public int minDeletionSize(String[] strs) { + if (strs.length==1 ) return 0; + int sum =0; + for (int i = 0; i < strs[0].length(); i++) { + for (int j = 1; j < strs.length; j++) { + if (strs[j].charAt(i) 0) // 如果有青蛙发出了 pre 的声音 + cnt[pre]--; // 复用一只 + else if (ch != 'c') // 否则青蛙必须从 'c' 开始蛙鸣 + return -1; // 不符合要求 + cnt[ch]++; // 发出了 ch 的声音 + } + if (cnt['c']> 0 || cnt['r']> 0 || cnt['o']> 0 || cnt['a']> 0) + return -1; // 有发出其它声音的青蛙,不符合要求 + return cnt['k']; // 最后青蛙们都发出了 'k' 的声音 + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MinStickers.java b/comxjtu/src/main/java/com/leetcode/everyday/MinStickers.java new file mode 100644 index 0000000..e8cade1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MinStickers.java @@ -0,0 +1,85 @@ +package com.leetcode.everyday; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月14日 20:15 + * @description //691:这个解答实现错了,将重复选用的记为一次了;如果不记为一次,则使用map数组来做、 + */ +public class MinStickers { + public int minStickers(String[] stickers, String target) { + Set[] stickerSetArray = new HashSet[stickers.length]; + for (int i = 0; i < stickers.length; i++) { + stickerSetArray[i] = generateSet(stickers[i]); + } + Set targetSet = generateSet(target); + int ans = -1; + ans = backtrack(stickerSetArray, targetSet, 0, Integer.MAX_VALUE); + return ans==Integer.MAX_VALUE ? -1: ans; + } + + private int backtrack(Set[] stickerSetArray, Set targetSet, int start, int min) { + if (0 == targetSet.size()){ + return start; + } + if (start == stickerSetArray.length) return Integer.MAX_VALUE; + + for (int i = start; i < stickerSetArray.length; i++) { + Set targetSetOri = new HashSet(targetSet); + int matchCount = intersection(stickerSetArray[i], targetSet); + if (matchCount!=0){ + int count = backtrack(stickerSetArray, targetSet, i+1, min); + min = count characters, Set targetSet) { + int count = 0; + for (Character ch : + characters) { + if (targetSet.contains(ch)){ + targetSet.remove(ch); + count++; + } + } + return count; + } + + private Set generateSet(String sticker) { + Set stickerSet = new HashSet(); + for (int i = 0; i < sticker.length(); i++) { + stickerSet.add(sticker.charAt(i)); + } + return stickerSet; + } + + public static void main(String[] args) { + MinStickers minStickers = new MinStickers(); + Set stickerSet = minStickers.generateSet("starta"); + Set targetSetOri = new HashSet(stickerSet); + targetSetOri.remove('s'); + for (Character sticker: + stickerSet) { + System.out.print(sticker); + } + System.out.println(); + for (Character sticker: + targetSetOri) { + System.out.print(sticker); + } + System.out.println(); + int matchCount = minStickers.intersection(stickerSet, targetSetOri); + System.out.println(matchCount); + for (Character sticker: + targetSetOri) { + System.out.print(sticker); + } + System.out.println(minStickers.minStickers(new String[]{"with","example","science"}, "thehat")); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/MinStickers2.java b/comxjtu/src/main/java/com/leetcode/everyday/MinStickers2.java new file mode 100644 index 0000000..8e0c06b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/MinStickers2.java @@ -0,0 +1,50 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月14日 20:15 + * @description //691:这个解答实现错了,将重复选用的记为一次了;如果不记为一次,则使用map数组来做、 + */ +public class MinStickers2 { + class Solution { + public int minStickers(String[] stickers, String target) { + int m = target.length(); + int[] memo = new int[1 << m]; + Arrays.fill(memo, -1); + memo[0] = 0; + int res = dp(stickers, target, memo, (1 << m) - 1); + return res <= m ? res : -1; + } + + public int dp(String[] stickers, String target, int[] memo, int mask) { + int m = target.length(); + if (memo[mask] < 0) { + int res = m + 1; + for (String sticker : stickers) { + int left = mask; + int[] cnt = new int[26]; + for (int i = 0; i < sticker.length(); i++) { + cnt[sticker.charAt(i) - 'a']++; + } + for (int i = 0; i < target.length(); i++) { + char c = target.charAt(i); + if (((mask>> i) & 1) == 1 && cnt[c - 'a']> 0) { + cnt[c - 'a']--; + left ^= 1 << i; + } + } + if (left < mask) { + res = Math.min(res, dp(stickers, target, memo, left) + 1); + } + } + memo[mask] = res; + } + return memo[mask]; + } + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/ModifiedGraphEdges.java b/comxjtu/src/main/java/com/leetcode/everyday/ModifiedGraphEdges.java new file mode 100644 index 0000000..259689d --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/ModifiedGraphEdges.java @@ -0,0 +1,103 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/9 8:17 + * @description //2699. 修改图中的边权 + */ +public class ModifiedGraphEdges { + + public int[][] modifiedGraphEdges(int n, int[][] edges, int source, int destination, int target) { + int k = 0; + for (int[] e : edges) { + if (e[2] == -1) { + ++k; + } + } + + if (dijkstra(source, destination, construct(n, edges, 0, target))> target) { + return new int[0][]; + } + if (dijkstra(source, destination, construct(n, edges, (long) k * (target - 1), target)) < target) { + return new int[0][]; + } + + long left = 0, right = (long) k * (target - 1), ans = 0; + while (left <= right) { + long mid = (left + right) / 2; + if (dijkstra(source, destination, construct(n, edges, mid, target))>= target) { + ans = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + + for (int[] e : edges) { + if (e[2] == -1) { + if (ans>= target - 1) { + e[2] = target; + ans -= target - 1; + } else { + e[2] = (int) (1 + ans); + ans = 0; + } + } + } + + return edges; + } + + public long dijkstra(int source, int destination, int[][] adjMatrix) { + // 朴素的 dijkstra 算法 + // adjMatrix 是一个邻接矩阵 + int n = adjMatrix.length; + long[] dist = new long[n]; + Arrays.fill(dist, Integer.MAX_VALUE / 2); + boolean[] used = new boolean[n]; + dist[source] = 0; + + for (int round = 0; round < n - 1; ++round) { + int u = -1; + for (int i = 0; i < n; ++i) { + if (!used[i] && (u == -1 || dist[i] < dist[u])) { + u = i; + } + } + used[u] = true; + for (int v = 0; v < n; ++v) { + if (!used[v] && adjMatrix[u][v] != -1) { + dist[v] = Math.min(dist[v], dist[u] + adjMatrix[u][v]); + } + } + } + + return dist[destination]; + } + + public int[][] construct(int n, int[][] edges, long idx, int target) { + // 需要构造出第 idx 种不同的边权情况,返回一个邻接矩阵 + int[][] adjMatrix = new int[n][n]; + for (int i = 0; i < n; ++i) { + Arrays.fill(adjMatrix[i], -1); + } + for (int[] e : edges) { + int u = e[0], v = e[1], w = e[2]; + if (w != -1) { + adjMatrix[u][v] = adjMatrix[v][u] = w; + } else { + if (idx>= target - 1) { + adjMatrix[u][v] = adjMatrix[v][u] = target; + idx -= (target - 1); + } else { + adjMatrix[u][v] = adjMatrix[v][u] = (int) (1 + idx); + idx = 0; + } + } + } + return adjMatrix; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NextLargerNodes.java b/comxjtu/src/main/java/com/leetcode/everyday/NextLargerNodes.java new file mode 100644 index 0000000..12f372c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NextLargerNodes.java @@ -0,0 +1,53 @@ +package com.leetcode.everyday; + + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月10日 11:36 + * @description //1019. 链表中的下一个更大节点 + */ +public class NextLargerNodes { + + class Solution { + public int[] nextLargerNodes(ListNode head) { + List ans = new ArrayList(); + Deque stack = new ArrayDeque(); + + ListNode cur = head; + int idx = -1; + while (cur != null) { + ++idx; + ans.add(0); + while (!stack.isEmpty() && stack.peek()[0] < cur.val) { + ans.set(stack.pop()[1], cur.val); + } + stack.push(new int[]{cur.val, idx}); + cur = cur.next; + } + + int size = ans.size(); + int[] arr = new int[size]; + for (int i = 0; i < size; ++i) { + arr[i] = ans.get(i); + } + return arr; + } + } + + class ListNode { + int val; + ListNode next; + + ListNode(int x) { + this.val = x; + } + + ListNode(int val, ListNode next) { this.val = val; this.next = next;} + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NumMoveStonesII.java b/comxjtu/src/main/java/com/leetcode/everyday/NumMoveStonesII.java new file mode 100644 index 0000000..fdcac07 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NumMoveStonesII.java @@ -0,0 +1,53 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/7 10:45 + * @description //1040. 移动石子直到连续 II + */ +public class NumMoveStonesII { + + public int[] numMovesStonesII(int[] stones) { + int[] ans = new int[2]; + int len = stones.length; + int[] space = new int[len-1]; + int minCount = 0, maxCount = 0; + + Arrays.sort(stones); + while (stones[len-1]-stones[0]>len-1){ +// int[] maxValueandIndex = getMaxValueandIndex(space); +// int[] minValueandIndex = getMinValueandIndex(space); + int min=stones[len-1], max=-1, maxIndex=-1, minIndex=-1; + for (int i = 1; i < stones.length; i++) { + space[i-1] = stones[i]-stones[i-1]; + if (space[i-1]>max){ + max = space[i-1]; + maxIndex = i-1; + } else if (space[i - 1] < min) { + min = space[i-1]; + minIndex = i-1; + } + } + + if (space[0]==1){ + update(stones, max, maxIndex); + minCount++; + }else if (space[len-2]==1){ + + }else { + + } + Arrays.sort(stones); + } + + + + return ans; + } + + private void update(int[] stones, int max, int maxIndex) { + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NumMovesStones.java b/comxjtu/src/main/java/com/leetcode/everyday/NumMovesStones.java new file mode 100644 index 0000000..6fe5274 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NumMovesStones.java @@ -0,0 +1,59 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/30 16:23 + * @description //1033. 移动石子直到连续 + * 1040. 移动石子直到连续 II + */ +public class NumMovesStones { + + + /** + * + * @Param + * @Description //贪心算法 + * @Date 16:24 2023/4/30 + * @return + **/ + public int[] numMovesStones(int a, int b, int c) { + int x = Math.min(Math.min(a, b), c); + int z = Math.max(Math.max(a, b), c); + int y = a + b + c - x - z; + + int[] res = new int[2]; + res[0] = 2; + if (z - y == 1 && y - x == 1) { + res[0] = 0; + } else if (z - y <= 2 || y - x <= 2) { + res[0] = 1; + } + res[1] = z - x - 2; + return res; + } + + public int[] numMovesStonesII(int[] stones) { + int n = stones.length; + Arrays.sort(stones); + if (stones[n - 1] - stones[0] + 1 == n) { + return new int[]{0, 0}; + } + int ma = Math.max(stones[n - 2] - stones[0] + 1, stones[n - 1] - stones[1] + 1) - (n - 1); + int mi = n; + for (int i = 0, j = 0; i < n && j + 1 < n; ++i) { + while (j + 1 < n && stones[j + 1] - stones[i] + 1 <= n) { + ++j; + } + if (j - i + 1 == n - 1 && stones[j] - stones[i] + 1 == n - 1) { + mi = Math.min(mi, 2); + } else { + mi = Math.min(mi, n - (j - i + 1)); + } + } + return new int[]{mi, ma}; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NumPairsDivisibleBy60.java b/comxjtu/src/main/java/com/leetcode/everyday/NumPairsDivisibleBy60.java new file mode 100644 index 0000000..05ae40c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NumPairsDivisibleBy60.java @@ -0,0 +1,23 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/7 18:16 + * @description //1010. 总持续时间可被 60 整除的歌曲 + */ +public class NumPairsDivisibleBy60 { + + public int numPairsDivisibleBy60(int[] time) { + int[] cnt = new int[60]; + for (int t : time) { + cnt[t % 60]++; + } + long res = 0; + for (int i = 1; i < 30; i++) { + res += cnt[i] * cnt[60 - i]; + } + res += (long) cnt[0] * (cnt[0] - 1) / 2 + (long) cnt[30] * (cnt[30] - 1) / 2; + return (int) res; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NumSmallerByFrequency.java b/comxjtu/src/main/java/com/leetcode/everyday/NumSmallerByFrequency.java new file mode 100644 index 0000000..ac671f2 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NumSmallerByFrequency.java @@ -0,0 +1,48 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/10 9:06 + * @description //1170. 比较字符串最小字母出现频次 + */ +public class NumSmallerByFrequency { + + public int[] numSmallerByFrequency(String[] queries, String[] words) { + int[] ans = new int[queries.length]; + +// 先对words处理,将其保存在hashmap中 + Map map = new HashMap(); + for (String word : words) { + int count = f(word); + map.put(count, map.getOrDefault(count, 0)+1); + } + + int i = 0; + for (String query : queries) { + int count = f(query); + int ansNow = 0; + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey()>count) ansNow+=entry.getValue(); + } + ans[i]=ansNow; + i++; + } + return ans; + } + + private int f(String word) { + int ans = 1; + char[] chars = word.toCharArray(); + Arrays.sort(chars); + for (int i = 0; i < chars.length-1; i++) { + if (chars[i]==chars[i+1]) ans++; + else break; + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/NumSubarray.java b/comxjtu/src/main/java/com/leetcode/everyday/NumSubarray.java new file mode 100644 index 0000000..35ea2e0 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/NumSubarray.java @@ -0,0 +1,29 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/5 9:09 + * @description //LC713 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。 + */ +public class NumSubarray { + + public int numSubarrayProductLessThanK(int[] nums, int k) { + if (k<=0) return 0; + int count = 0; + for (int i = 0; i < nums.length; i++) { + if (nums[i] emailSet = new HashSet(); + for (String email : emails) { + int i = email.indexOf('@'); + String local = email.substring(0, i).split("\\+")[0]; // 去掉本地名第一个加号之后的部分 + local = local.replace(".", ""); // 去掉本地名中所有的句点 + emailSet.add(local + email.substring(i)); + } + return emailSet.size(); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/OddString.java b/comxjtu/src/main/java/com/leetcode/everyday/OddString.java new file mode 100644 index 0000000..f244b53 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/OddString.java @@ -0,0 +1,61 @@ +package com.leetcode.everyday; + +import java.util.HashMap; +import java.util.LinkedHashMap; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月25日 20:32 + * @description //TODO + */ +public class OddString { + + public String oddString(String[] words) { + HashMap hash = new LinkedHashMap(); + int count = 0; + for (String word : words) { + count++; + StringBuilder diff = new StringBuilder(); + for (int i = 0; i < word.length()-1; i++) { + diff.append("*"); + diff.append(word.charAt(i+1)-word.charAt(i)); + } + String s= diff.toString(); + if (!hash.containsKey(s)){ + if (count>3){ + return word; + }else { + hash.put(s,1); + } + }else { + hash.put(s,hash.get(s)+1); + } + } + + + for(String key:hash.keySet()) { + int value = hash.get(key); + if (value==1){ + for (int j = 0; j < 3; j++) { + StringBuilder diff = new StringBuilder(); + for (int i = 0; i < words[j].length()-1; i++) { + diff.append("*"); + diff.append(words[j].charAt(i+1)-words[j].charAt(i)); + } + String s= diff.toString(); + if (s.equals(key)){ + return words[j]; + } + } + } + } + return ""; + } + + public static void main(String[] args) { + OddString solver = new OddString(); + String[] words = {"abm","bcn","alm"}; + System.out.println(solver.oddString(words)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/OneEditAway.java b/comxjtu/src/main/java/com/leetcode/everyday/OneEditAway.java new file mode 100644 index 0000000..e52a39c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/OneEditAway.java @@ -0,0 +1,66 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/13 10:21 + * @description //面试题 01.05. 一次编辑 + */ +public class OneEditAway { + public boolean oneEditAway(String first, String second) { + if (first == null || second==null) return false; + if (Math.abs(first.length()-second.length())>1) return false; + int count = 0; + if (first.length() == second.length()){ + for (int i = 0; i < first.length(); i++) { + if (first.charAt(i)!=second.charAt(i)) count++; + if (count==2) return false; + } + return true; + }else { + if (first.length()> pacificAtlantic(int[][] heights) { + List> resultList = new LinkedList(); + if (heights == null){ + return resultList; + } + int m = heights.length, n = heights[0].length; + + //右上角和左下角 + List listRight = new ArrayList(Arrays.asList(new int[]{0,n-1})); + resultList.add(listRight); + if (m == 1 && n == 1){ + return resultList; + } + List listLeft = new ArrayList(Arrays.asList(new int[]{m-1,0})); + resultList.add(listLeft); + + //处理每一行 + + return resultList; + } + + public static void main(String[] args) { + + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/PowerfulIntegers.java b/comxjtu/src/main/java/com/leetcode/everyday/PowerfulIntegers.java new file mode 100644 index 0000000..b6e6159 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/PowerfulIntegers.java @@ -0,0 +1,37 @@ +package com.leetcode.everyday; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月2日 21:35 + * @description //970. 强整数 + */ +class PowerfulIntegers { + public List powerfulIntegers(int x, int y, int bound) { + Set set = new HashSet(); + int value1 = 1; + for (int i = 0; i < 21; i++) { + int value2 = 1; + for (int j = 0; j < 21; j++) { + int value = value1 + value2; + if (value <= bound) { + set.add(value); + } else { + break; + } + value2 *= y; + } + if (value1> bound) { + break; + } + value1 *= x; + } + return new ArrayList(set); + } +} + diff --git a/comxjtu/src/main/java/com/leetcode/everyday/PrevPermOpt1.java b/comxjtu/src/main/java/com/leetcode/everyday/PrevPermOpt1.java new file mode 100644 index 0000000..6939baa --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/PrevPermOpt1.java @@ -0,0 +1,39 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月3日 11:17 + * @description //1053. 交换一次的先前排列 + */ +public class PrevPermOpt1 { + + public int[] prevPermOpt1(int[] A) { + int len = A.length; + int curMax = -1; + int index = -1; + boolean hasResult = false; + for (int i = len - 2; i>= 0; i--) { + if (A[i+1] < A[i]) { // 此处逆序,需要移动A[i] + for (int j = i + 1; j < len; j++) { // 寻找与 A[i] 交换的位置 + if (A[i]> A[j]) { // 必须满足 A[i]> A[j],否则不能满足交换后的字典序小于原始字典序 + hasResult = true; + if (A[j]> curMax) { + curMax = A[j]; + index = j; + } + } + } + if (hasResult) { + int tmp = A[i]; + A[i] = A[index]; + A[index] = tmp; + return A; + } + } + } + return A; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/QuadTree.java b/comxjtu/src/main/java/com/leetcode/everyday/QuadTree.java new file mode 100644 index 0000000..74de0fa --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/QuadTree.java @@ -0,0 +1,138 @@ +package com.leetcode.everyday; + +import com.sun.org.apache.bcel.internal.generic.I2F; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2022年4月29日 11:15 + * @description lc427: + * 给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。 + * 你需要返回能表示矩阵的 四叉树 的根结点。 + */ +public class QuadTree { + + public Node construct(int[][] grid) { + Node root = new Node(); + int length = grid.length ; + //TODO:length为0时怎么办 + + if (length<=1){ + root.isLeaf = true; + root.val = grid[0][0]==1 ? true : false; + return root; + } + + root = constructChild(grid,0,0,length); + + return root; + } + + private Node constructChild(int[][] grid, int startX, int startY, int length) { + Node parent = new Node(); + if (length==1){ + parent.isLeaf = true; + parent.val = grid[startX][startY]==1 ? true : false; + return parent; + } + length = length/2; + Node topLeft = constructChild(grid, startX, startY, length); + Node topRight = constructChild(grid, startX, startY+length, length); + Node bottomLeft = constructChild(grid, startX+length, startY, length); + Node bottomRight = constructChild(grid, startX+length, startY+length, length); + + int ans = 0; + ans += topLeft.val ? 1 :0; + ans += topRight.val ? 1 :0; + ans += bottomLeft.val ? 1 :0; + ans += bottomRight.val ? 1 :0; + + if ((topLeft.isLeaf && topRight.isLeaf && bottomLeft.isLeaf && bottomRight.isLeaf) && (ans==0 || ans==4)){ + parent.val = topLeft.val; + parent.isLeaf = true; + + }else { + parent.topLeft = topLeft; + parent.topRight = topRight; + parent.bottomLeft = bottomLeft; + parent.bottomRight = bottomRight; + parent.val = true; + } + return parent; + } + + /** + * @Description 节点定义 + * @Date 11:33 2022/4/29 + **/ + class Node { + public boolean val; + public boolean isLeaf; + public Node topLeft; + public Node topRight; + public Node bottomLeft; + public Node bottomRight; + + + public Node() { + this.val = false; + this.isLeaf = false; + this.topLeft = null; + this.topRight = null; + this.bottomLeft = null; + this.bottomRight = null; + } + + public Node(boolean val, boolean isLeaf) { + this.val = val; + this.isLeaf = isLeaf; + this.topLeft = null; + this.topRight = null; + this.bottomLeft = null; + this.bottomRight = null; + } + + public Node(boolean val, boolean isLeaf, Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) { + this.val = val; + this.isLeaf = isLeaf; + this.topLeft = topLeft; + this.topRight = topRight; + this.bottomLeft = bottomLeft; + this.bottomRight = bottomRight; + } + } + + public void outResult(Node root){ + + levelOrder(root); + } + + private List levelOrder(Node root){ + List resList = new LinkedList(); + Queue queue = new LinkedList(); + if (root == null){ + return resList; + } + queue.add(root); + while (!queue.isEmpty()){ + Node node = queue.poll(); + int[] res = {0,1}; + if (node.isLeaf) res[0]=1; + res[1]=node.val ? 1 : 0; + resList.add(res); + System.out.print(Arrays.toString(res)+","); + if (node.topLeft != null) queue.add(node.topLeft); + if (node.topRight != null) queue.add(node.topRight); + if (node.bottomLeft != null) queue.add(node.bottomLeft); + if (node.bottomRight != null) queue.add(node.bottomRight); + } + System.out.println(); + return resList; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/RandomPoint.java b/comxjtu/src/main/java/com/leetcode/everyday/RandomPoint.java new file mode 100644 index 0000000..495ec72 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/RandomPoint.java @@ -0,0 +1,47 @@ +package com.leetcode.everyday; + +import java.util.Arrays; +import java.util.Random; + +/** + * @author JS + * @version 1.0 + * @date 2022年6月5日 10:27 + * @description //478. 在圆内随机生成点 + * 这里实现的方法看似可行,但是分布并不是,所以还是采用拒绝采样的思路来做。 + * (拒绝采样的意思是说:我们在一个更大的范围内生成随机数,并拒绝掉那些不在题目给定范围内的随机数, + * 此时保留下来的随机数都是在范围内的。为了在一个半径为 RR 的圆中生成均匀随机点,我们可以使用一个边长为 2R2R 的正方形覆盖住圆, + * 并在正方形内生成均匀随机点,此时就只需要对于横坐标和纵坐标分别生成一个随机数即可。) + */ +public class RandomPoint { + + private double radius; + private double x_center, y_center; + + public RandomPoint(double radius, double x_center, double y_center) { + this.radius = radius; + this.x_center = x_center; + this.y_center = y_center; + } + + public double[] randPoint() { + Random random = new Random(); +// double x_left = x_center-radius, x_right = x_center+radius; + double x_random = x_center+random.nextDouble() * radius; + double y_half = Math.sqrt(radius*radius- Math.pow(x_random-x_center,2)); +// double y_up = y_center+y_half, y_down=y_center-y_half; + double y_random = y_center + random.nextDouble() *y_half;; + return new double[]{x_random, y_random}; + } + + public static void main(String[] args) { + RandomPoint randomPoint = new RandomPoint(1.0,0.0,0.0); + System.out.println(Arrays.toString(randomPoint.randPoint())); + System.out.println(Arrays.toString(randomPoint.randPoint())); + System.out.println(Arrays.toString(randomPoint.randPoint())); + System.out.println(Arrays.toString(randomPoint.randPoint())); + System.out.println(Arrays.toString(randomPoint.randPoint())); + System.out.println(Arrays.toString(randomPoint.randPoint())); + + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/RecentCounter.java b/comxjtu/src/main/java/com/leetcode/everyday/RecentCounter.java new file mode 100644 index 0000000..41d5ef0 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/RecentCounter.java @@ -0,0 +1,27 @@ +package com.leetcode.everyday; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月6日 9:57 + * @description //lc933写一个 RecentCounter 类来计算特定时间范围内最近的请求。 + */ +public class RecentCounter { + + private Queue queue; + + public RecentCounter() { + queue = new LinkedList(); + } + + public int ping(int t) { + while (queue.peek()!=null && queue.peek() seen = new HashMap(); + int prefix = 0; + for (ListNode node = dummy; node != null; node = node.next) { + prefix += node.val; + seen.put(prefix, node); + } + prefix = 0; + for (ListNode node = dummy; node != null; node = node.next) { + prefix += node.val; + node.next = seen.get(prefix).next; + } + return dummy.next; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/ReorderLogFiles.java b/comxjtu/src/main/java/com/leetcode/everyday/ReorderLogFiles.java new file mode 100644 index 0000000..118dbbd --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/ReorderLogFiles.java @@ -0,0 +1,81 @@ +package com.leetcode.everyday; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月3日 9:38 + * @description //给你一个日志数组 logs。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。 + * 有两种不同类型的日志: +字母日志:除标识符之外,所有字均由小写字母组成 +数字日志:除标识符之外,所有字均由数字组成 +请按下述规则将日志重新排序: +所有 字母日志 都排在 数字日志 之前。 +字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。 +数字日志 应该保留原来的相对顺序。 +返回日志的最终顺序。 + */ +public class ReorderLogFiles { + + public String[] reorderLogFiles(String[] logs) { + if (logs==null || logs.length<2) return logs; +// String[] letter = new String[]{}; +// String[] digit = new String[]{}; + List letters = new ArrayList(); + List digits = new ArrayList(); + Comparator comparator = new Comparator() { + @Override + public int compare(Object o1, Object o2) { + String val1 = (String)o1; + String val2 = (String)o2; + String[] arr1 = val1.split(" "); + String[] arr2 = val2.split(" "); + int i=1,j=1; + while (i{ + int index1 = a.indexOf(" "); + int index2 = b.indexOf(" "); + String a1=a.substring(index1+1); + String b1=b.substring(index2+1); + return a1.equals(b1) ? a.compareTo(b) : a1.compareTo(b1); + }); + letters.addAll(digits); + return letters.toArray(logs); + } + + public static void main(String[] args) { + ReorderLogFiles reorderLogFiles = new ReorderLogFiles(); + String[] input = new String[]{"let1 art zero can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"}; + System.out.println(Arrays.toString(reorderLogFiles.reorderLogFiles(input))); + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/ShortestPathBinaryMatrix.java b/comxjtu/src/main/java/com/leetcode/everyday/ShortestPathBinaryMatrix.java new file mode 100644 index 0000000..007124a --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/ShortestPathBinaryMatrix.java @@ -0,0 +1,54 @@ +package com.leetcode.everyday; + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月26日 8:51 + * @description //1091. 二进制矩阵中的最短路径 + */ +public class ShortestPathBinaryMatrix { + + public int shortestPathBinaryMatrix(int[][] grid) { + int n = grid.length; + if (grid[0][0]==1 || grid[n-1][n-1]==1){ + return -1; + } + + int[][] dirs = new int[][]{{-1,-1}, {-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; + + Queue queue = new LinkedList(); + Set visited = new HashSet(); + queue.offer(new int[]{0, 0}); + visited.add(0); + int ans = 1; + while (!queue.isEmpty()) { + int size = queue.size(); + while (size--> 0) {//BFS中一次处理当前队列的所有元素 + int[] cur = queue.poll(); + if (cur[0] == n - 1 && cur[1] == n - 1) {//到达终点 + return ans; + } + for (int[] dir : dirs) {//遍历八个方向的邻居 + int x = cur[0] + dir[0], y = cur[1] + dir[1]; + int pos = x * n + y; + if (x < 0 || x>= n || y < 0 || y>= n || grid[x][y] == 1 || visited.contains(pos)) { + continue; + } + queue.offer(new int[]{x, y}); + visited.add(pos); + } + } + ans++; + } + return -1;//无法到达终点 + } + + public static void main(String[] args) { + ShortestPathBinaryMatrix solver = new ShortestPathBinaryMatrix(); +// [[0,1,1,0,0,0],[0,1,0,1,1,0],[0,1,1,0,1,0],[0,0,0,1,1,0],[1,1,1,1,1,0],[1,1,1,1,1,0]] + int[][] grid = new int[][]{{0,1,1,0,0,0},{0,1,0,1,1,0},{0,1,1,0,1,0},{0,0,0,1,1,0},{1,1,1,1,1,0},{1,1,1,1,1,0}}; + System.out.println(solver.shortestPathBinaryMatrix(grid)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/SmallestEvenMultiple.java b/comxjtu/src/main/java/com/leetcode/everyday/SmallestEvenMultiple.java new file mode 100644 index 0000000..9a4e244 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/SmallestEvenMultiple.java @@ -0,0 +1,15 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月21日 9:26 + * @description //2413. 最小偶倍数 + */ +public class SmallestEvenMultiple { + public int smallestEvenMultiple(int n) { + if (n<=2) return 2; + if ((n&1)==0) return n; + return n*2; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/SmallestRangeI.java b/comxjtu/src/main/java/com/leetcode/everyday/SmallestRangeI.java new file mode 100644 index 0000000..60543f8 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/SmallestRangeI.java @@ -0,0 +1,37 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2022/4/30 10:22 + * @description //lc908: + * 给你一个整数数组 nums,和一个整数 k 。 +在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。 +nums 的 分数 是 nums 中最大和最小元素的差值。 +在对 nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数 + */ +public class SmallestRangeI { + + /** + * + * @Param + * @Description //使用排序后就一目了然了,最大值和最小值的转换代价最大,所以只需要计算最大和最小即可; + * 其实也不需要排序,找出最大值最小值就行。 + * @Date 10:23 2022/4/30 + * @return + **/ + public int smallestRangeI(int[] nums, int k) { + if (nums == null || nums.length<2) return 0; +// Arrays.sort(nums); +// int ans = nums[nums.length-1]-nums[0] - 2*k; + int max = -1, min=Integer.MAX_VALUE; + for (int i = 0; i < nums.length; i++) { + if (max < nums[i]) max = nums[i]; + if (min> nums[i]) min = nums[i]; + } + int ans = max - min - 2*k; + return ans<=0 ? 0 : ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/SortArrayByParity.java b/comxjtu/src/main/java/com/leetcode/everyday/SortArrayByParity.java new file mode 100644 index 0000000..fad7c04 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/SortArrayByParity.java @@ -0,0 +1,46 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022/4/28 15:54 + * @description //LC905 + * 给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 + * 返回满足此条件的 任一数组 作为答案。 + */ +public class SortArrayByParity { + + + + /** + * + * @Param + * @Description 方法一:双指针(类似于快速排序的partition) + * 双指针:前后指针,时间复杂度为O(N) + 1.前指针为偶数指针evenIndex,从0开始往后走,直到当前值为偶数或者交换后为偶数往后继续, + 2.后指针为奇数指针oddIndex + 3.终止条件evenIndex>=oddIndex, + * @Date 17:46 2022年4月28日 + * @return + **/ + public int[] sortArrayByParity(int[] nums) { + if (nums == null || nums.length == 1){ + return nums; + } + int evenIndex = 0, oddIndex = nums.length-1; + while (evenIndex < nums.length && oddIndex> 0 && evenIndex < oddIndex){ + if (nums[evenIndex]%2 == 0){ + evenIndex++; + }else if (nums[oddIndex]%2 == 0){ + int tmp = nums[evenIndex]; + nums[evenIndex] = nums[oddIndex]; + nums[oddIndex] = tmp; + evenIndex++; + oddIndex--; + }else { + oddIndex--; + } + } + return nums; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/StoreWater.java b/comxjtu/src/main/java/com/leetcode/everyday/StoreWater.java new file mode 100644 index 0000000..6afbf4b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/StoreWater.java @@ -0,0 +1,28 @@ +package com.leetcode.everyday; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/21 16:54 + * @description //LCP 33. 蓄水 + */ +public class StoreWater { + + public int storeWater(int[] bucket, int[] vat) { + int maxk = Arrays.stream(vat).max().getAsInt(); + if (maxk == 0) { + return 0; + } + int res = Integer.MAX_VALUE; + for (int k = 1; k <= maxk && k < res; ++k) { + int t = 0; + for (int i = 0; i < bucket.length; ++i) { + t += Math.max(0, (vat[i] + k - 1) / k - bucket[i]); + } + res = Math.min(res, t + k); + } + return res; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/SumRootToLeaf.java b/comxjtu/src/main/java/com/leetcode/everyday/SumRootToLeaf.java new file mode 100644 index 0000000..4044f95 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/SumRootToLeaf.java @@ -0,0 +1,37 @@ +package com.leetcode.everyday; + +import com.leetcode.util.TreeNode; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/30 8:14 + * @description //1022. 从根到叶的二进制数之和 + */ +public class SumRootToLeaf { + + + int sum=0; + List ansList = new LinkedList(); + public int sumRootToLeaf(TreeNode root) { + if (root==null) return sum; + String ans = ""; + recursion(root,ans); + return sum; + } + + private void recursion(TreeNode root,String ans) { + if (root.left==null && root.right==null) { + ans+=root.val; + sum+=Integer.parseInt(ans, 2); + ansList.add(ans); + return; + } + ans+=root.val; + if (root.left!=null) recursion(root.left, ans); + if (root.right!=null)recursion(root.right, ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/TagValidator.java b/comxjtu/src/main/java/com/leetcode/everyday/TagValidator.java new file mode 100644 index 0000000..621602e --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/TagValidator.java @@ -0,0 +1,130 @@ +package com.leetcode.everyday; + +import java.util.Scanner; +import java.util.Stack; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月2日 11:02 + * @description //lc591给定一个表示代码片段的字符串,你需要实现一个验证器来解析这段代码,并返回它是否合法。 + * 题目比较长,具体可以查看 + */ +public class TagValidator { + + /** + * + * @Description //思路及关键点: + * 1. 解析: + * (1)判断属于哪种模式: + * 闭合标签模式 < 和内容模式(又具体包括代码注释cdata,任意字符) + * < + * 2. 闭合标签模式:TAG_CONTENT + * (1)标签名:正则 + * (2)判断匹配:标签栈,解析到结束标签时,比较名字是否相同 + * (3)嵌套标签:标签栈 + * //(4) 没有对应的> + * 3. 代码注释cdata模式: + * (1)CDATA_CONTENT为任意字符,其中可以包括闭合标签,也就是其中的内容不解析,屏蔽,用flag。 + * (2)需要判断CDATA_CONTENT结束时,第一个]]> + * + * @Date 11:03 2022年5月2日 + * @return + **/ + public boolean isValid2(String code) { + if (code==null || code.length()==0 || !code.startsWith("<")) return false; + int index = 0; + boolean tagFlag, codeFlag; + while(true){ + if (code.charAt(index)=='<'){ + tagFlag = code.matches("^<[a-z]{1,9}>.*"); + codeFlag = code.matches("^ tags = new Stack(); + + int i = 0; + while (i < n) { + if (code.charAt(i) == '<') { + if (i == n - 1) { + return false; + } + if (code.charAt(i + 1) == '/') { + int j = code.indexOf('>', i); + if (j < 0) { + return false; + } + String tagname = code.substring(i + 2, j); + if (tags.isEmpty() || !tags.peek().equals(tagname)) { + return false; + } + tags.pop(); + i = j + 1; + if (tags.isEmpty() && i != n) { + return false; + } + } else if (code.charAt(i + 1) == '!') { + if (tags.isEmpty()) { + return false; + } + if (i + 9> n) { + return false; + } + String cdata = code.substring(i + 2, i + 9); + if (!"[CDATA[".equals(cdata)) { + return false; + } + int j = code.indexOf("]]>", i); + if (j < 0) { + return false; + } + i = j + 1; + } else { + int j = code.indexOf('>', i); + if (j < 0) { + return false; + } + String tagname = code.substring(i + 1, j); + if (tagname.length() < 1 || tagname.length()> 9) { + return false; + } + for (int k = 0; k < tagname.length(); ++k) { + if (!Character.isUpperCase(tagname.charAt(k))) { + return false; + } + } + tags.push(tagname); + i = j + 1; + } + } else { + if (tags.isEmpty()) { + return false; + } + ++i; + } + } + + return tags.isEmpty(); + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + while (true){ + String code = scanner.nextLine(); + System.out.println(code+": "+code.matches("^<[a-z]{1,9}>.*")); + System.out.println(code+": "+code.matches("^ map = new HashMap(); + for (int i = 0; i < matrix.length; i++) { + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + for (int j = 0; j < matrix[0].length; j++) { + // 正序拼接和倒序拼接 + sb1.append(matrix[i][j]); + sb2.append(1 - matrix[i][j]); + } + // 存储相同的01序列的数量 + String s1 = sb1.toString(); + String s2 = sb2.toString(); + map.put(s1, map.getOrDefault(s1, 0) + 1); + map.put(s2, map.getOrDefault(s2, 0) + 1); + } + int maxRows = 0; + for (int value : map.values()) { + // 更新最大行数 + maxRows = Math.max(maxRows, value); + } + return maxRows; + } + + void testWithFiveExamples(){ + int[][] matrix = {{0,1},{1,1}}; + int[][] matrix1 = {{0,1},{1,0}}; + int[][] matrix2 = {{0,0,0},{0,0,1},{1,1,0}}; + int[][] matrix3 = {{1,0,0,0,1,1,1,0,1,1,1},{1,0,0,0,1,0,0,0,1,0,0},{1,0,0,0,1,1,1,0,1,1,1},{1,0,0,0,1,0,0,0,1,0,0},{1,1,1,0,1,1,1,0,1,1,1}}; + int[][] matrix4 = {{0,0,0,0,1,1,1},{0,0,0,0,1,0,1},{1,1,1,0,1,1,1},{0,0,0,0,1,0,0},{0,0,1,0,1,0,0},{0,1,1,0,1,0,0},{0,0,0,0,1,1,1},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0}}; + System.out.println(maxEqualRowsAfterFlips(matrix)); + System.out.println(maxEqualRowsAfterFlips(matrix1)); + System.out.println(maxEqualRowsAfterFlips(matrix2)); + System.out.println(maxEqualRowsAfterFlips(matrix3)); + System.out.println(maxEqualRowsAfterFlips(matrix4)); + } + + public static void main(String[] args) { + Test test = new Test(); + test.testWithFiveExamples(); + } + + + +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/Test.js b/comxjtu/src/main/java/com/leetcode/everyday/Test.js new file mode 100644 index 0000000..fbaeab9 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/Test.js @@ -0,0 +1,6 @@ +function calculateDaysBetweenDates(begin, end) { + let beginDate = new Date(begin); + let endDate = new Date(end); + let days = (endDate - beginDate) / (1000 * 60 * 60 * 24); + return days; +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/TreeAncestor.java b/comxjtu/src/main/java/com/leetcode/everyday/TreeAncestor.java new file mode 100644 index 0000000..725b1de --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/TreeAncestor.java @@ -0,0 +1,32 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/12 10:23 + * @description //1483. 树节点的第 K 个祖先 + * 由于任意k 可以分解为若干不同的2 的幂(例如 13=8+4+1),所以只需要预处理出这些2^i祖先节点,就可以快速地到达任意第k 个祖先节点。 + */ +public class TreeAncestor { + + int[] parent; + int n; + public TreeAncestor(int n, int[] parent) { + this.n = n; + this.parent = parent; + } + + public int getKthAncestor(int node, int k) { + int count = 0; + while (count count = new HashMap(); + for (int x : nums) { + count.merge(x, 1, Integer::sum); + } + int res = 0, n = nums.length, t = 0; + for (Map.Entry entry : count.entrySet()) { + res += t * entry.getValue() * (n - t - entry.getValue()); + t += entry.getValue(); + } + return res; + } + + public static void main(String[] args) { + UnequalTriplets solver = new UnequalTriplets(); + int ans = solver.unequalTriplets(new int[]{1,3,1,2,4}); + System.out.println(ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/ValidIPAddress.java b/comxjtu/src/main/java/com/leetcode/everyday/ValidIPAddress.java new file mode 100644 index 0000000..6e6a304 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/ValidIPAddress.java @@ -0,0 +1,43 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月29日 16:54 + * @description 468. 验证IP地址 + */ +public class ValidIPAddress { + public String validIPAddress(String queryIP) { + if (queryIP.contains(".")){ + if (queryIP.startsWith(".") || queryIP.endsWith(".")) return "Neither"; + String[] strings = queryIP.split("\\."); + + if (strings.length!=4) return "Neither"; + for (String string : strings) { + if(!string.matches("[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]")) + return "Neither"; + } + return "IPv4"; + }else if (queryIP.contains(":")){ + if (queryIP.startsWith(":") || queryIP.endsWith(":")) return "Neither"; + String[] strings = queryIP.split(":"); + if (strings.length!=8) return "Neither"; + for (String string : strings) { + if(string.length()>4||string.length()<1) return "Neither"; + if(!string.matches("[0-9a-fA-F]{1,4}")) + return "Neither"; + } + return "IPv6"; + } + return "Neither"; + } + + public static void main(String[] args) { + ValidIPAddress validIPAddress = new ValidIPAddress(); + String queryIP = "172.16.254.1"; + String[] strings = queryIP.split("\\."); + System.out.println(validIPAddress.validIPAddress(queryIP)); + queryIP ="2001:0db8:85a3:0:0:8A2E:0370:7334:"; + System.out.println(validIPAddress.validIPAddress(queryIP)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/WordSubsets.java b/comxjtu/src/main/java/com/leetcode/everyday/WordSubsets.java new file mode 100644 index 0000000..c3a12be --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/WordSubsets.java @@ -0,0 +1,49 @@ +package com.leetcode.everyday; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import static org.apache.commons.lang3.CharSetUtils.count; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/21 17:45 + * @description //TODO + */ +public class WordSubsets { + + public List wordSubsets(String[] A, String[] B) { + int[] bmax = count(""); + for (String b: B) { + int[] bCount = count(b); + for (int i = 0; i < 26; ++i) + bmax[i] = Math.max(bmax[i], bCount[i]); + } + + List ans = new LinkedList(); + for (String a : A) { + int[] aCount = count(a); + boolean shouldAdd = true; + for (int i = 0; i < 26; ++i) { + if (aCount[i] < bmax[i]) { + shouldAdd = false; + break; + } + } + if (shouldAdd) { + ans.add(a); + } + } + + return ans; + } + + public int[] count(String S) { + int[] ans = new int[26]; + for (char c: S.toCharArray()) + ans[c - 'a']++; + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/everyday/isRobotBounded.java b/comxjtu/src/main/java/com/leetcode/everyday/isRobotBounded.java new file mode 100644 index 0000000..e524288 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/everyday/isRobotBounded.java @@ -0,0 +1,31 @@ +package com.leetcode.everyday; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/11 10:55 + * @description //1041. 困于环中的机器人 + */ +public class isRobotBounded { + + public boolean isRobotBounded(String instructions) { + int[][] direc = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + int direcIndex = 0; + int x = 0, y = 0; + int n = instructions.length(); + for (int idx = 0; idx < n; idx++) { + char instruction = instructions.charAt(idx); + if (instruction == 'G') { + x += direc[direcIndex][0]; + y += direc[direcIndex][1]; + } else if (instruction == 'L') { + direcIndex += 3; + direcIndex %= 4; + } else { + direcIndex++; + direcIndex %= 4; + } + } + return direcIndex != 0 || (x == 0 && y == 0); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/middle/Backpacking.java b/comxjtu/src/main/java/com/leetcode/middle/Backtracking.java similarity index 65% rename from comxjtu/src/main/java/com/leetcode/middle/Backpacking.java rename to comxjtu/src/main/java/com/leetcode/middle/Backtracking.java index ec03eb5..77aa46b 100644 --- a/comxjtu/src/main/java/com/leetcode/middle/Backpacking.java +++ b/comxjtu/src/main/java/com/leetcode/middle/Backtracking.java @@ -1,5 +1,7 @@ package com.leetcode.middle; +import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; + import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; @@ -10,7 +12,7 @@ * @Date: Created in 20:40 2018/6/13 * @Modified By: */ -public class Backpacking { +public class Backtracking { /** * 电话号码的字母组合 * @param digits @@ -37,6 +39,30 @@ public List letterCombinations(String digits) { return result; } + public List letterCombinations2(String digits) { + if (digits == null) return null; + List result = new LinkedList(); + if (digits.length() ==0) return result; + + String[] dict = new String[]{"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; + backtrack(result, digits, dict,0, new StringBuilder()); + return result; + } + + private void backtrack(List result, String digits, String[] dict, int itrDigits, StringBuilder stringBuilder) { + if (itrDigits==digits.length()){ + result.add(stringBuilder.toString()); + return; + } + String string = dict[digits.charAt(itrDigits)-'2']; + for (int i = 0; i < string.length(); i++) { + int size = stringBuilder.length(); + stringBuilder.append(string.charAt(i)); + backtrack(result, digits,dict,itrDigits+1, stringBuilder); + stringBuilder.delete(size,size+1); + } + } + /** * lc46 * 全排列: @@ -45,15 +71,15 @@ public List letterCombinations(String digits) { * @return */ public List> permute(int[] nums) { - List> list = new ArrayList(); + List> list = new LinkedList(); // Arrays.sort(nums); // not necessary - backtrack(list, new ArrayList(), nums); + backtrack(list, new LinkedList(), nums); return list; } private void backtrack(List> list, List tempList, int [] nums){ if(tempList.size() == nums.length){ - list.add(new ArrayList(tempList)); + list.add(new LinkedList(tempList)); } else{ for(int i = 0; i < nums.length; i++){ if(tempList.contains(nums[i])) continue; // element already exists, skip @@ -71,18 +97,20 @@ private void backtrack(List> list, List tempList, int [] * @return */ public List> permuteUnique(int[] nums) { - List> list = new ArrayList(); + List> list = new LinkedList(); Arrays.sort(nums); - backtrack(list, new ArrayList(), nums, new boolean[nums.length]); + backtrack(list, new LinkedList(), nums, new boolean[nums.length]); return list; } private void backtrack(List> list, List tempList, int [] nums, boolean [] used){ - if(tempList.size() == nums.length){ - list.add(new ArrayList(tempList)); - } else{ - for(int i = 0; i < nums.length; i++){ - if(used[i] || i> 0 && nums[i] == nums[i-1] && !used[i - 1]) continue; + if(tempList.size() == nums.length) list.add(new LinkedList(tempList)); + + for(int i = 0; i < nums.length; i++){ + //若在同一层已经遍历过(就是循环过了),则跳过这次 + if(i> 1 && nums[i] == nums[i-1] && !used[i - 1]) continue; + //这个if判断类似于全排列中的if(tempList.contains(nums[i])),不能漏掉 + if (!used[i]){ used[i] = true; tempList.add(nums[i]); backtrack(list, tempList, nums, used); @@ -98,26 +126,23 @@ private void backtrack(List> list, List tempList, int [] * @param k * @return */ - List> list = new ArrayList(); public List> combine(int n, int k) { - - if (n<1 || k<1 || n()); - return list; + List> result = new LinkedList(); + backtrack2(result, new LinkedList(), n, k, 1); + return result; } - private void backtrack(int n, int k, int start, ArrayList ans) { - if (ans.size()==k){ - list.add(new ArrayList(ans)); + //i代表的是当前遍历到的节点,每个节点深度遍历的时候只遍历后面的节点 + private void backtrack2(List> result, List list, int n, int k, int i) { + if (list.size()==k){ + result.add(new LinkedList(list)); return; } -// 使用剪枝优化,将i<=n 改为i<= n-(k-ans.size)+1 -// for (int i = start; i <= n; i++) { - for (int i = start; i <= n-(k-ans.size())+1; i++) { - ans.add(i); - backtrack(n,k,i+1,ans); - ans.remove(ans.size()-1); + for (int j = i; j < n+1; j++) { + //不用判断是否遍历过,之前的都遍历过了 + list.add(j); + backtrack2(result, list, n, k, j+1); + list.remove(list.size() - 1); } } @@ -218,22 +243,23 @@ public boolean isPalindrome(String s, int low, int high){ * @return */ public List generateParenthesis(int n) { - List list = new ArrayList(); - backtrack(list, "", 0, 0, n); + List list = new LinkedList(); + backtrack(list, new StringBuilder(), 0, 0, n); return list; } - public void backtrack(List list, String str, int open, int close, int max){ - + public void backtrack(List list, StringBuilder str, int open, int close, int max){ if(str.length() == max*2){ - list.add(str); - return; + list.add(str.toString()); + return; } + if(open < max) { + backtrack(list, str.append("("), open+1, close, max); + str.delete(str.length()-1, str.length()); + } + if(close < open) { + backtrack(list, str.append(")"), open, close+1, max); + str.delete(str.length()-1, str.length()); } - - if(open < max) - backtrack(list, str+"(", open+1, close, max); - if(close < open) - backtrack(list, str+")", open, close+1, max); } /** @@ -246,32 +272,19 @@ public void backtrack(List list, String str, int open, int close, int ma */ public List> subsets(int[] nums) { List> result = new LinkedList(); - if (nums.length==0) return result; - int len = nums.length; - for (int i = 0; i < Math.pow(2, len); i++) { - String tmp = Integer.toBinaryString(i); - List list = new LinkedList(); -// String ans = ""; - for (int j = 0; j < tmp.length(); j++) { - if (tmp.charAt(tmp.length()-1-j)=='1') list.add(nums[j]); - } - result.add(list); - } + result.add(new LinkedList()); + backtrack(result, new LinkedList(),nums, 0); return result; } - public List> subsets2(int[] nums) { - List> list = new ArrayList(); - Arrays.sort(nums); - backtrack1(list, new ArrayList(), nums, 0); - return list; - } - private void backtrack1(List> list , List tempList, int [] nums, int start){ - list.add(new ArrayList(tempList)); - for(int i = start; i < nums.length; i++){ - tempList.add(nums[i]); - backtrack1(list, tempList, nums, i + 1); - tempList.remove(tempList.size() - 1); + private void backtrack(List> result, LinkedList list, int[] nums, int i) { + if (i==nums.length) return; + + for (int j = i; j < nums.length; j++) { + list.add(nums[j]); + result.add(new LinkedList(list)); + backtrack(result, list, nums, j+1); + list.removeLast(); } } @@ -303,27 +316,37 @@ private void backtrack(List> list, List tempList, int [] * @param word * @return */ - public boolean exist(char[][] board, String word) { - char[] w = word.toCharArray(); - for (int y=0; y=word.length()) return true; + if (startX<0 || startX>board.length-1 || startY<0 || startY>board[0].length-1) return false; + + + if (!used[startX][startY]){ + if (word.charAt(wordIndex)==board[startX][startY]){ + used[startX][startY]= true; + boolean left = backtrack(board, word, used, startX-1, startY, wordIndex+1); + boolean right = backtrack(board, word, used, startX+1, startY, wordIndex+1); + boolean up = backtrack(board, word, used, startX, startY+1, wordIndex+1); + boolean down = backtrack(board, word, used, startX, startY-1, wordIndex+1); + if(left || right || up || down) return true; + used[startX][startY]= false; + } + } + return false; + } - return false; - } - private boolean exist(char[][] board, int y, int x, char[] word, int i) { - if (i == word.length) return true; - if (y<0 || x<0 || y == board.length || x == board[y].length) return false; - if (board[y][x] != word[i]) return false; - board[y][x] ^= 256; - boolean exist = exist(board, y, x+1, word, i+1) - || exist(board, y, x-1, word, i+1) - || exist(board, y+1, x, word, i+1) - || exist(board, y-1, x, word, i+1); - board[y][x] ^= 256; - return exist; - } int[][] dir = new int[][]{{0,-1},{1,0},{0,1},{-1,0}}; int m,n; @@ -391,13 +414,14 @@ private void DFSMarking(char[][] grid, int i, int j) { } public static void main(String[] args){ - int i=0; - String tmp = Integer.toBinaryString(i); - System.out.println(tmp.length()); - String tmp2 = Integer.toBinaryString(7); - System.out.println(tmp2.length()); - int[] nums = new int[]{1,2,3}; - Backpacking bp = new Backpacking(); - List> result=bp.subsets(nums); +// int i=0; +// String tmp = Integer.toBinaryString(i); +// System.out.println(tmp.length()); +// String tmp2 = Integer.toBinaryString(7); +// System.out.println(tmp2.length()); +// int[] nums = new int[]{1,2,3}; + Backtracking bp = new Backtracking(); +// List> result=bp.subsets(nums); + List result = bp.letterCombinations2("23"); } } diff --git a/comxjtu/src/main/java/com/leetcode/middle/DP.java b/comxjtu/src/main/java/com/leetcode/middle/DP.java index 723b5bd..9e3b791 100644 --- a/comxjtu/src/main/java/com/leetcode/middle/DP.java +++ b/comxjtu/src/main/java/com/leetcode/middle/DP.java @@ -4,35 +4,65 @@ /** * @Author: Jay - * @Date: Created in 17:50 2018年6月9日 + * @Date: * @Modified By: + * @Description: 来源力扣中级算法之动态规划问题,https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvb8zs/ */ public class DP { + + /** + * + * @Param + * @Description //给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 + * 数组中的每个元素代表你在该位置可以跳跃的最大长度。 + * 判断你是否能够到达最后一个下标。 + * way1:贪心:依次遍历数组中的每一个位置,并实时维护 最远可以到达的位置。 + * @Date 21:38 2022年4月29日 + * @return + **/ public boolean canJump(int[] nums) { - if (nums.length<2) return true; - int n = nums.length-1; - while(n>0){ - boolean flag = false; - int max=0; - for (int i = n-1; i>=0; i--) { - if (i==0){ - if (n-i<=nums[i]){ - flag = true; - max = i; - } - }else if (n-i<=nums[i]){ - flag = true; - max = i; + int n = nums.length; + int rightmost = 0; + for (int i = 0; i < n; ++i) { + if (i <= rightmost) { + rightmost = Math.max(rightmost, i + nums[i]); + if (rightmost>= n - 1) { + return true; } } - if (flag){ - n=max; - }else { - return false; + } + return false; + } + + /** + * + * @Param + * @Description //way2:从后往前,用dp数组记录当前位置能否由最后到达。 + * @Date 22:41 2022年4月29日 + * @return + **/ + public boolean canJump2(int[] nums) { + int length = nums.length; + boolean[] dp = new boolean[length]; + dp[length-1] = true; + for (int i = length-1; i> 0; i--) { + if (dp[i]){ + for (int j = 0; j < i; j++) { + if (dp[0]){ + return true; + } + if (dp[j]){ + continue; + } + if (nums[j]+j>= i){ + dp[j] = true; + } + } } } - return true; + + return dp[0]; } /** @@ -63,11 +93,18 @@ public int uniquePaths(int m, int n) { } + + /** + * @Description 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 + 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 + * @Date 22:56 2022年4月29日 + * @return + **/ public int coinChange(int[] coins, int amount) { if(amount<1) return 0; int[] dp = new int[amount+1]; - for (int i = 1;i<=amount;i++) - dp[i] = Integer.MAX_VALUE; + Arrays.fill(dp,Integer.MAX_VALUE); + dp[0] = 0; for (int i = 0;i= 0; --j) { + curWidth += books[j][0]; + if (curWidth> shelfWidth) { + break; + } + maxHeight = Math.max(maxHeight, books[j][1]); + dp[i + 1] = Math.min(dp[i + 1], dp[j] + maxHeight); + } + } + return dp[n]; + } } diff --git a/comxjtu/src/main/java/com/leetcode/middle/Link.java b/comxjtu/src/main/java/com/leetcode/middle/Link.java index 83e6d78..963d0e0 100644 --- a/comxjtu/src/main/java/com/leetcode/middle/Link.java +++ b/comxjtu/src/main/java/com/leetcode/middle/Link.java @@ -55,6 +55,7 @@ public ListNode oddEvenList2(ListNode head) { return head; } + public class ListNode{ int val; ListNode next; diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/BinarySearch/binarySearchAll.java b/comxjtu/src/main/java/com/leetcode/otherSet/BinarySearch/binarySearchAll.java new file mode 100644 index 0000000..8803b4c --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/BinarySearch/binarySearchAll.java @@ -0,0 +1,350 @@ +package com.leetcode.otherSet.BinarySearch; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月28日 16:42 + * @description //二分查找专题 + */ +public class binarySearchAll { + +// 标准模板 + public int searchInsert(int[] nums, int target) { + int n = nums.length; + int l = 0, r = n-1; + + while (l<=r){ + int mid = l + (r-l)/2; + if (nums[mid]==target) return mid; + else if (nums[mid]> target) { + r = mid-1; + }else l = mid+1; + } + return l; + } + +//74. 搜索二维矩阵 + public boolean searchMatrix(int[][] matrix, int target) { + int m = matrix.length, n = matrix[0].length; + int l = 0, r = m-1; + + while (l<=r){ + int mid = l + (r-l)/2; + if (matrix[mid][0]==target) return true; + else if (matrix[mid][0]> target) { + r = mid - 1; + }else l=mid+1; + } + if (l==0) return false; + int row = l-1; + l = 0; + r = n-1; + while (l<=r){ + int mid = l + (r-l)/2; + if (matrix[row][mid]==target) return true; + else if (matrix[row][mid]> target) { + r = mid - 1; + }else l=mid+1; + } + return false; + } + +/* +162. 寻找峰值: +参考:https://leetcode-cn.com/problems/find-peak-element/solution/xun-zhao-feng-zhi-by-leetcode-solution-96sj/ +为什么能用二分查找?因为题目中说了 nums[-1] = nums[n] = -∞, nums[i] != nums[i+1],那么 nums[i] 和 nums[i+1] 一定有一个是上升的,有一个是下降的,所以可以用二分查找 +核心:首先要注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值 +关键:right 为什么是 nums.length - 2 ?这道题比较特殊,是为了防止nums[mid + 1]越界 +* */ + public int findPeakElement(int[] nums) { + int left = 0, right = nums.length - 2; + while (left <= right) { + int mid = left + (right - left) / 2; + if (nums[mid]> nums[mid + 1]) { + right = mid-1; + } else { + left = mid + 1; + } + } + return left; + } +/*33. 搜索旋转排序数组 +* 核心:将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。 +此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环. +* */ + public int search(int[] nums, int target) { + int n = nums.length; + if (n == 0) { + return -1; + } + if (n == 1) { + return nums[0] == target ? 0 : -1; + } + int l = 0, r = n - 1; + while (l <= r) { + int mid = l+(r-l) / 2; + if (nums[mid] == target) { + return mid; + } + if (nums[0] <= nums[mid]) { + if (nums[0] <= target && target < nums[mid]) { + r = mid - 1; + } else { + l = mid + 1; + } + } else { + if (nums[mid] < target && target <= nums[n - 1]) { + l = mid + 1; + } else { + r = mid - 1; + } + } + } + return -1; + } + +// 34. 在排序数组中查找元素的第一个和最后一个位置 + public int[] searchRange(int[] nums, int target) { + int[] ans = new int[]{-1, -1}; + int left = 0, right = nums.length - 1; + while (left <= right) { + int mid = left + (right - left) / 2; + if (nums[mid] == target){ + if (ans[0]==-1){ + ans[0] = mid; +// ans[1] = mid; + }else { + ans[0] = Math.min(ans[0], mid); + } + right = mid-1; + }else if (nums[mid]> target) { + right = mid-1; + } else { + left = mid + 1; + } + } + if (ans[0]==-1) return ans; + left = ans[0]; + right = nums.length-1; + + while (left <= right) { + int mid = left + (right - left) / 2; + if (nums[mid] == target){ + if (ans[1]==-1){ + ans[1] = mid; + }else { + ans[1] = Math.max(ans[1], mid); + } + left = mid+1; + }else if (nums[mid]> target) { + right = mid-1; + } else { + left = mid + 1; + } + } + return ans; + } +/* +* 153. 寻找旋转排序数组中的最小值 +* 这道题的易错点在于不能用nums[mid]和nums[0]比较,比如[2,1]这个例子,会出错;以及[3,1,2]这个例子,也会出错,因为这两个例子中,nums[mid]nums[n-1]){ +// 左半部分单调 + l = mid+1; + }else { + r = mid-1; + } + } + return nums[l]; + } +/* +4. 寻找两个正序数组的中位数 +* 这道题可以转化成寻找两个有序数组中的第 k 小的数,其中 k 为 (m+n)/2 或 (m+n)/2+1。 +* 可以看到,比较 A[k/2−1] 和 B[k/2−1] 之后,可以排除 k/2 个不可能是第 k 小的数,查找范围缩小了一半。同时,我们将在排除后的新数组上继续进行二分查找,并且根据我们排除数的个数,减少 k 的值,这是因为我们排除的数都不大于第 k 小的数。 +* */ +public double findMedianSortedArrays(int[] nums1, int[] nums2) { + int length1 = nums1.length, length2 = nums2.length; + int totalLength = length1 + length2; + if (totalLength % 2 == 1) { + int midIndex = totalLength / 2; + double median = getKthElement(nums1, nums2, midIndex + 1); + return median; + } else { + int midIndex1 = totalLength / 2 - 1, midIndex2 = totalLength / 2; + double median = (getKthElement(nums1, nums2, midIndex1 + 1) + getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0; + return median; + } +} + + public int getKthElement(int[] nums1, int[] nums2, int k) { + /* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较 + * 这里的 "/" 表示整除 + * nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个 + * nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个 + * 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个 + * 这样 pivot 本身最大也只能是第 k-1 小的元素 + * 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组 + * 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组 + * 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数 + */ + + int length1 = nums1.length, length2 = nums2.length; + int index1 = 0, index2 = 0; + int kthElement = 0; + + while (true) { + // 边界情况 + if (index1 == length1) { + return nums2[index2 + k - 1]; + } + if (index2 == length2) { + return nums1[index1 + k - 1]; + } + if (k == 1) { + return Math.min(nums1[index1], nums2[index2]); + } + + // 正常情况 + int half = k / 2; + int newIndex1 = Math.min(index1 + half, length1) - 1; + int newIndex2 = Math.min(index2 + half, length2) - 1; + int pivot1 = nums1[newIndex1], pivot2 = nums2[newIndex2]; + if (pivot1 <= pivot2) { + k -= (newIndex1 - index1 + 1); + index1 = newIndex1 + 1; + } else { + k -= (newIndex2 - index2 + 1); + index2 = newIndex2 + 1; + } + } + } + +/* +* 378. 有序矩阵中第 K 小的元素 +* */ + public int kthSmallest(int[][] matrix, int k) { + int n = matrix.length; + int left = matrix[0][0]; + int right = matrix[n - 1][n - 1]; + while (left <= right) { + int mid = left + ((right - left)>> 1); + if (check(matrix, mid, k, n)) { + right = mid-1; + } else { + left = mid + 1; + } + } + return left; + } + + public boolean check(int[][] matrix, int mid, int k, int n) { + int i = n - 1; + int j = 0; + int num = 0; + while (i>= 0 && j < n) { + if (matrix[i][j] <= mid) { + num += i + 1; + j++; + } else { + i--; + } + } + return num>= k; + } + + /* + * 373. 查找和最小的 K 对数字 + * */ + public List> kSmallestPairs(int[] nums1, int[] nums2, int k) { + int m = nums1.length; + int n = nums2.length; + + /*二分查找第 k 小的数对和的大小*/ + int left = nums1[0] + nums2[0]; + int right = nums1[m - 1] + nums2[n - 1]; + int pairSum = right; + while (left <= right) { + int mid = left + ((right - left)>> 1); + long cnt = 0; + int start = 0; + int end = n - 1; + while (start < m && end>= 0) { + if (nums1[start] + nums2[end]> mid) { + end--; + } else { + cnt += end + 1; + start++; + } + } + if (cnt < k) { + left = mid + 1; + } else { + pairSum = mid; + right = mid - 1; + } + } + + List> ans = new ArrayList(); + int pos = n - 1; + /*找到小于目标值 pairSum 的数对*/ + for (int i = 0; i < m; i++) { + while (pos>= 0 && nums1[i] + nums2[pos]>= pairSum) { + pos--; + } + for (int j = 0; j <= pos && k> 0; j++, k--) { + List list = new ArrayList(); + list.add(nums1[i]); + list.add(nums2[j]); + ans.add(list); + } + } + + /*找到等于目标值 pairSum 的数对*/ + pos = n - 1; + for (int i = 0; i < m && k> 0; i++) { + int start1 = i; + while (i < m - 1 && nums1[i] == nums1[i + 1]) { + i++; + } + while (pos>= 0 && nums1[i] + nums2[pos]> pairSum) { + pos--; + } + int start2 = pos; + while (pos> 0 && nums2[pos] == nums2[pos - 1]) { + pos--; + } + if (nums1[i] + nums2[pos] != pairSum) { + continue; + } + int count = (int) Math.min(k, (long) (i - start1 + 1) * (start2 - pos + 1)); + for (int j = 0; j < count && k> 0; j++, k--) { + List list = new ArrayList(); + list.add(nums1[i]); + list.add(nums2[pos]); + ans.add(list); + } + } + return ans; + } + + public static void main(String[] args) { + binarySearchAll solver = new binarySearchAll(); +// matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]] + int[][] matrix = new int[][]{{1,3,5,7},{10,11,16,20},{23,30,34,60}}; + int target = 80; + System.out.println(solver.searchMatrix(matrix, target)); +// matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 + + + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/bfs/MinPushBox.java b/comxjtu/src/main/java/com/leetcode/otherSet/bfs/MinPushBox.java new file mode 100644 index 0000000..d57667b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/bfs/MinPushBox.java @@ -0,0 +1,77 @@ +package com.leetcode.otherSet.bfs; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月8日 9:56 + * @description //1263. 推箱子 + */ +public class MinPushBox { + + public int minPushBox(char[][] grid) { + int m = grid.length, n = grid[0].length; + int sx = -1, sy = -1, bx = -1, by = -1; // 玩家、箱子的初始位置 + for (int x = 0; x < m; x++) { + for (int y = 0; y < n; y++) { + if (grid[x][y] == 'S') { + sx = x; + sy = y; + } else if (grid[x][y] == 'B') { + bx = x; + by = y; + } + } + } + + int[] d = {0, -1, 0, 1, 0}; + + int[][] dp = new int[m * n][m * n]; + for (int i = 0; i < m * n; i++) { + Arrays.fill(dp[i], Integer.MAX_VALUE); + } + Queue queue = new ArrayDeque(); + dp[sx * n + sy][bx * n + by] = 0; // 初始状态的推动次数为 0 + queue.offer(new int[]{sx * n + sy, bx * n + by}); + while (!queue.isEmpty()) { + Queue queue1 = new ArrayDeque(); + while (!queue.isEmpty()) { + int[] arr = queue.poll(); + int s1 = arr[0], b1 = arr[1]; + int sx1 = s1 / n, sy1 = s1 % n, bx1 = b1 / n, by1 = b1 % n; + if (grid[bx1][by1] == 'T') { // 箱子已被推到目标处 + return dp[s1][b1]; + } + for (int i = 0; i < 4; i++) { // 玩家向四个方向移动到另一个状态 + int sx2 = sx1 + d[i], sy2 = sy1 + d[i + 1], s2 = sx2*n+sy2; + if (!ok(grid, m, n, sx2, sy2)) { // 玩家位置不合法 + continue; + } + if (bx1 == sx2 && by1 == sy2) { // 推动箱子 + int bx2 = bx1 + d[i], by2 = by1 + d[i + 1], b2 = bx2*n+by2; + if (!ok(grid, m, n, bx2, by2) || dp[s2][b2] <= dp[s1][b1] + 1) { // 箱子位置不合法 或 状态已访问 + continue; + } + dp[s2][b2] = dp[s1][b1] + 1; + queue1.offer(new int[]{s2, b2}); + } else { + if (dp[s2][b1] <= dp[s1][b1]) { // 状态已访问 + continue; + } + dp[s2][b1] = dp[s1][b1]; + queue.offer(new int[]{s2, b1}); + } + } + } + queue = queue1; + } + return -1; + } + + public boolean ok(char[][] grid, int m, int n, int x, int y) { // 不越界且不在墙上 + return x>= 0 && x < m && y>= 0 && y < n && grid[x][y] != '#'; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/huadong/HuaDong.java b/comxjtu/src/main/java/com/leetcode/otherSet/huadong/HuaDong.java new file mode 100644 index 0000000..8cbf681 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/huadong/HuaDong.java @@ -0,0 +1,189 @@ +package com.leetcode.otherSet.huadong; + + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2023/5/30 10:30 + * @description //面试经典150题 滑动窗口专题 + */ +public class HuaDong { + + /* + *209. 长度最小的子数组 + * + * */ + public int minSubArrayLen(int target, int[] nums) { + + int n = nums.length; + int ans = n+1; + int l = 0, r = 0; + int sum = nums[0]; + while (r=target) { + ans = Math.min(r-l+1, ans); + sum -= nums[l]; + l++; + }else { + r++; + if (r set = new HashSet(); + + while (r findSubstring(String s, String[] words) { + List res = new ArrayList(); + int m = words.length, n = words[0].length(), ls = s.length(); + for (int i = 0; i < n; i++) { + if (i + m * n> ls) { + break; + } + Map differ = new HashMap(); + for (int j = 0; j < m; j++) { + String word = s.substring(i + j * n, i + (j + 1) * n); + differ.put(word, differ.getOrDefault(word, 0) + 1); + } + for (String word : words) { + differ.put(word, differ.getOrDefault(word, 0) - 1); + if (differ.get(word) == 0) { + differ.remove(word); + } + } + for (int start = i; start < ls - m * n + 1; start += n) { + if (start != i) { + String word = s.substring(start + (m - 1) * n, start + m * n); + differ.put(word, differ.getOrDefault(word, 0) + 1); + if (differ.get(word) == 0) { + differ.remove(word); + } + word = s.substring(start - n, start); + differ.put(word, differ.getOrDefault(word, 0) - 1); + if (differ.get(word) == 0) { + differ.remove(word); + } + } + if (differ.isEmpty()) { + res.add(start); + } + } + } + return res; + } +/* +* 76. 最小覆盖子串 +* */ +Map ori = new HashMap(); + Map cnt = new HashMap(); + + public String minWindow(String s, String t) { + int tLen = t.length(); + for (int i = 0; i < tLen; i++) { + char c = t.charAt(i); + ori.put(c, ori.getOrDefault(c, 0) + 1); + } + int l = 0, r = -1; + int len = Integer.MAX_VALUE, ansL = -1, ansR = -1; + int sLen = s.length(); + while (r < sLen) { + ++r; + if (r < sLen && ori.containsKey(s.charAt(r))) { + cnt.put(s.charAt(r), cnt.getOrDefault(s.charAt(r), 0) + 1); + } + while (check() && l <= r) { + if (r - l + 1 < len) { + len = r - l + 1; + ansL = l; + ansR = l + len; + } + if (ori.containsKey(s.charAt(l))) { + cnt.put(s.charAt(l), cnt.getOrDefault(s.charAt(l), 0) - 1); + } + ++l; + } + } + return ansL == -1 ? "" : s.substring(ansL, ansR); + } + + public boolean check() { + Iterator iter = ori.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + Character key = (Character) entry.getKey(); + Integer val = (Integer) entry.getValue(); + if (cnt.getOrDefault(key, 0) < val) { + return false; + } + } + return true; + } +/* +* 438. 找到字符串中所有字母异位词 +* */ +public List findAnagrams(String s, String p) { + int sLen = s.length(), pLen = p.length(); + + if (sLen < pLen) { + return new ArrayList(); + } + + List ans = new ArrayList(); + int[] sCount = new int[26]; + int[] pCount = new int[26]; + for (int i = 0; i < pLen; ++i) { + ++sCount[s.charAt(i) - 'a']; + ++pCount[p.charAt(i) - 'a']; + } + + if (Arrays.equals(sCount, pCount)) { + ans.add(0); + } + + for (int i = 0; i < sLen - pLen; ++i) { + --sCount[s.charAt(i) - 'a']; + ++sCount[s.charAt(i + pLen) - 'a']; + + if (Arrays.equals(sCount, pCount)) { + ans.add(i + 1); + } + } + + return ans; +} + + public static void main(String[] args) { + HuaDong huaDong = new HuaDong(); + int[] nums = {2,3,1,2,4,3}; + int target = 7; +// System.out.println(huaDong.minSubArrayLen(target, nums)); + String s= "pwwkew"; + System.out.println(huaDong.lengthOfLongestSubstring(s)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/huadong/huadong2.java b/comxjtu/src/main/java/com/leetcode/otherSet/huadong/huadong2.java new file mode 100644 index 0000000..04e7f02 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/huadong/huadong2.java @@ -0,0 +1,100 @@ +package com.leetcode.otherSet.huadong; + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/13 11:13 + * @description //TODO + */ +public class huadong2 { + + public int minSubArrayLen(int target, int[] nums) { + int n= nums.length; + int left = 0, right = 0; + int sum =0; + int ans = 100001; + while (right=target){ + ans = Math.min(right-left+1, ans); + sum -= nums[left]; + left++; + } +// 增大窗口 + right++; + + } + return ans == 100001 ? 0 : ans; + } + + public int lengthOfLongestSubstring(String s) { + int n = s.length(); + int left = 0, right = 0; + int ans = 0; +// 判断窗口有效性需要的数据结构 + Map map = new HashMap(); + + while (right findAnagrams(String s, String p) { + int n = s.length(); + List ansList = new ArrayList(); + if (n map = new HashMap(); + for (char c : p.toCharArray()) { + map.merge(c, 1, Integer::sum); + } + Map count = new HashMap(); + + int left = 0, right = 0; + while (rightp.length()){ + count.merge(s.charAt(left),-1, Integer::sum); + left++; + } + if (right-left+1==p.length()){ + boolean flag = true; + for (Character character : map.keySet()) { +// 易错: + + if (!map.get(character).equals(count.getOrDefault(character,0))) flag=false; + } + if (flag) ansList.add(left); + } + right++; + } + + return ansList; + } + + public static void main(String[] args) { + huadong2 solver = new huadong2(); + System.out.println(solver.lengthOfLongestSubstring("abba")); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Largest1BorderedSquare.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Largest1BorderedSquare.java new file mode 100644 index 0000000..5e2ecd1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Largest1BorderedSquare.java @@ -0,0 +1,66 @@ +package com.leetcode.otherSet.largestSquares; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月20日 10:45 + * @description //1139. 最大的以 1 为边界的正方形 + */ +public class Largest1BorderedSquare { + public int largest1BorderedSquare(int[][] grid) { + int ans = grid[0][0]; + int rowLength = grid.length, columnLength = grid[0].length; + int[][] row = new int[rowLength][columnLength]; + int[][] column = new int[rowLength][columnLength]; + + int rowValue, columnValue; + row[0][0] = grid[0][0]; + column[0][0] = grid[0][0]; + for (int i = 0; i < rowLength; i++) { + for (int j = 0; j < columnLength; j++) { + if (i==0||j==0){ + if (i==0&&j==0) {} + else{ + if (j==0) { + row[i][j] = grid[i][j]; + if (grid[i][j]==1) { + column[i][j] = column[i-1][j] + 1; + if (ans==0) ans=1; + } + }else { + column[i][j] = grid[i][j]; + if (grid[i][j]==1) { + row[i][j] = row[i][j-1] + 1; + if (ans==0) ans=1; + } + } + } + }else { + if (grid[i][j]==1){ + rowValue = row[i][j-1]+1; + row[i][j] = rowValue; + columnValue = column[i-1][j]+1; + column[i][j] = columnValue; + int value = Math.min(rowValue, columnValue); + for (int k = 1; k <= value; k++) { + if (column[i][j+1-k]>=k && row[i+1-k][j]>=k){ + ans = Math.max(k*k, ans); + } + } + + } + } + } + } + + return ans; + } + + public static void main(String[] args) { + Largest1BorderedSquare solver = new Largest1BorderedSquare(); + int[][] input = new int[][]{{0,1,1,1,1,0},{1,1,0,1,1,0},{1,1,0,1,0,1},{1,1,0,1,1,1},{1,1,0,1,1,1},{1,1,1,1,1,1},{1,0,1,1,1,1},{0,0,1,1,1,1},{1,1,1,1,1,1}}; + int ans; + ans = solver.largest1BorderedSquare(input); + System.out.println(ans); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestIsland.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestIsland.java new file mode 100644 index 0000000..f75ec28 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestIsland.java @@ -0,0 +1,67 @@ +package com.leetcode.otherSet.largestSquares; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月20日 12:28 + * @description //827. 最大人工岛 + */ +public class LargestIsland { + + static int[] d = {0, -1, 0, 1, 0}; + + public int largestIsland(int[][] grid) { + int n = grid.length, res = 0; + int[][] tag = new int[n][n]; + Map area = new HashMap(); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 1 && tag[i][j] == 0) { + int t = i * n + j + 1; + area.put(t, dfs(grid, i, j, tag, t)); + res = Math.max(res, area.get(t)); + } + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 0) { + int z = 1; + Set connected = new HashSet(); + for (int k = 0; k < 4; k++) { + int x = i + d[k], y = j + d[k + 1]; + if (!valid(n, x, y) || tag[x][y] == 0 || connected.contains(tag[x][y])) { + continue; + } + z += area.get(tag[x][y]); + connected.add(tag[x][y]); + } + res = Math.max(res, z); + } + } + } + return res; + } + + public int dfs(int[][] grid, int x, int y, int[][] tag, int t) { + int n = grid.length, res = 1; + tag[x][y] = t; + for (int i = 0; i < 4; i++) { + int x1 = x + d[i], y1 = y + d[i + 1]; + if (valid(n, x1, y1) && grid[x1][y1] == 1 && tag[x1][y1] == 0) { + res += dfs(grid, x1, y1, tag, t); + } + } + return res; + } + + public boolean valid(int n, int x, int y) { + return x>= 0 && x < n && y>= 0 && y < n; + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestRectangleArea.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestRectangleArea.java new file mode 100644 index 0000000..e77f4e7 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/LargestRectangleArea.java @@ -0,0 +1,43 @@ +package com.leetcode.otherSet.largestSquares; + +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:46 + * @description //84. 柱状图中最大的矩形 + * 单调栈 + */ +public class LargestRectangleArea { + public int largestRectangleArea(int[] heights) { + int n = heights.length; + int[] left = new int[n]; + int[] right = new int[n]; + + Deque mono_stack = new ArrayDeque(); + for (int i = 0; i < n; ++i) { + while (!mono_stack.isEmpty() && heights[mono_stack.peek()]>= heights[i]) { + mono_stack.pop(); + } + left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek()); + mono_stack.push(i); + } + + mono_stack.clear(); + for (int i = n - 1; i>= 0; --i) { + while (!mono_stack.isEmpty() && heights[mono_stack.peek()]>= heights[i]) { + mono_stack.pop(); + } + right[i] = (mono_stack.isEmpty() ? n : mono_stack.peek()); + mono_stack.push(i); + } + + int ans = 0; + for (int i = 0; i < n; ++i) { + ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]); + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaxAreaOfIsland.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaxAreaOfIsland.java new file mode 100644 index 0000000..a1a9634 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaxAreaOfIsland.java @@ -0,0 +1,35 @@ +package com.leetcode.otherSet.largestSquares; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:18 + * @description //TODO + */ +public class MaxAreaOfIsland { + + public int maxAreaOfIsland(int[][] grid) { + int ans = 0; + for (int i = 0; i != grid.length; ++i) { + for (int j = 0; j != grid[0].length; ++j) { + ans = Math.max(ans, dfs(grid, i, j)); + } + } + return ans; + } + + public int dfs(int[][] grid, int cur_i, int cur_j) { + if (cur_i < 0 || cur_j < 0 || cur_i == grid.length || cur_j == grid[0].length || grid[cur_i][cur_j] != 1) { + return 0; + } + grid[cur_i][cur_j] = 0; + int[] di = {0, 0, 1, -1}; + int[] dj = {1, -1, 0, 0}; + int ans = 1; + for (int index = 0; index != 4; ++index) { + int next_i = cur_i + di[index], next_j = cur_j + dj[index]; + ans += dfs(grid, next_i, next_j); + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalRectangle.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalRectangle.java new file mode 100644 index 0000000..cf75844 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalRectangle.java @@ -0,0 +1,60 @@ +package com.leetcode.otherSet.largestSquares; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:44 + * @description //85. 最大矩形 + * 单调栈 + */ +public class MaximalRectangle { + public int maximalRectangle(char[][] matrix) { + int m = matrix.length; + if (m == 0) { + return 0; + } + int n = matrix[0].length; + int[][] left = new int[m][n]; + + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (matrix[i][j] == '1') { + left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1; + } + } + } + + int ret = 0; + for (int j = 0; j < n; j++) { // 对于每一列,使用基于柱状图的方法 + int[] up = new int[m]; + int[] down = new int[m]; + + Deque stack = new LinkedList(); + for (int i = 0; i < m; i++) { + while (!stack.isEmpty() && left[stack.peek()][j]>= left[i][j]) { + stack.pop(); + } + up[i] = stack.isEmpty() ? -1 : stack.peek(); + stack.push(i); + } + stack.clear(); + for (int i = m - 1; i>= 0; i--) { + while (!stack.isEmpty() && left[stack.peek()][j]>= left[i][j]) { + stack.pop(); + } + down[i] = stack.isEmpty() ? m : stack.peek(); + stack.push(i); + } + + for (int i = 0; i < m; i++) { + int height = down[i] - up[i] - 1; + int area = height * left[i][j]; + ret = Math.max(ret, area); + } + } + return ret; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalSquare.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalSquare.java new file mode 100644 index 0000000..b35b26b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/MaximalSquare.java @@ -0,0 +1,33 @@ +package com.leetcode.otherSet.largestSquares; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:06 + * @description //221. 最大正方形 + */ +public class MaximalSquare { + + public int maximalSquare(char[][] matrix) { + int maxSide = 0; + if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { + return maxSide; + } + int rows = matrix.length, columns = matrix[0].length; + int[][] dp = new int[rows][columns]; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + if (matrix[i][j] == '1') { + if (i == 0 || j == 0) { + dp[i][j] = 1; + } else { + dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; + } + maxSide = Math.max(maxSide, dp[i][j]); + } + } + } + int maxSquare = maxSide * maxSide; + return maxSquare; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/NumIslands.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/NumIslands.java new file mode 100644 index 0000000..4010aa1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/NumIslands.java @@ -0,0 +1,44 @@ +package com.leetcode.otherSet.largestSquares; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:39 + * @description //200. 岛屿数量 + */ +public class NumIslands { + void dfs(char[][] grid, int r, int c) { + int nr = grid.length; + int nc = grid[0].length; + + if (r < 0 || c < 0 || r>= nr || c>= nc || grid[r][c] == '0') { + return; + } + + grid[r][c] = '0'; + dfs(grid, r - 1, c); + dfs(grid, r + 1, c); + dfs(grid, r, c - 1); + dfs(grid, r, c + 1); + } + + public int numIslands(char[][] grid) { + if (grid == null || grid.length == 0) { + return 0; + } + + int nr = grid.length; + int nc = grid[0].length; + int num_islands = 0; + for (int r = 0; r < nr; ++r) { + for (int c = 0; c < nc; ++c) { + if (grid[r][c] == '1') { + ++num_islands; + dfs(grid, r, c); + } + } + } + + return num_islands; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Trap.java b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Trap.java new file mode 100644 index 0000000..bb1bd41 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/largestSquares/Trap.java @@ -0,0 +1,33 @@ +package com.leetcode.otherSet.largestSquares; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/20 12:48 + * @description //42. 接雨水 + * 单调栈或者双指针 + */ +public class Trap { + public int trap(int[] height) { + int ans = 0; + Deque stack = new LinkedList(); + int n = height.length; + for (int i = 0; i < n; ++i) { + while (!stack.isEmpty() && height[i]> height[stack.peek()]) { + int top = stack.pop(); + if (stack.isEmpty()) { + break; + } + int left = stack.peek(); + int currWidth = i - left - 1; + int currHeight = Math.min(height[left], height[i]) - height[top]; + ans += currWidth * currHeight; + } + stack.push(i); + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/number/Divide.java b/comxjtu/src/main/java/com/leetcode/otherSet/number/Divide.java new file mode 100644 index 0000000..d1f770d --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/number/Divide.java @@ -0,0 +1,88 @@ +package com.leetcode.otherSet.number; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月10日 10:31 + * @description //29. 两数相除: + * 二分查找 + */ +public class Divide { + + public int divide(int dividend, int divisor) { + // 考虑被除数为最小值的情况 + if (dividend == Integer.MIN_VALUE) { + if (divisor == 1) { + return Integer.MIN_VALUE; + } + if (divisor == -1) { + return Integer.MAX_VALUE; + } + } + // 考虑除数为最小值的情况 + if (divisor == Integer.MIN_VALUE) { + return dividend == Integer.MIN_VALUE ? 1 : 0; + } + // 考虑被除数为 0 的情况 + if (dividend == 0) { + return 0; + } + + // 一般情况,使用二分查找 + // 将所有的正数取相反数,这样就只需要考虑一种情况 + boolean rev = false; + if (dividend> 0) { + dividend = -dividend; + rev = !rev; + } + if (divisor> 0) { + divisor = -divisor; + rev = !rev; + } + + int left = 1, right = Integer.MAX_VALUE, ans = 0; + while (left <= right) { + // 注意溢出,并且不能使用除法 + int mid = left + ((right - left)>> 1); + boolean check = quickAdd(divisor, mid, dividend); + if (check) { + ans = mid; + // 注意溢出 + if (mid == Integer.MAX_VALUE) { + break; + } + left = mid + 1; + } else { + right = mid - 1; + } + } + + return rev ? -ans : ans; + } + + // 快速乘 + public boolean quickAdd(int y, int z, int x) { + // x 和 y 是负数,z 是正数 + // 需要判断 z * y>= x 是否成立 + int result = 0, add = y; + while (z != 0) { + if ((z & 1) != 0) { + // 需要保证 result + add>= x + if (result < x - add) { + return false; + } + result += add; + } + if (z != 1) { + // 需要保证 add + add>= x + if (add < x - add) { + return false; + } + add += add; + } + // 不能使用除法 + z>>= 1; + } + return true; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/number/FractionToDecimal.java b/comxjtu/src/main/java/com/leetcode/otherSet/number/FractionToDecimal.java new file mode 100644 index 0000000..5bd46d1 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/number/FractionToDecimal.java @@ -0,0 +1,59 @@ +package com.leetcode.otherSet.number; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月10日 11:40 + * @description //166. 分数到小数 + * 为了解答这个问题,需要了解以下知识点: + * 分数的基本知识,包括分子、分母、约分等。 + * 循环小数的知识,以及如何将循环部分用括号括起来。 + * 哈希表的应用,以及如何用哈希表来判断循环小数。 + */ +public class FractionToDecimal { + + public String fractionToDecimal(int numerator, int denominator) { + long numeratorLong = (long) numerator; + long denominatorLong = (long) denominator; + if (numeratorLong % denominatorLong == 0) { + return String.valueOf(numeratorLong / denominatorLong); + } + + StringBuffer sb = new StringBuffer(); + if (numeratorLong < 0 ^ denominatorLong < 0) { + sb.append('-'); + } + + // 整数部分 + numeratorLong = Math.abs(numeratorLong); + denominatorLong = Math.abs(denominatorLong); + long integerPart = numeratorLong / denominatorLong; + sb.append(integerPart); + sb.append('.'); + + // 小数部分 + StringBuffer fractionPart = new StringBuffer(); + Map remainderIndexMap = new HashMap(); + long remainder = numeratorLong % denominatorLong; + int index = 0; + while (remainder != 0 && !remainderIndexMap.containsKey(remainder)) { + remainderIndexMap.put(remainder, index); + remainder *= 10; + fractionPart.append(remainder / denominatorLong); + remainder %= denominatorLong; + index++; + } + if (remainder != 0) { // 有循环节 + int insertIndex = remainderIndexMap.get(remainder); + fractionPart.insert(insertIndex, '('); + fractionPart.append(')'); + } + sb.append(fractionPart.toString()); + + return sb.toString(); + } + +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/number/GcdofStrings.java b/comxjtu/src/main/java/com/leetcode/otherSet/number/GcdofStrings.java new file mode 100644 index 0000000..af415be --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/number/GcdofStrings.java @@ -0,0 +1,27 @@ +package com.leetcode.otherSet.number; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月10日 12:14 + * @description //1071. 字符串的最大公因子 + */ +public class GcdofStrings { + + public String gcdOfStrings(String str1, String str2) { + if (!str1.concat(str2).equals(str2.concat(str1))) { + return ""; + } + return str1.substring(0, gcd(str1.length(), str2.length())); + } + + public int gcd(int a, int b) { + int remainder = a % b; + while (remainder != 0) { + a = b; + b = remainder; + remainder = a % b; + } + return b; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/number/MyPow.java b/comxjtu/src/main/java/com/leetcode/otherSet/number/MyPow.java new file mode 100644 index 0000000..1c37ff3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/number/MyPow.java @@ -0,0 +1,46 @@ +package com.leetcode.otherSet.number; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月10日 11:19 + * @description //50. Pow(x, n) + */ +public class MyPow { +// 递归实现 + public double myPow(double x, int n) { + long N = n; + return N>= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); + } + + public double quickMul(double x, long N) { + if (N == 0) { + return 1.0; + } + double y = quickMul(x, N / 2); + return N % 2 == 0 ? y * y : y * y * x; + } +// 迭代实现 + public double myPow1(double x, int n) { + long N = n; + return N>= 0 ? quickMul1(x, N) : 1.0 / quickMul1(x, -N); + } + + public double quickMul1(double x, long N) { + double ans = 1.0; + // 贡献的初始值为 x + double x_contribute = x; + // 在对 N 进行二进制拆分的同时计算答案 + while (N> 0) { + if (N % 2 == 1) { + // 如果 N 二进制表示的最低位为 1,那么需要计入贡献 + ans *= x_contribute; + } + // 将贡献不断地平方 + x_contribute *= x_contribute; + // 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可 + N /= 2; + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/number/SmallestRepunitDivByK.java b/comxjtu/src/main/java/com/leetcode/otherSet/number/SmallestRepunitDivByK.java new file mode 100644 index 0000000..377ce59 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/number/SmallestRepunitDivByK.java @@ -0,0 +1,29 @@ +package com.leetcode.otherSet.number; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月10日 9:44 + * @description //1015. 可被 K 整除的最小整数 + + */ +public class SmallestRepunitDivByK { + public int smallestRepunitDivByK(int k) { + int resid = 1 % k, len = 1; // resid为余数,len为数字长度,初始值为1 + Set set = new HashSet(); // 创建一个无序集合,用于存储余数 + set.add(resid); // 插入余数1 + while (resid != 0) { // 当余数为0时退出循环 + resid = (resid * 10 + 1) % k; // 计算下一个余数 + len++; // 数字长度+1 + if (set.contains(resid)) { // 如果余数重复出现,则无解 + return -1; + } + set.add(resid); // 将余数插入集合 + } + return len; // 返回数字长度 + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/pointer2/pointer2.java b/comxjtu/src/main/java/com/leetcode/otherSet/pointer2/pointer2.java new file mode 100644 index 0000000..9f20521 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/pointer2/pointer2.java @@ -0,0 +1,124 @@ +package com.leetcode.otherSet.pointer2; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月29日 16:42 + * @description //双指针专题 + */ +public class pointer2 { + + public boolean isPalindrome(String s) { + int n = s.length(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < n; i++) { + char ch = s.charAt(i); + if (ch>='A' && ch<='z'){ + sb.append((char)( ch+32)); + }else if ((ch>='a' && ch<='z') || (ch>='0' && ch<='9')){ + sb.append(ch); + } + } + String ss = sb.toString(); + n = ss.length(); + for (int i = 0; i < n/2; i++) { + if (ss.charAt(i) != ss.charAt(n-1-i)) return false; + } + + return true; + } + +/* +* 392. 判断子序列 +* 双指针 +* */ + public boolean isSubsequence(String s, String t) { + int n = s.length(), m = t.length(); + int i = 0, j = 0; + while (i < n && j < m) { + if (s.charAt(i) == t.charAt(j)) { + i++; + } + j++; + } + return i == n; + } +/* +* 167. 两数之和 II - 输入有序数组 +* */ + public int[] twoSum(int[] numbers, int target) { + int n= numbers.length; + int l = 0, r = n-1; + int[] ans = new int[2]; + while (ltarget) r--; + else l++; + } + return ans; + } +/* +* 11. 盛最多水的容器 +* 从两边,往中间缩小,哪边低移动哪边,也就是每次都去短板那边看看有没有更优的结果 +* */ +public int maxArea(int[] height) { + int l = 0, r = height.length - 1; + int ans = 0; + while (l < r) { + int area = Math.min(height[l], height[r]) * (r - l); + ans = Math.max(ans, area); + if (height[l] <= height[r]) { + ++l; + } + else { + --r; + } + } + return ans; +} +/* +* 15. 三数之和 +* */ +public static List> threeSum(int[] nums) { + List> ans = new ArrayList(); + int len = nums.length; + if(nums == null || len < 3) return ans; + Arrays.sort(nums); // 排序 + for (int i = 0; i < len ; i++) { + if(nums[i]> 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环 + if(i> 0 && nums[i] == nums[i-1]) continue; // 去重 + int L = i+1; + int R = len-1; + while(L < R){ + int sum = nums[i] + nums[L] + nums[R]; + if(sum == 0){ + ans.add(Arrays.asList(nums[i],nums[L],nums[R])); + while (L 0) R--; + } + } + return ans; +} + public static void main(String[] args) { +// test + pointer2 pointer2 = new pointer2(); +//"A man, a plan, a canal: Panama" + String s = "A man, a plan, a canal: Panama"; +// System.out.println(pointer2.isPalindrome(s)); + int[] num = new int[]{1,1}; + System.out.println(pointer2.maxArea(num)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CarPooling.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CarPooling.java new file mode 100644 index 0000000..d0e47d6 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CarPooling.java @@ -0,0 +1,26 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月21日 17:38 + * @description //1094. 拼车:差分数组。 + */ +public class CarPooling { + + public boolean carPooling(int[][] trips, int capacity) { + int[] diff = new int[1001]; +// diff[i] = capacity[i] - capacity[i-1] + for (int[] trip : trips) { + diff[trip[1]] += trip[0]; +// 这里不是diff[trip[2]+1]计算的原因:[from,to)是左闭右开区间,to位置时乘客已经下车,不占用车的容量 + diff[trip[2]] -= trip[0]; + } + int peopleNow = 0; + for (int i = 0; i < diff.length-1; i++) { + peopleNow += diff[i]; + if (peopleNow>capacity) return false; + } + return true; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CorpFlightBookings.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CorpFlightBookings.java new file mode 100644 index 0000000..2368780 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/CorpFlightBookings.java @@ -0,0 +1,23 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月21日 17:59 + * @description //1109. 航班预订统计 + */ +public class CorpFlightBookings { + public int[] corpFlightBookings(int[][] bookings, int n) { + int[] diff = new int[n+2]; + for (int[] booking : bookings) { + diff[booking[0]] += booking[2]; + diff[booking[1]+1] -= booking[2]; + } + int[] ans = new int[n]; + ans[0] = diff[1]; + for (int i = 1; i < n; i++) { + ans[i] = ans[i-1] + diff[i+1]; + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinMoves.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinMoves.java new file mode 100644 index 0000000..122b0b5 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinMoves.java @@ -0,0 +1,50 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/21 15:23 + * @description //1674. 使数组互补的最少操作次数 + * 差分数组:对于某个区间上的数组值进行增减。diff[i]=a[i]-a[i-1] + * 当对一个区间进行增减某个值的时候,他的差分数组对应的区间左端点的值会同步变化,而他的右端点的后一个值则会相反地变化,其实这个很好理解 + */ +public class MinMoves { + + /** + * + * @Param + * @Description //差分数组: + * 设arr[]为将所有数对和转化成某一个数需要的操作次数,其中arr[i]表示将所有数对和转化成i需要的次数。 + * arr[i]为diff的前缀和。 + * https://blog.csdn.net/qq_36025591/article/details/110311658 + * https://leetcode.cn/problems/minimum-moves-to-make-array-complementary/solution/javaonde-chai-fen-shu-zu-by-liusandao/ + * @Date 15:39 2023/4/21 + * @return + **/ + public int minMoves(int[] nums, int limit) { + int[] diff = new int[limit * 2 + 1]; + for (int i = 0; i < nums.length / 2; i++) { + int max = Math.max(nums[i], nums[nums.length - i - 1]); + int min = Math.min(nums[i], nums[nums.length - i - 1]); + if (min == 1) { + diff[2] += 1; + } else{ + diff[2] += 2; + diff[min + 1] -= 1; + } + diff[max + min] -= 1; + if (max + min + 1 < diff.length) { + diff[max + min + 1] += 1; + } + if (max + limit + 1 < diff.length) { + diff[max + limit + 1] += 1; + } + } + int now = 0, res = nums.length / 2; + for (int i = 2; i < diff.length; i++) { + now += diff[i]; + res = Math.min(res, now); + } + return res; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinOperations.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinOperations.java new file mode 100644 index 0000000..47ca15b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinOperations.java @@ -0,0 +1,56 @@ +package com.leetcode.otherSet.qianzhuihe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/21 15:53 + * @description //2602. 使数组元素全部相等的最少操作次数:前缀和+二分查找. + * 这道题如果场规使用每次循环处理就会超时;因此考虑其实每次都是对原数组的查询,因此尝试是否可以用前缀和。 + */ +public class MinOperations { + public List minOperations(int[] nums, int[] queries) { + Arrays.sort(nums); + int n = nums.length; + long[] sum = new long[n + 1]; // 前缀和 + for (int i = 0; i < n; i++) + sum[i + 1] = sum[i] + nums[i]; + + List ans = new ArrayList(queries.length); + for (int q : queries) { + int j = lowerBound(nums, q); +// int j = Arrays.bi(nums, q); + long left = (long) q * j - sum[j]; // 蓝色面积 + long right = sum[n] - sum[j] - (long) q * (n - j); // 绿色面积 + ans.add(left + right); + } + return ans; + } + + // 见 https://www.bilibili.com/video/BV1AP41137w7/ + private int lowerBound(int[] nums, int target) { + int left = -1, right = nums.length; // 开区间 (left, right) + while (left + 1 < right) { // 区间不为空 + // 循环不变量: + // nums[left] < target + // nums[right]>= target + int mid = left + (right - left) / 2; + if (nums[mid] < target) + left = mid; // 范围缩小到 (mid, right) + else + right = mid; // 范围缩小到 (left, mid) + } + return right; + } + + public static void main(String[] args) { + MinOperations solver = new MinOperations(); + int[] nums = new int[]{2,9,6,3}; + int[] queries = new int[]{10,3}; + System.out.println(solver.minOperations(nums, queries).toString()); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinSubArrayLen.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinSubArrayLen.java new file mode 100644 index 0000000..5cf1c5d --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/MinSubArrayLen.java @@ -0,0 +1,42 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/21 9:35 + * @description //209. 长度最小的子数组 + */ +public class MinSubArrayLen { + + /** + * + * @Param + * @Description //下面这个方法将两种方法杂糅在一起了: + * 1. 前缀和+二分查找; + * 2. 滑动窗口,双指针 + * @Date 10:14 2023/4/21 + * @return + **/ + public int minSubArrayLen(int target, int[] nums) { + int ans = 0; + int[] sum = new int[nums.length+1]; + sum[0] = 0; + for (int i = 0; i < nums.length; i++) { + sum[i+1] = sum[i]+nums[i]; + } +// nums[i] = sum[i+1] - sum[i] + for (int i = 1, j=0; i < nums.length+1; ) { + if (sum[i] - sum[j]>=target){ + if (ans!=0) { + ans = Math.min(ans, i-j); + }else { + ans = i - j; + } + j++; + }else { + i++; + } + } + return ans; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/NumSubarrayProductLessThanK.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/NumSubarrayProductLessThanK.java new file mode 100644 index 0000000..0e82050 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/NumSubarrayProductLessThanK.java @@ -0,0 +1,25 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月21日 11:02 + * @description //713. 乘积小于 K 的子数组 + * 这个问题可以看作是前缀和的变式,前缀积(可以处理为对数)或者滑动窗口 + */ +public class NumSubarrayProductLessThanK { + + public int numSubarrayProductLessThanK(int[] nums, int k) { + int n = nums.length, ret = 0; + int prod = 1, i = 0; + for (int j = 0; j < n; j++) { + prod *= nums[j]; + while (i <= j && prod>= k) { + prod /= nums[i]; + i++; + } + ret += j - i + 1; + } + return ret; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/Qianzhuihe.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/Qianzhuihe.java new file mode 100644 index 0000000..a6892a3 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/Qianzhuihe.java @@ -0,0 +1,14 @@ +package com.leetcode.otherSet.qianzhuihe; + +/** + * @author JS + * @version 1.0 + * @date 2023年5月30日 11:04 + * @description //前缀和 + * for (int i = 1; i <= n; i++) { + * sums[i] = sums[i - 1] + nums[i - 1]; + * } + * sums[i] = nums[0] + nums[1] + ... + nums[i - 1] 代表前i个元素的前缀和,即[0,i-1]的和 + */ +public class Qianzhuihe { +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/ReductionOperations.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/ReductionOperations.java new file mode 100644 index 0000000..f4b7199 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/ReductionOperations.java @@ -0,0 +1,34 @@ +package com.leetcode.otherSet.qianzhuihe; + +import java.util.Arrays; + +/** + * @author JS + * @version 1.0 + * @date 2023/4/21 16:41 + * @description //1887. 使数组元素相等的减少操作次数 + * 这个排序即可。【不是前缀和问题】 + */ +public class ReductionOperations { + + public int reductionOperations(int[] nums) { + int ans = 0; + Arrays.sort(nums); + + if (nums.length<=1) return 0; + for (int i = nums.length-1; i>=0 ;i-- ) { + while (i>=1 && nums[i-1]==nums[i]){ + i--; + } + if (i==0) return ans; + ans += nums.length-1 - (i-1); + } + return ans; + } + + public static void main(String[] args) { + ReductionOperations solver = new ReductionOperations(); + int[] nums = new int[]{1, 1, 1}; + System.out.println(solver.reductionOperations(nums)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/SubArraySum.java b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/SubArraySum.java new file mode 100644 index 0000000..17f955d --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/otherSet/qianzhuihe/SubArraySum.java @@ -0,0 +1,34 @@ +package com.leetcode.otherSet.qianzhuihe; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author JS + * @version 1.0 + * @date 2023年4月21日 10:46 + * @description //560. 和为 K 的子数组 + */ +public class SubArraySum { + + +/** + * + * @Param + * @Description //hashmap+前缀和 + * @Date 10:51 2023年4月21日 + * @return + **/ public int subarraySum(int[] nums, int k) { + int count = 0, pre = 0; + Map mp = new HashMap(); + mp.put(0, 1); + for (int i = 0; i < nums.length; i++) { + pre += nums[i]; + if (mp.containsKey(pre - k)) { + count += mp.get(pre - k); + } + mp.put(pre, mp.getOrDefault(pre, 0) + 1); + } + return count; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/primary/Arrayss.java b/comxjtu/src/main/java/com/leetcode/primary/Arrayss.java new file mode 100644 index 0000000..2ac7559 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/primary/Arrayss.java @@ -0,0 +1,108 @@ +package com.leetcode.primary; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author JS + * @version 1.0 + * @date 2022/4/30 10:40 + * @description //力扣-初级算法-数组专题 + */ +public class Arrayss { + + /** + * + * @Description //买卖股票的最佳时机 II, + * 思路:可以多次买卖。只要遇到低价就买,买之前就抛出. + * @Date 10:42 2022/4/30 + * @return + **/ + public int maxProfit(int[] prices) { + if (prices == null || prices.length < 2) return 0; + int min = Integer.MIN_VALUE, profit = 0; + for (int i = 1; i < prices.length; i++) { + if (prices[i]> prices[i-1]) profit += prices[i] - prices[i-1]; + } + return profit; + } + + /** + * + * @Description //给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 + 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 + 你可以按任意顺序返回答案。 + 思路:其实就是确定一个数之后的查找问题。先排序,然后选定一个数,再二分查找.[排序方法是错误的,因为会改变下标] + 方法二:用hashMAp + * @Date 11:01 2022年4月30日 + * @return + **/ +/* public int[] twoSum(int[] nums, int target) { + if (nums == null || nums.length <2) return null; + Arrays.sort(nums); + for (int i = 0; i < nums.length; i++) { + int fix = nums[i]; + int other = binarySearch(nums, target - fix, i+1, nums.length-1); + if (other!= -1) return new int[]{i,other}; + } + return null; + }*/ + public int[] twoSum(int[] nums, int target) { + Map m = new HashMap(); + for (int i = 0; i < nums.length; i++) { + if (m.get(target - nums[i]) != null) { + return new int[]{m.get(target - nums[i]), i}; + } + m.put(nums[i], i); + } + return new int[]{0, 0}; + } + + private int binarySearch(int[] nums, int val, int lo, int hi) { + + while (lo <= hi){ + int mid = (hi-lo)/2 +lo; + if (nums[mid] == val) return mid; + if (nums[mid] < val) lo = mid+1; + else hi = mid-1; + } + + return -1; + } + + /** + * + * @Description //请你判断一个初始的 9 x 9 的数独是否有效。 + * 方法一:用三个独立的for循环来做,分别判断行、列、宫格,每个循环里只需要一个map空间。 + * 方法二:一个独立的for循环,空间变大了,需要19个map。map可以改造成位运算的数组 + * @Date 11:50 2022/4/30 + * @return + **/ + public boolean isValidSudoku(char[][] board) { + int[] line = new int[9]; + int[] column = new int[9]; + int[] cell = new int[9]; + int shift = 0; + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + //如果还没有填数字,直接跳过 + if (board[i][j] == '.') + continue; + //由行、列得到宫格编号 + int k = (i / 3) * 3 + j / 3; + + //board[i][j] - '0'表示字符表示的数字N,将1左移N位,即将第N位置1,也就是当前列(行、宫格)有了。 + shift = 1 << (board[i][j] - '0'); + + //如果对应的位置只要有一个大于0,说明有冲突,直接返回false + if ((column[i] & shift)> 0 || (line[j] & shift)> 0 || (cell[k] & shift)> 0) + return false; + column[i] |= shift; + line[j] |= shift; + cell[k] |= shift; + } + } + return true; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/primary/DP.java b/comxjtu/src/main/java/com/leetcode/primary/DP.java index 9105d8a..09253af 100644 --- a/comxjtu/src/main/java/com/leetcode/primary/DP.java +++ b/comxjtu/src/main/java/com/leetcode/primary/DP.java @@ -1,5 +1,7 @@ package com.leetcode.primary; +import java.util.Arrays; + /** * @Author: Jay * @Date: Created in 10:43 2018年5月31日 @@ -57,6 +59,16 @@ public int maxProfit(int[] prices) { return profit; } + public int maxProfit2(int[] prices) { + int max = 0; + int[] dp = new int[prices.length]; + for (int i = 1; i < prices.length; i++) { + dp[i] = Math.max(prices[i]-prices[i-1]+dp[i-1],dp[i]); + if (dp[i]>max) max = dp[i]; + } + return max; + } + /** * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 * 从上到下分别是O(N3),O(N2),分治法O(NlogN),和递归 @@ -178,71 +190,60 @@ else if(b>a && b>c) * @return */ public int maxSubArray3(int[] nums) { - if (nums==null || nums.length==0) return 0; - if (nums.length==1) return nums[0]; - int len = nums.length; - int maxSum = Integer.MIN_VALUE; - int cnt = 0; - for (int i = 0; i < len; i++) { - if (nums[i]>maxSum) maxSum=nums[i]; - if (nums[i]<0) cnt++; - else break; - } - if (cnt==len) return maxSum; - int sum = 0; - for (int i = 0; i < len; i++) { - sum += nums[i]; - if (sum>maxSum) - maxSum = sum; - else if (sum<0) - sum =0; + if (nums.length<2) return nums[0]; + int max = nums[0], dp = nums[0]; + for (int i = 1; i < nums.length; i++) { + dp = dp>0 ? dp+nums[i] : nums[i]; + if (dp>max) max=dp; } - return maxSum; + return max; } /** * 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 + 两种方法: + 递归 + 迭代 * @param nums * @return */ public int rob(int[] nums) { if (nums==null||nums.length==0) return 0; if (nums.length==1) return nums[0]; - int len = nums.length; - return maxRob(nums,len-1); + int[] dp = new int[nums.length]; + Arrays.fill(dp,-1); + return maxRob(nums,nums.length-1, dp); } - private int maxRob(int[] nums, int n){ + private int maxRob(int[] nums, int n, int[] dp){ if (n==0) return nums[0]; if (n==1) return nums[1]>nums[0]?nums[1]:nums[0]; - int r1 = maxRob(nums,n-1); - int r2 = maxRob(nums,n-2)+nums[n]; - return r1>r2?r1:r2; + if (dp[n-1]==-1) dp[n-1] = maxRob(nums,n-1, dp); + if (dp[n-2]==-1) dp[n-2] = maxRob(nums,n-2, dp); + int choose = dp[n-2]+nums[n]; + return dp[n-1]>choose?dp[n-1]:choose; } public int rob2(int[] nums) { - if (nums==null||nums.length==0) return 0; - if (nums.length==1) return nums[0]; - int len = nums.length; - int dp1 = nums[0]; - int dp2 = nums[1]>nums[0]?nums[1]:nums[0]; - if (len==2) return dp2; - for (int i = 2; i < len; i++) { - if (dp1+nums[i]>dp2){ - int tmp = dp2; - dp2 = dp1+nums[i]; - dp1 = tmp; - }else { - - } + if (nums.length<2) return nums[0]; + int dp0, dp1,dp2; + //或者直接使用dp数组也行,这里节省空间。 + dp0 = nums[0]; + dp1 = nums[1]>nums[0] ? nums[1] : nums[0]; + dp2 = dp1; + for (int i = 2; i < nums.length; i++) { + dp2 = Math.max(nums[i]+dp0, dp1); + dp0 = dp1; + dp1 = dp2; } - return dp1>dp2?dp1:dp2; + return dp2; } public static void main(String[] args){ DP dp = new DP(); - System.out.println(dp.climbStairs(80)); - int ans = dp.maxSubArray2(new int[]{-1,-6,-9,4,-8,5,-4,2,-1,1,-8,0,1,3,1}); - System.out.println(dp.maxSubArray2(new int[]{-1,-6,-9,4,-8,5,-4,2,-1,1,-8,0,1,3,1}));; - int a = dp.rob2(new int[]{1,2,3,1}); +// System.out.println(dp.climbStairs(80)); +// int ans = dp.maxSubArray2(new int[]{-1,-6,-9,4,-8,5,-4,2,-1,1,-8,0,1,3,1}); +// System.out.println(dp.maxSubArray2(new int[]{-1,-6,-9,4,-8,5,-4,2,-1,1,-8,0,1,3,1}));; + int a = dp.rob(new int[]{2,7,9,3,1}); + System.out.println(a); } } diff --git a/comxjtu/src/main/java/com/leetcode/tmp/test.java b/comxjtu/src/main/java/com/leetcode/tmp/test.java new file mode 100644 index 0000000..5dc11b6 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/tmp/test.java @@ -0,0 +1,129 @@ +package com.leetcode.tmp; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2022年5月7日 16:46 + * @description //TODO + */ +public class test { + + public void moveZeroes(int[] nums) { + int count = 0; + for (int i = 0; i < nums.length; i++) { + if (nums[i]==0){ + count++; + }else { + nums[i-count] = nums[i]; + } + } + for (int i = nums.length-count; i < nums.length; i++) { + nums[i]=0; + } + } + + public List> generate(int numRows) { + List> result = new LinkedList(); + recursion(result, numRows); + return result; + } + + private List recursion(List> result, int numRows) { + if (numRows==2){ + List list1 = new LinkedList(); + list1.add(1); + result.add(list1); + List list2 = new LinkedList(list1); + list2.add(1); + result.add(list2); + return list2; + } + if (numRows==1){ + List list1 = new LinkedList(); + list1.add(1); + result.add(list1); + return list1; + } + + List pre = recursion(result, numRows-1); + List list = new LinkedList(); + list.add(1); + for (int j = 0; j < pre.size()-1; j++) { + list.add(pre.get(j)+pre.get(j+1)); + } + list.add(1); + result.add(list); + return list; + + } + + + public List> generate2(int numRows) { + List> result = new LinkedList(); + List list1 = new LinkedList(); + list1.add(1); + result.add(list1); + if (numRows<2) return result; + List list2 = new LinkedList(list1); + list2.add(1); + result.add(list2); + List pre = list2; + for (int i = 3; i <= numRows; i++) { + List list = new LinkedList(); + list.add(1); + for (int j = 0; j < pre.size()-1; j++) { + list.add(pre.get(j)+pre.get(j+1)); + } + list.add(1); + result.add(list); + pre = list; + } + return result; + } + + public List getRow(int rowIndex) { + List list = new LinkedList(); + list.add(1); + if (rowIndex+1==1) return list; + list.add(1); + if (rowIndex+1==2) return list; + List pre = list; + for (int i = 3; i <= rowIndex+1; i++) { + List now = new LinkedList(); + now.add(1); + for (int j = 0; j < pre.size()-1; j++) { + now.add(pre.get(j)+pre.get(j+1)); + } + now.add(1); + pre = now; + } + return pre; + + } + + public String reverseWords(String s) { + String[] strings = s.split(" "); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < strings.length; i++) { + char[] chars = strings[i].toCharArray(); + for (int j = 0; j < chars.length/2; j++) { + char tmp = chars[chars.length-1-j]; + chars[chars.length-1-j] = chars[j]; + chars[j] = tmp; + } + sb.append(String.valueOf(chars)); + if (iprices[i-1]){ + ans += prices[i]-prices[i-1]; + } + } + return ans; + } +// 55.跳跃游戏:典型的贪心算法 +// 下面的实现是BFS,时间太长了。。 +// 还可以使用动态规划来做。dp[i]:从[0,i]的任意一点处出发,你最大可以跳跃到的位置。递推公式dp[i]=max(dp[i−1],nums[i]+i)。 +// https://leetcode.cn/problems/jump-game/solution/dong-tai-gui-hua-jie-fa-dpi-maxdpi-1-num-94bw/ + public boolean canJump(int[] nums) { + int n = nums.length; + int[] dp = new int[n]; + Arrays.fill(dp,0); + dp[0]=1; + for (int i = 0; i < n; i++) { + if (dp[i]==1){ + for (int j = nums[i]; j>=0; j--) { + if (i+j=0; j--) { + + if (i+j ratings[i - 1]) left[i] = left[i - 1] + 1; + int count = left[ratings.length - 1]; + for(int i = ratings.length - 2; i>= 0; i--) { + if(ratings[i]> ratings[i + 1]) right[i] = right[i + 1] + 1; + count += Math.max(left[i], right[i]); + } + return count; + } + + /*274. H 指数 + 计数排序或者直接排序 + * */ + public int hIndex(int[] citations) { + Arrays.sort(citations); + int h = 0, i = citations.length - 1; + while (i>= 0 && citations[i]> h) { + h++; + i--; + } + return h; + } + + public double[] sampleStats(int[] count) { + double[] ans = new double[5]; + int cntSum = 0; + double cntMax = 0.0; + long sum = 0; + ans[0] = Integer.MAX_VALUE; + + for (int i = 0; i < 256; i++) { + if (count[i]!=0){ + ans[0] = Math.min(ans[0], i); + ans[1] = Math.max(ans[1], i); + ans[2] += (double) i*count[i]; + sum += (long)i*count[i]; + cntSum += count[i]; + if (count[i]>cntMax) { + ans[4] = i; + cntMax = count[i]; + } + } + + } + int left = (cntSum + 1) / 2; + int right = (cntSum + 2) / 2; + int cnt=0; + for (int i = 0; i < 256; i++) { + if (cnt < right && cnt + count[i]>= right) { + ans[3] += i; + } + if (cnt < left && cnt + count[i]>= left) { + ans[3] += i; + } + cnt += count[i]; + } + ans[2] = ans[2]/cntSum; + ans[2] = (double)sum/cntSum; + ans[3] = ans[3]/2.0; + return ans; + } + + + /** + * + * @Param + * @Description //除自身以外数组的乘积:左右乘积列表,前缀和后缀 + * @Date 11:34 2023年5月27日 + * @return + **/ + public int[] productExceptSelf(int[] nums) { + int length = nums.length; + + // L 和 R 分别表示左右两侧的乘积列表 + int[] L = new int[length]; + int[] R = new int[length]; + + int[] answer = new int[length]; + + // L[i] 为索引 i 左侧所有元素的乘积 + // 对于索引为 '0' 的元素,因为左侧没有元素,所以 L[0] = 1 + L[0] = 1; + for (int i = 1; i < length; i++) { + L[i] = nums[i - 1] * L[i - 1]; + } + + // R[i] 为索引 i 右侧所有元素的乘积 + // 对于索引为 'length-1' 的元素,因为右侧没有元素,所以 R[length-1] = 1 + R[length - 1] = 1; + for (int i = length - 2; i>= 0; i--) { + R[i] = nums[i + 1] * R[i + 1]; + } + + // 对于索引 i,除 nums[i] 之外其余各元素的乘积就是左侧所有元素的乘积乘以右侧所有元素的乘积 + for (int i = 0; i < length; i++) { + answer[i] = L[i] * R[i]; + } + + return answer; + } + +// 134. 加油站 + public int canCompleteCircuit(int[] gas, int[] cost) { + int n = gas.length; + int i = 0; + while (i < n) { + int sumOfGas = 0, sumOfCost = 0; + int cnt = 0; + while (cnt < n) { + int j = (i + cnt) % n; + sumOfGas += gas[j]; + sumOfCost += cost[j]; + if (sumOfCost> sumOfGas) { + break; + } + cnt++; + } + if (cnt == n) { + return i; + } else { + i = i + cnt + 1; + } + } + return -1; + } + + public static void main(String[] args) { + ArrayProblem solver = new ArrayProblem(); + System.out.println("long:"+Long.MAX_VALUE); + + System.out.println("float:"+Float.MAX_VALUE); + + System.out.println("double:"+Double.MAX_VALUE); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/DivideandConquer.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/DivideandConquer.java new file mode 100644 index 0000000..27cc46b --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/DivideandConquer.java @@ -0,0 +1,136 @@ +package com.leetcode.topinterview150.array; + +import com.leetcode.util.ListNode; +import com.leetcode.util.TreeNode; + +/** + * @author JS + * @version 1.0 + * @date 2023年6月11日 9:03 + * @description //分治法 + */ +public class DivideandConquer { + + /* + * 108. 将有序数组转换为二叉搜索树 + * 基本的深度搜索,即递归 + * */ + public TreeNode sortedArrayToBST(int[] nums) { + int n = nums.length; + TreeNode root = divide(nums, 0, n-1); + return root; + + } + + private TreeNode divide(int[] nums, int left, int right) { + if (left>right) return null; + + int mid = left + (right-left)/2; + TreeNode root = new TreeNode(nums[mid]); + TreeNode leftNode = divide(nums, left, mid-1); + TreeNode rightNode = divide(nums, mid+1,right); + root.left = leftNode; + root.right = rightNode; + + return root; + } + + /* + * 148. 排序链表 + * 对链表的排序可以用归并排序:分治法。 + * 难点在于确定链表的中点(快慢指针)、对两个链表进行合并(可以有两种思路:递归或迭代) + * */ + public ListNode sortList(ListNode head) { + return sortList(head, null); + } + + public ListNode sortList(ListNode head, ListNode tail) { + if (head == null) { + return head; + } + if (head.next == tail) { + head.next = null; + return head; + } + ListNode slow = head, fast = head; + while (fast != tail) { + slow = slow.next; + fast = fast.next; + if (fast != tail) { + fast = fast.next; + } + } + ListNode mid = slow; + ListNode list1 = sortList(head, mid); + ListNode list2 = sortList(mid, tail); + ListNode sorted = merge(list1, list2); + return sorted; + } + + public ListNode merge(ListNode head1, ListNode head2) { + ListNode dummyHead = new ListNode(0); + ListNode temp = dummyHead, temp1 = head1, temp2 = head2; + while (temp1 != null && temp2 != null) { + if (temp1.val <= temp2.val) { + temp.next = temp1; + temp1 = temp1.next; + } else { + temp.next = temp2; + temp2 = temp2.next; + } + temp = temp.next; + } + if (temp1 != null) { + temp.next = temp1; + } else if (temp2 != null) { + temp.next = temp2; + } + return dummyHead.next; + } + + /* + * 23. 合并 K 个升序链表 + * 分治法 + * */ + public ListNode mergeKLists(ListNode[] lists) { + return merge(lists, 0, lists.length - 1); + } + + public ListNode merge(ListNode[] lists, int l, int r) { + if (l == r) { + return lists[l]; + } + if (l> r) { + return null; + } + int mid = (l + r)>> 1; + return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r)); + } + + public ListNode mergeTwoLists(ListNode a, ListNode b) { + if (a == null || b == null) { + return a != null ? a : b; + } + ListNode head = new ListNode(0); + ListNode tail = head, aPtr = a, bPtr = b; + while (aPtr != null && bPtr != null) { + if (aPtr.val < bPtr.val) { + tail.next = aPtr; + aPtr = aPtr.next; + } else { + tail.next = bPtr; + bPtr = bPtr.next; + } + tail = tail.next; + } + tail.next = (aPtr != null ? aPtr : bPtr); + return head.next; + } + + + public static void main(String[] args) { + DivideandConquer solver = new DivideandConquer(); + TreeNode ans = solver.sortedArrayToBST(new int[]{-10,-3,0,5,9}); + System.out.println("end"); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/HashProblem.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/HashProblem.java new file mode 100644 index 0000000..2dbf7f5 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/HashProblem.java @@ -0,0 +1,186 @@ +package com.leetcode.topinterview150.array; + +import java.util.*; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/10 9:41 + * @description //哈希表相关问题 + */ +public class HashProblem { + + /* + * 383. 赎金信 + * 实际就是magazine包含ransomNote的关系 + * */ + public boolean canConstruct(String ransomNote, String magazine) { + int[] count = new int[26]; + for (int i = 0; i < magazine.length(); i++) { + char ch = magazine.charAt(i); + count[ch-'a']++; + } + for (int i = 0; i < ransomNote.length(); i++) { + char ch = ransomNote.charAt(i); + if (--count[ch-'a']<0) return false; + } + return true; + } +/* +* 205. 同构字符串 +* 相同的模式即可,即ABA这种 +* */ + public boolean isIsomorphic(String s, String t) { + int n = s.length(); +// 0-255 + int index = 0; + Map mapS = new HashMap(), mapT = new HashMap(); + for (int i = 0; i < n; i++) { + if (mapS.containsKey(s.charAt(i)) && mapT.containsKey(t.charAt(i))){ + if (mapS.get(s.charAt(i)) != mapT.get(t.charAt(i))){ + return false; + } + }else if (!mapS.containsKey(s.charAt(i)) && !mapT.containsKey(t.charAt(i))){ + mapS.put(s.charAt(i), index); + mapT.put(t.charAt(i), index); + index++; + }else return false; + } + return true; + } +/* +* 290. 单词规律 +* 同上 +* */ + public boolean wordPattern(String pattern, String s) { + String[] strings = s.split(" "); + int n = pattern.length(); + if (n!=strings.length) return false; + Map p2s = new HashMap(); + HashMap s2p = new HashMap(); + for (int i = 0; i < n; i++) { + Character ch = pattern.charAt(i); + String s1 = strings[i]; + if ((p2s.containsKey(ch) && !p2s.get(ch).equals(s1)) + || (s2p.containsKey(s1) && s2p.get(s1)!=ch)) + return false; + p2s.put(ch, s1); + s2p.put(s1,ch); + } + return true; + } + + /* + * 242. 有效的字母异位词 + * 统计两个字符串中字符的种类和次数 + * */ + public boolean isAnagram(String s, String t) { + int n = s.length(); + if (n!=t.length()) return false; + int[] count = new int[26]; + for (char c : s.toCharArray()) { + count[c-'a']++; + } + for (char c : t.toCharArray()) { + count[c-'a']--; + } + /* 如果两者种类相同且数量相同的话,应该是全0数组 */ + if (Arrays.stream(count).filter(a -> a==0).count()==26) + return true; + else return false; + } + /* + * 49. 字母异位词分组 + * 方法一:排序相同即可 + * */ + public List> groupAnagrams(String[] strs) { + Map> map = new HashMap>(); + for (String str : strs) { + char[] array = str.toCharArray(); + Arrays.sort(array); + String key = new String(array); + List list = map.getOrDefault(key, new ArrayList()); + list.add(str); + map.put(key, list); + } + return new ArrayList>(map.values()); + } + /* + * 202. 快乐数 + * 将每一步结果存下来,看是否重复循环 + * */ + public boolean isHappy(int n) { + Set set= new HashSet(); + while (n!=1){ + if (set.contains(n)) return false; + else set.add(n); +// 拆解并计算各位数之和 + n = getSqureSum(n); + } + return true; + } + + private int getSqureSum(int n) { + int totalSum = 0; + while (n> 0) { + int d = n % 10; + n = n / 10; + totalSum += d * d; + } + return totalSum; + } + + /* + * 219. 存在重复元素 II + * 这个滑动窗口写的不太好 + * */ + public boolean containsNearbyDuplicate(int[] nums, int k) { + int n = nums.length; + Set set = new HashSet(); + int left = 0, right = 0; + while (right set = new HashSet(); + for (int num : nums) { + set.add(num); + } + + for (int num : nums) { + if (!set.contains(num-1)){ + int count = 0; + while (set.contains(num++)){ + count++; + } + ans = Math.max(ans, count); + } + } + return ans; + } + + public static void main(String[] args) { + HashProblem hashProblem = new HashProblem(); + System.out.println(hashProblem.wordPattern("abba", "dog cat cat dog")); + System.out.println(hashProblem.groupAnagrams(new String[]{"eat","tea","tan","ate","nat","bat"})); + System.out.println(Integer.MAX_VALUE); + int a = 1999999999; + System.out.println(hashProblem.isHappy(a)); + System.out.println(hashProblem.containsNearbyDuplicate(new int[]{1,2,3,1,2,3}, 2)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/Heap.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Heap.java new file mode 100644 index 0000000..1420bbe --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Heap.java @@ -0,0 +1,67 @@ +package com.leetcode.topinterview150.array; + +import java.util.Arrays; +import java.util.PriorityQueue; + +/** + * @author JS + * @version 1.0 + * @date 2023年6月9日 16:47 + * @description //堆的应用 + */ +public class Heap { + /* + * 215. 数组中的第K个最大元素 + * 要求的是第k大,即构建的堆需要最大的前k个,返回的值为堆顶------> 构建最小堆minHeap + * */ + public int findKthLargest(int[] nums, int k) { + PriorityQueue minHeap = new PriorityQueue(k,(a,b)->a-b); + for (int i = 0; i < k; i++) { + minHeap.offer(nums[i]); + } + for (int i = k; i < nums.length; i++) { + if (nums[i]>minHeap.peek()){ + minHeap.poll(); + minHeap.offer(nums[i]); + } + } + + return minHeap.peek(); + } + + /* + * 502. IPO + * */ + public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) { + int n = profits.length; + int curr = 0; + int[][] arr = new int[n][2]; + + for (int i = 0; i < n; ++i) { + arr[i][0] = capital[i]; + arr[i][1] = profits[i]; + } + Arrays.sort(arr, (a, b) -> a[0] - b[0]); + + PriorityQueue pq = new PriorityQueue((x, y) -> y - x); + for (int i = 0; i < k; ++i) { + while (curr < n && arr[curr][0] <= w) { + pq.add(arr[curr][1]); + curr++; + } + if (!pq.isEmpty()) { + w += pq.poll(); + } else { + break; + } + } + + return w; + } + + public static void main(String[] args) { + + } + + +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/Maths.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Maths.java new file mode 100644 index 0000000..7388158 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Maths.java @@ -0,0 +1,173 @@ +package com.leetcode.topinterview150.array; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/9 10:36 + * @description //数学专题 + * https://leetcode.cn/studyplan/top-interview-150/ + */ +public class Maths { +/* +* 9. 回文数 +* 最基础的是转换为字符串,双指针判断; +* 也可以对数字逐次判断头尾。然后再将数字掐头去尾更新,直至结束。 +* */ + public boolean isPalindrome(int x) { + if (x<0) return false; + if (x<10) return true; + + int base = 10; + int baseMax = 1000000000; + while (x/base !=0){ + if (base==baseMax) break; + base *= 10; + } + if (base!=baseMax) base /= 10; + + while (x!=0){ + if (base==1) return true; + if (x/base != x%10) return false; + x = (x - x/base * base -x%10)/10; + base /= 100; + } + return true; + } + +/* +* 66. 加一 +* 需要注意的是最后一位为9时,需要逐个往前进1,最严重时还会在前面增加1位。 +* */ + public int[] plusOne(int[] digits) { + int n = digits.length; + int acc = 0; + if (digits[n-1]==9){ + digits[n-1]=0; + acc = 1; + }else digits[n-1]+=1; + for (int i = n-2; i> -1; i--) { + digits[i] += acc; + if (digits[i]>9){ + digits[i] %= 10; + acc =1; + }else acc = 0; + } + if (acc==0) return digits; + else { + int[] ans = new int[n+1]; + Arrays.fill(ans, 0); + ans[0] = 1; + return ans; + } + } +/* +* 172. 阶乘后的零 +* 看阶乘式子中有几个5的倍数即可;因为每一个5的范围内都会有一个偶数与其相乘得到10; +* */ + public int trailingZeroes(int n) { + int ans = 0; + int a = 5; + while (a<=n){ + ans += n/a; + a *= 5; + } + return ans; + } + + /* + * 69. x 的平方根 + * */ + public int mySqrt(int x) { + if (x<2) return x; + int ans = 0; + int l = 0, r=x/2; + while (l<=r){ + int mid = l + (r-l)/2; + + if ((long)mid*mid==x) return mid; + else if ((long)mid*mid>x){ + r=mid-1; + } + else { + l = mid+1; + } + } +// mid可能是答案 + return l-1; + } + + + /* + * 50. Pow(x, n) 快速幂 + * 分治法 + * */ + public double myPow(double x, int n) { + long N = n; + return N>= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); + } + + public double quickMul(double x, long N) { + if (N == 0) { + return 1.0; + } + double y = quickMul(x, N / 2); + return N % 2 == 0 ? y * y : y * y * x; + } + /* + * 149. 直线上最多的点数 + * */ + public int maxPoints(int[][] points) { + int n = points.length; + if (n <= 2) { + return n; + } + int ret = 0; + for (int i = 0; i < n; i++) { +// 当我们找到一条直线经过了图中超过半数的点时,我们即可以确定该直线即为经过最多点的直线; +//当我们枚举到点i(假设编号从0开始)时,我们至多只能找到n−i 个点共线。假设此前找到的共线的点的数量的最大值为k,如果有k≥n−i,那么此时我们即可停止枚举,因为不可能再找到更大的答案了。 + if (ret>= n - i || ret> n / 2) { + break; + } + Map map = new HashMap(); + for (int j = i + 1; j < n; j++) { + int x = points[i][0] - points[j][0]; + int y = points[i][1] - points[j][1]; + if (x == 0) { + y = 1; + } else if (y == 0) { + x = 1; + } else { + if (y < 0) { + x = -x; + y = -y; + } + int gcdXY = gcd(Math.abs(x), Math.abs(y)); + x /= gcdXY; + y /= gcdXY; + } + int key = y + x * 20001; + map.put(key, map.getOrDefault(key, 0) + 1); + } + int maxn = 0; + for (Map.Entry entry: map.entrySet()) { + int num = entry.getValue(); + maxn = Math.max(maxn, num + 1); + } + ret = Math.max(ret, maxn); + } + return ret; + } + + public int gcd(int a, int b) { + return b != 0 ? gcd(b, a % b) : a; + } + + public static void main(String[] args) { + Maths m = new Maths(); + System.out.println(m.isPalindrome(1000000001)); + } +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/Qujian.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Qujian.java new file mode 100644 index 0000000..943957e --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Qujian.java @@ -0,0 +1,134 @@ +package com.leetcode.topinterview150.array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author JS + * @version 1.0 + * @date 2023年6月10日 19:13 + * @description //区间问题 + * 一般用双指针 + */ +public class Qujian { + + /* + * 228. 汇总区间 + * 已知有序,求连续的区间。 + * */ + public List summaryRanges(int[] nums) { + List ret = new ArrayList(); + int i = 0; + int n = nums.length; + while (i < n) { + int low = i; + i++; + while (i < n && nums[i] == nums[i - 1] + 1) { + i++; + } + int high = i - 1; + StringBuffer temp = new StringBuffer(Integer.toString(nums[low])); + if (low < high) { + temp.append("->"); + temp.append(Integer.toString(nums[high])); + } + ret.add(temp.toString()); + } + return ret; + } + /* + * 56. 合并区间 + * */ + public int[][] merge(int[][] intervals) { + List ansList = new ArrayList(); + Arrays.sort(intervals,(a,b) -> a[0]-b[0]); + for (int i = 0; i < intervals.length;) { + int left = i; + int maxRight = intervals[i][1]; + i++; + while (i ansList = new ArrayList(); + for (int[] interval : intervals) { + if (interval[0]> right) { + // 在插入区间的右侧且无交集 + if (!placed) { + ansList.add(new int[]{left, right}); + placed = true; + } + ansList.add(interval); + } else if (interval[1] < left) { + // 在插入区间的左侧且无交集 + ansList.add(interval); + } else { + // 与插入区间有交集,计算它们的并集 + left = Math.min(left, interval[0]); + right = Math.max(right, interval[1]); + } + } + if (!placed) { + ansList.add(new int[]{left, right}); + } + int[][] ans = new int[ansList.size()][2]; + for (int i = 0; i < ansList.size(); ++i) { + ans[i] = ansList.get(i); + } + return ans; + } + /* + * 452. 用最少数量的箭引爆气球 + * 同样,对能合并的区间进行合并,得到交集,如果交集只剩一个点(即left=right),则不能再合并 + * */ + public int findMinArrowShots(int[][] points) { +// 如果写为Arrays.sort(points, (a, b)-> a[0]-b[0])时[[-2147483646,-2147483645],[2147483646,2147483647]]会出错 + Arrays.sort(points, (a, b)-> a[0] a[0]-b[0]); + for (int[] interval : intervals) { + System.out.println(Arrays.toString(interval)); + } + Qujian qujian = new Qujian(); + int[][] ans = qujian.merge(intervals); + for (int[] an : ans) { + System.out.println(Arrays.toString(an)); + } + System.out.println("----------"); + System.out.println(qujian.findMinArrowShots(new int[][]{{-2147483646,-2147483645},{2147483646,2147483647}})); + + } +} + diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/Tire.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Tire.java new file mode 100644 index 0000000..7093995 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/Tire.java @@ -0,0 +1,52 @@ +package com.leetcode.topinterview150.array; + +/** + * @author JS + * @version 1.0 + * @date 2023年6月10日 21:31 + * @description //前缀树 + */ +class Trie { + private Trie[] children; + private boolean isEnd; + + public Trie() { + children = new Trie[26]; + isEnd = false; + } + + public void insert(String word) { + Trie node = this; + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + int index = ch - 'a'; + if (node.children[index] == null) { + node.children[index] = new Trie(); + } + node = node.children[index]; + } + node.isEnd = true; + } + + public boolean search(String word) { + Trie node = searchPrefix(word); + return node != null && node.isEnd; + } + + public boolean startsWith(String prefix) { + return searchPrefix(prefix) != null; + } + + private Trie searchPrefix(String prefix) { + Trie node = this; + for (int i = 0; i < prefix.length(); i++) { + char ch = prefix.charAt(i); + int index = ch - 'a'; + if (node.children[index] == null) { + return null; + } + node = node.children[index]; + } + return node; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/topinterview150/array/weiyunsuan.java b/comxjtu/src/main/java/com/leetcode/topinterview150/array/weiyunsuan.java new file mode 100644 index 0000000..b2f12fe --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/topinterview150/array/weiyunsuan.java @@ -0,0 +1,96 @@ +package com.leetcode.topinterview150.array; + +/** + * @author JS + * @version 1.0 + * @date 2023/6/9 15:12 + * @description //位运算 + */ +public class weiyunsuan { + + /* + * 67. 二进制求和 + * */ + public String addBinary(String a, String b) { + StringBuffer ans = new StringBuffer(); + + int n = Math.max(a.length(), b.length()), carry = 0; + for (int i = 0; i < n; ++i) { + carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0; + carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0; + ans.append((char) (carry % 2 + '0')); + carry /= 2; + } + + if (carry> 0) { + ans.append('1'); + } + ans.reverse(); + + return ans.toString(); + } +/* +* 190. 颠倒二进制位 +* */ + public int reverseBits(int n) { + int ans = 0; + for (int i = 0; i < 32 && n!=0; i++) { + ans |= (n&1)<<(31-i); + n>>>= 1; + } + return ans; + } +/* +* 191. 位1的个数 +* */ + public int hammingWeight(int n) { + int ret = 0; + while (n != 0) { + n &= n - 1; + ret++; + } + return ret; + } + +/* +* 136. 只出现一次的数字 +* */ + public int singleNumber(int[] nums) { + int ans = 0; + for (int num : nums) { + ans ^=num; + } + return ans; + } +/* 137. 只出现一次的数字 II +* 除某个元素仅出现 一次 外,其余每个元素都恰出现 三次. +* 答案的第 i 个二进制位就是数组中所有元素的第 i 个二进制位之和除以 3 的余数。 + * */ + public int singleNumberII(int[] nums) { + int ans = 0; + for (int i = 0; i < 32; ++i) { + int total = 0; + for (int num: nums) { + total += ((num>> i) & 1); + } + if (total % 3 != 0) { + ans |= (1 << i); + } + } + return ans; + } +/* +201. 数字范围按位与 +题目描述:给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。 +* 这个问题的实质:给定两个整数,我们要找到它们对应的二进制字符串的公共前缀。 +两种方法:(1)位移 +(2)Brian Kernighan 算法 ,利用 n=n & (n - 1)抹去最低位的1 +* */ + public int rangeBitwiseAnd(int m, int n) { + while (m < n) { + // 抹去最右边的 1 + n = n & (n - 1); + } + return n; + } +} diff --git a/comxjtu/src/main/java/com/leetcode/util/Construct.java b/comxjtu/src/main/java/com/leetcode/util/Construct.java new file mode 100644 index 0000000..b562510 --- /dev/null +++ b/comxjtu/src/main/java/com/leetcode/util/Construct.java @@ -0,0 +1,90 @@ +package com.leetcode.util; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * @author JS + * @version 1.0 + * @date 2022/5/1 12:09 + * @description //一个工具类,用于在验证树问题的算法正确性测试时: + * 1. 通过字符串构建二叉树; + * 2. 通过二叉树输出对应的层序遍历的字符串。 + */ +public class Construct { + + //tools for reconstruct treenode + public static Queue
queue = new LinkedList
(); + public static boolean isLeft = true; + public static TreeNode root = null; + + /** + * + * @Param 字符串中的叶子节点默认用#表示,实际中自行替换 + * @Description // 通过二叉树输出对应的层序遍历的字符串。 + * @Date 12:13 2022年5月1日 + * @return + **/ + public static String serialize(TreeNode root) { + StringBuilder builder = new StringBuilder(); + Queue
queue = new LinkedList(); + queue.offer(root); + + while(!queue.isEmpty()){ + TreeNode top = queue.poll(); + if(top == null){ + builder.append('#'); + builder.append(','); + } + else{ + builder.append(top.val); + builder.append(',');//以,作为分割 + queue.offer(top.left); + queue.offer(top.right); + } + } + return builder.toString(); + } + + /** + * + * @Param 字符串中的叶子节点默认用#表示,实际中自行替换 + * @Description //通过字符串构建二叉树; + * @Date 12:15 2022年5月1日 + * @return + **/ + public static TreeNode deserialize(String data) { + String[] strs = data.split(","); + int size = strs.length; + + for(int i = 0;i intersection(int[][] nums) { + int n = nums.length; + // 初始哈希表 + int[] counts = new int[1001]; + List list = new ArrayList(); + for (int number[]:nums) { + for (int x: number) { + counts[x]++; + } + } + for (int i = 0; i < counts.length; i++) { + // 次数等于数组个数 + if (counts[i] == n) list.add(i); + } + // 排序 + Collections.sort(list); + return list; + } + + public int countLatticePoints(int[][] circles) { + int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, maxX = 0, maxY = 0; + for (int[] c : circles) { + minX = Math.min(minX, c[0] - c[2]); + minY = Math.min(minY, c[1] - c[2]); + maxX = Math.max(maxX, c[0] + c[2]); + maxY = Math.max(maxY, c[1] + c[2]); + } + int cnt = 0; + for (int i = minX; i <= maxX; i++) { + for (int j = minY; j <= maxY; j++) { + for (int[] c : circles) { + int dis = (i - c[0]) * (i - c[0]) + (j - c[1]) * (j - c[1]); + if (dis <= c[2] * c[2]) { + cnt++; + break; + } + } + } + } + return cnt; + } +} diff --git a/comxjtu/src/main/java/power/Entity/AbstractMember.java b/comxjtu/src/main/java/com/power/Entity/AbstractMember.java similarity index 86% rename from comxjtu/src/main/java/power/Entity/AbstractMember.java rename to comxjtu/src/main/java/com/power/Entity/AbstractMember.java index b8aa4b6..08ab74d 100644 --- a/comxjtu/src/main/java/power/Entity/AbstractMember.java +++ b/comxjtu/src/main/java/com/power/Entity/AbstractMember.java @@ -1,4 +1,4 @@ -package power.Entity; +package com.power.Entity; /** * @Author: Jay diff --git a/comxjtu/src/main/java/power/Simulation.java b/comxjtu/src/main/java/com/power/Simulation.java similarity index 85% rename from comxjtu/src/main/java/power/Simulation.java rename to comxjtu/src/main/java/com/power/Simulation.java index bd2b449..a32f09a 100644 --- a/comxjtu/src/main/java/power/Simulation.java +++ b/comxjtu/src/main/java/com/power/Simulation.java @@ -1,4 +1,4 @@ -package power; +package com.power; /** * @Author: Jay diff --git a/comxjtu/src/main/java/interview/recursion/AvailableSet.java b/comxjtu/src/main/java/interview/recursion/AvailableSet.java deleted file mode 100644 index 6a8869e..0000000 --- a/comxjtu/src/main/java/interview/recursion/AvailableSet.java +++ /dev/null @@ -1,6 +0,0 @@ -package interview.recursion; - -public class AvailableSet { - - // TODO -} diff --git a/comxjtu/src/main/java/lombok.config b/comxjtu/src/main/java/lombok.config new file mode 100644 index 0000000..4f55f03 --- /dev/null +++ b/comxjtu/src/main/java/lombok.config @@ -0,0 +1 @@ +lombok.var.flagUsage = ALLOW \ No newline at end of file diff --git a/comxjtu/src/main/test/com/leetcode/everyday/MaskPIITest.java b/comxjtu/src/main/test/com/leetcode/everyday/MaskPIITest.java new file mode 100644 index 0000000..bc45f18 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/everyday/MaskPIITest.java @@ -0,0 +1,68 @@ +package com.leetcode.everyday; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + +/** +* MaskPII Tester. +* +* @author JS +* @since 04/01/2023 +* @version 1.0 +*/ +@RunWith(Parameterized.class) +public class MaskPIITest { + + + String expected = ""; + String input = ""; + + @Parameterized.Parameters + public static Collection t(){ + return Arrays.asList(new Object[][]{{"***-***-7890", "1(234)567-890"},{"+**-***-***-5678","86-(10)12345678"}}); + } + + public MaskPIITest(String expected, String input) { + this.expected = expected; + this.input = input; + } + + /** + * + * Method: maskPII(String s) + * + */ + @Test + public void testMaskPII() throws Exception { + assertEquals(expected, new MaskPII().maskPII(input)); + } + @Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + + + +/** +* +* Method: main(String[] args) +* +*/ +@Test +public void testMain() throws Exception { +//TODO: Test goes here... +} + + +} diff --git a/comxjtu/src/main/test/com/leetcode/everyday/PrevPermOpt1Test.java b/comxjtu/src/main/test/com/leetcode/everyday/PrevPermOpt1Test.java new file mode 100644 index 0000000..90aceb2 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/everyday/PrevPermOpt1Test.java @@ -0,0 +1,58 @@ +package com.leetcode.everyday; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** +* PrevPermOpt1 Tester. +* +* @author JS +* @since 04/03/2023 +* @version 1.0 +*/ +@RunWith(Parameterized.class) +public class PrevPermOpt1Test { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: prevPermOpt1(int[] arr) +* +*/ +@Test +public void testPrevPermOpt1() throws Exception { + +} + + +/** +* +* Method: selectMaxIndex(int[] arr, int i) +* +*/ +@Test +public void testSelectMaxIndex() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = PrevPermOpt1.getClass().getMethod("selectMaxIndex", int[].class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +} diff --git a/comxjtu/src/main/test/com/leetcode/everyday/QuadTreeTest.java b/comxjtu/src/main/test/com/leetcode/everyday/QuadTreeTest.java new file mode 100644 index 0000000..665408c --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/everyday/QuadTreeTest.java @@ -0,0 +1,91 @@ +package com.leetcode.everyday; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* QuadTree Tester. +* +* @author JS +* @since 04/29/2022 +* @version 1.0 +*/ +public class QuadTreeTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: construct(int[][] grid) +* +*/ +@Test +public void testConstruct() throws Exception { +//TODO: Test goes here... + QuadTree quadTree = new QuadTree(); + quadTree.outResult(quadTree.construct(new int[][]{{0,1},{1,0}})); + quadTree.outResult(quadTree.construct(new int[][]{{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0},{1,1,1,1,0,0,0,0}})); + quadTree.outResult(quadTree.construct(new int[][]{{1,1},{1,1}})); + quadTree.outResult(quadTree.construct(new int[][]{{0}})); + quadTree.outResult(quadTree.construct(new int[][]{{1,1,0,0},{1,1,0,0},{0,0,1,1},{0,0,1,1}})); +} + +/** +* +* Method: outResult(Node root) +* +*/ +@Test +public void testOutResult() throws Exception { +//TODO: Test goes here... +} + + +/** +* +* Method: constructChild(int[][] grid, int startX, int startY, int length) +* +*/ +@Test +public void testConstructChild() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = QuadTree.getClass().getMethod("constructChild", int[][].class, int.class, int.class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +/** +* +* Method: levelOrder(Node root) +* +*/ +@Test +public void testLevelOrder() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = QuadTree.getClass().getMethod("levelOrder", Node.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +} diff --git a/comxjtu/src/main/test/com/leetcode/everyday/SmallestRangeITest.java b/comxjtu/src/main/test/com/leetcode/everyday/SmallestRangeITest.java new file mode 100644 index 0000000..4844f90 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/everyday/SmallestRangeITest.java @@ -0,0 +1,40 @@ +package com.leetcode.everyday; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* SmallestRangeI Tester. +* +* @author JS +* @since 04/30/2022 +* @version 1.0 +*/ +public class SmallestRangeITest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: smallestRangeI(int[] nums, int k) +* +*/ +@Test +public void testSmallestRangeI() throws Exception { +//TODO: Test goes here... + SmallestRangeI smallestRangeI = new SmallestRangeI(); + System.out.println(smallestRangeI.smallestRangeI(new int[]{1},0)); + System.out.println(smallestRangeI.smallestRangeI(new int[]{0,10},2)); + System.out.println(smallestRangeI.smallestRangeI(new int[]{1,3,6},3)); + System.out.println(smallestRangeI.smallestRangeI(new int[]{1,1,1},3)); +} + + +} diff --git a/comxjtu/src/main/test/com/leetcode/everyday/SortArrayByParityTest.java b/comxjtu/src/main/test/com/leetcode/everyday/SortArrayByParityTest.java new file mode 100644 index 0000000..52c53d1 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/everyday/SortArrayByParityTest.java @@ -0,0 +1,45 @@ +package com.leetcode.everyday; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.util.Arrays; + +import static org.junit.Assert.assertEquals; + +/** +* SortArrayByParity Tester. +* +* @author JS +* @since 04/28/2022 +* @version 1.0 +*/ +public class SortArrayByParityTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: sortArrayByParity(int[] nums) +* +*/ +@Test +public void testSortArrayByParity() throws Exception { +//TODO: Test goes here... + SortArrayByParity sortArrayByParity = new SortArrayByParity(); + System.out.println(Arrays.toString(sortArrayByParity.sortArrayByParity(new int[]{3, 1, 2, 4}))); + System.out.println(Arrays.toString(sortArrayByParity.sortArrayByParity(new int[]{3, 1, 5, 7}))); + System.out.println(Arrays.toString(sortArrayByParity.sortArrayByParity(new int[]{2, 4, 6, 8}))); + System.out.println(Arrays.toString(sortArrayByParity.sortArrayByParity(new int[]{2, 5, 6, 8,7}))); + System.out.println(Arrays.toString(sortArrayByParity.sortArrayByParity(new int[]{0}))); +} + + +} diff --git a/comxjtu/src/main/test/com/leetcode/middle/DPTest.java b/comxjtu/src/main/test/com/leetcode/middle/DPTest.java new file mode 100644 index 0000000..32c1df7 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/middle/DPTest.java @@ -0,0 +1,145 @@ +package com.leetcode.middle; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* DP Tester. +* +* @author JS +* @since 04/29/2022 +* @version 1.0 +*/ +public class DPTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: canJump(int[] nums) +* +*/ +@Test +public void testCanJump() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: canJump2(int[] nums) +* +*/ +@Test +public void testCanJump2() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: uniquePaths(int m, int n) +* +*/ +@Test +public void testUniquePaths() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: coinChange(int[] coins, int amount) +* +*/ +@Test +public void testCoinChange() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: coinChange2(int[] coins, int amount) +* +*/ +@Test +public void testCoinChange2() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: lengthOfLIS(int[] nums) +* +*/ +@Test +public void testLengthOfLIS() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: integerBreak(int n) +* +*/ +@Test +public void testIntegerBreak() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: integerBreak2(int n) +* +*/ +@Test +public void testIntegerBreak2() throws Exception { +//TODO: Test goes here... +} + + +/** +* +* Method: intbreak(int n, int[] dp) +* +*/ +@Test +public void testIntbreak() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("intbreak", int.class, int[].class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +/** +* +* Method: max3(int a, int b, int c) +* +*/ +@Test +public void testMax3() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("max3", int.class, int.class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +} diff --git a/comxjtu/src/main/test/com/leetcode/primary/ArrayssTest.java b/comxjtu/src/main/test/com/leetcode/primary/ArrayssTest.java new file mode 100644 index 0000000..c9ef2a1 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/primary/ArrayssTest.java @@ -0,0 +1,55 @@ +package com.leetcode.primary; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.util.Arrays; + +/** +* Arrayss Tester. +* +* @author JS +* @since 04/30/2022 +* @version 1.0 +*/ +public class ArrayssTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: maxProfit(int[] prices) +* +*/ +@Test +public void testMaxProfit() throws Exception { +//TODO: Test goes here... + Arrayss arrayss = new Arrayss(); + System.out.println(arrayss.maxProfit(new int[]{7,1,5,3,6,4})); + System.out.println(arrayss.maxProfit(new int[]{1,2,3,4,5})); + System.out.println(arrayss.maxProfit(new int[]{7,6,4,3,1})); +} + + +/** +* +* Method: binarySearch(int[] nums, int val, int lo, int hi) +* +*/ +@Test +public void testBinarySearch() throws Exception { +//TODO: Test goes here... + Arrayss arrayss = new Arrayss(); + System.out.println(Arrays.toString(arrayss.twoSum(new int[]{2,7,11,15},9))); + System.out.println(Arrays.toString(arrayss.twoSum(new int[]{3,2,4},6))); + System.out.println(Arrays.toString(arrayss.twoSum(new int[]{3,3},6))); +} + +} diff --git a/comxjtu/src/main/test/com/leetcode/primary/DPTest.java b/comxjtu/src/main/test/com/leetcode/primary/DPTest.java new file mode 100644 index 0000000..61826d1 --- /dev/null +++ b/comxjtu/src/main/test/com/leetcode/primary/DPTest.java @@ -0,0 +1,211 @@ +package com.leetcode.primary; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* DP Tester. +* +* @author JS +* @since 04/29/2022 +* @version 1.0 +*/ +public class DPTest { + DP dp = new DP(); + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: climbStairs(int n) +* +*/ +@Test +public void testClimbStairs() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: maxProfit(int[] prices) +* +*/ +@Test +public void testMaxProfit() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: maxProfit2(int[] prices) +* +*/ +@Test +public void testMaxProfit2() throws Exception { +//TODO: Test goes here... + System.out.println(dp.maxProfit2(new int[]{7, 1, 5, 3, 6, 4})); + System.out.println(dp.maxProfit2(new int[]{7,6,4,3,1})); + System.out.println(dp.maxProfit2(new int[]{7, 7,7,7})); + System.out.println(dp.maxProfit2(new int[]{7})); + +} + +/** +* +* Method: maxSubArray(int[] nums) +* +*/ +@Test +public void testMaxSubArray() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: maxSubArray1(int[] nums) +* +*/ +@Test +public void testMaxSubArray1() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: maxSubArray2(int[] nums) +* +*/ +@Test +public void testMaxSubArray2() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: maxSubArray3(int[] nums) +* +*/ +@Test +public void testMaxSubArray3() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: rob(int[] nums) +* +*/ +@Test +public void testRob() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: rob2(int[] nums) +* +*/ +@Test +public void testRob2() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: main(String[] args) +* +*/ +@Test +public void testMain() throws Exception { +//TODO: Test goes here... +} + + +/** +* +* Method: count(int n, int[] cn) +* +*/ +@Test +public void testCount() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("count", int.class, int[].class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +/** +* +* Method: MaxSubSum(int A[], int Left, int Right) +* +*/ +@Test +public void testMaxSubSum() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("MaxSubSum", int.class, int.class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +/** +* +* Method: Max(int a, int b, int c) +* +*/ +@Test +public void testMax() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("Max", int.class, int.class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +/** +* +* Method: maxRob(int[] nums, int n) +* +*/ +@Test +public void testMaxRob() throws Exception { +//TODO: Test goes here... +/* +try { + Method method = DP.getClass().getMethod("maxRob", int[].class, int.class); + method.setAccessible(true); + method.invoke(, ); +} catch(NoSuchMethodException e) { +} catch(IllegalAccessException e) { +} catch(InvocationTargetException e) { +} +*/ +} + +} diff --git a/comxjtu/src/test/com/leetcode/Question/TwoSumSolutionTest.java b/comxjtu/src/test/com/leetcode/Question/TwoSumSolutionTest.java deleted file mode 100644 index 380f0c7..0000000 --- a/comxjtu/src/test/com/leetcode/Question/TwoSumSolutionTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package test.com.leetcode.Question; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -public class TwoSumSolutionTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: twoSum(int[] nums, int target) - */ - @Test - public void testTwoSum() throws Exception { - -//TODO: Test goes here... - } - - /** - * Method: binarySearch(int[] nums, int k) - */ - @Test - public void testBinarySearch() throws Exception { -//TODO: Test goes here... - } - - -} diff --git a/comxjtu/src/test/com/xjtu/ch1/ThreeSumFastTest.java b/comxjtu/src/test/com/xjtu/ch1/ThreeSumFastTest.java deleted file mode 100644 index e92804b..0000000 --- a/comxjtu/src/test/com/xjtu/ch1/ThreeSumFastTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package test.com.xjtu.ch1; - -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * ThreeSumFast Tester. - * - * @author - * @version 1.0 - * @since
���� 18, 2018
- */ -public class ThreeSumFastTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: countSum(int[] a) - */ - @Test - public void testCountSum() throws Exception { -//TODO: Test goes here... - } - - /** - * Method: binarySearch(int[] arr, int s) - */ - @Test - public void testBinarySearch() throws Exception { -//TODO: Test goes here... - } - - /** - * Method: main(String[] args) - */ - @Test - public void testMain() throws Exception { -//TODO: Test goes here... - } - - -} diff --git a/comxjtu/src/test/java/com/leetcode/everyday/TestTest.java b/comxjtu/src/test/java/com/leetcode/everyday/TestTest.java new file mode 100644 index 0000000..3d791ce --- /dev/null +++ b/comxjtu/src/test/java/com/leetcode/everyday/TestTest.java @@ -0,0 +1,20 @@ +package com.leetcode.everyday; + +import org.junit.Test; + +import static org.junit.Assert.*; +/** + * @author JS + * @date 2023年5月15日 11:03 + * @version 1.0 + * @description //TODO + */public class TestTest { + + @Test + public void maxEqualRowsAfterFlips() { + } + + @Test + public void testWithFiveExamples() { + } +} \ No newline at end of file diff --git a/comxjtu/src/test/test/com/leetcode/Question/CountSayTest.java b/comxjtu/src/test/test/com/leetcode/Question/CountSayTest.java deleted file mode 100644 index 57857ee..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/CountSayTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.CountSay; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * CountSay Tester. - * - * @author - * @version 1.0 - * @since
���� 28, 2018
- */ -public class CountSayTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: countAndSay(int n) - */ - @Test - public void testCountAndSay() throws Exception { -//TODO: Test goes here... - CountSay cs = new CountSay(); -// System.out.println(cs.countAndSay(1)); -// System.out.println(cs.countAndSay(2)); -// System.out.println(cs.countAndSay(3)); - System.out.println(cs.countAndSay(4)); - System.out.println(cs.countAndSay(5)); - } - - /** - * Method: countSay(int n) - */ - @Test - public void testCountSay() throws Exception { -//TODO: Test goes here... - } - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/MergeTwoListsTest.java b/comxjtu/src/test/test/com/leetcode/Question/MergeTwoListsTest.java deleted file mode 100644 index 885da2b..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/MergeTwoListsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.MergeTwoLists; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * MergeTwoLists Tester. - * - * @author - * @version 1.0 - * @since
���� 28, 2018
- */ -public class MergeTwoListsTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: mergeTwoLists(ListNode l1, ListNode l2) - */ - @Test - public void testMergeTwoLists() throws Exception { -//TODO: Test goes here... - } - - /** - * Method: sortList(ListNode l1, ListNode l2) - */ - @Test - public void testSortList() throws Exception { -//TODO: Test goes here... - MergeTwoLists mtl = new MergeTwoLists(); - MergeTwoLists.ListNode l1 = new MergeTwoLists.ListNode(1); - - } - - -} - - diff --git a/comxjtu/src/test/test/com/leetcode/Question/RemoveDuplicateTest.java b/comxjtu/src/test/test/com/leetcode/Question/RemoveDuplicateTest.java deleted file mode 100644 index 1494313..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/RemoveDuplicateTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.RemoveDuplicate; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * RemoveDuplicate Tester. - * - * @author - * @version 1.0 - * @since
���� 28, 2018
- */ -public class RemoveDuplicateTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: removeDuplicates(int[] nums) - */ - @Test - public void testRemoveDuplicates() throws Exception { -//TODO: Test goes here... - int[] nums = new int[]{0,0,1,1,1,2,2,3,3,4}; - RemoveDuplicate rd = new RemoveDuplicate(); - System.out.println("size"+rd.removeDuplicates(nums)); - } - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/SearchInsertTest.java b/comxjtu/src/test/test/com/leetcode/Question/SearchInsertTest.java deleted file mode 100644 index bd28fce..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/SearchInsertTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.SearchInsert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * SearchInsert Tester. - * - * @author - * @version 1.0 - * @since
���� 28, 2018
- */ -public class SearchInsertTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: searchInsert(int[] nums, int target) - */ - @Test - public void testSearchInsert() throws Exception { -//TODO: Test goes here... - } - - /** - * Method: binarySearch(int[] nums, int target) - */ - @Test - public void testBinarySearch() throws Exception { -//TODO: Test goes here... - SearchInsert si = new SearchInsert(); - System.out.println(si.searchInsert(new int[]{1,3,5,6},5)); - System.out.println(si.searchInsert(new int[]{1,3,5,6},2)); - System.out.println(si.searchInsert(new int[]{1,3,5,6},7)); - System.out.println(si.searchInsert(new int[]{1,3,5,6},0)); - } - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/ThreeSumTest.java b/comxjtu/src/test/test/com/leetcode/Question/ThreeSumTest.java deleted file mode 100644 index b225180..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/ThreeSumTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.ThreeSum; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import java.util.Arrays; -import java.util.List; -import java.util.Random; - -/** - * ThreeSum Tester. - * - * @author - * @version 1.0 - * @since
���� 25, 2018
- */ -public class ThreeSumTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: threeSum(int[] nums) - */ - @Test - public void testThreeSum() throws Exception { -//TODO: Test goes here... - long startTime = System.currentTimeMillis(); //��ȡ��ʼɦ�� - int[] arr = new int[]{82597,-9243,62390,83030,-97960,-26521,-61011,83390,-38677,12333,75987,46091,83794,19355,-71037,-6242,-28801,324,1202,-90885,-2989,-95597,-34333,35528,5680,89093,-90606,50360,-29393,-27012,53313,65213,99818,-82405,-41661,-3333,-51952,72135,-1523,26377,74685,96992,92263,15929,5467,-99555,-43348,-41689,-60383,-3990,32165,65265,-72973,-58372,12741,-48568,-46596,72419,-1859,34153,62937,81310,-61823,-96770,-54944,8845,-91184,24208,-29078,31495,65258,14198,85395,70506,-40908,56740,-12228,-40072,32429,93001,68445,-73927,25731,-91859,-24150,10093,-60271,-81683,-18126,51055,48189,-6468,25057,81194,-58628,74042,66158,-14452,-49851,-43667,11092,39189,-17025,-79173,13606,83172,92647,-59741,19343,-26644,-57607,82908,-20655,1637,80060,98994,39331,-31274,-61523,91225,-72953,13211,-75116,-98421,-41571,-69074,99587,39345,42151,-2460,98236,15690,-52507,-95803,-48935,-46492,-45606,-79254,-99851,52533,73486,39948,-7240,71815,-585,-96252,90990,-93815,93340,-71848,58733,-14859,-83082,-75794,-82082,-24871,-15206,91207,-56469,-93618,67131,-8682,75719,87429,-98757,-7535,-24890,-94160,85003,33928,75538,97456,-66424,-60074,-8527,-28697,-22308,2246,-70134,-82319,-10184,87081,-34949,-28645,-47352,-83966,-60418,-15293,-53067,-25921,55172,75064,95859,48049,34311,-86931,-38586,33686,-36714,96922,76713,-22165,-80585,-34503,-44516,39217,-28457,47227,-94036,43457,24626,-87359,26898,-70819,30528,-32397,-69486,84912,-1187,-98986,-32958,4280,-79129,-65604,9344,58964,50584,71128,-55480,24986,15086,-62360,-42977,-49482,-77256,-36895,-74818,20,3063,-49426,28152,-97329,6086,86035,-88743,35241,44249,19927,-10660,89404,24179,-26621,-6511,57745,-28750,96340,-97160,-97822,-49979,52307,79462,94273,-24808,77104,9255,-83057,77655,21361,55956,-9096,48599,-40490,-55107,2689,29608,20497,66834,-34678,23553,-81400,-66630,-96321,-34499,-12957,-20564,25610,-4322,-58462,20801,53700,71527,24669,-54534,57879,-3221,33636,3900,97832,-27688,-98715,5992,24520,-55401,-57613,-69926,57377,-77610,20123,52174,860,60429,-91994,-62403,-6218,-90610,-37263,-15052,62069,-96465,44254,89892,-3406,19121,-41842,-87783,-64125,-56120,73904,-22797,-58118,-4866,5356,75318,46119,21276,-19246,-9241,-97425,57333,-15802,93149,25689,-5532,95716,39209,-87672,-29470,-16324,-15331,27632,-39454,56530,-16000,29853,46475,78242,-46602,83192,-73440,-15816,50964,-36601,89758,38375,-40007,-36675,-94030,67576,46811,-64919,45595,76530,40398,35845,41791,67697,-30439,-82944,63115,33447,-36046,-50122,-34789,43003,-78947,-38763,-89210,32756,-20389,-31358,-90526,-81607,88741,86643,98422,47389,-75189,13091,95993,-15501,94260,-25584,-1483,-67261,-70753,25160,89614,-90620,-48542,83889,-12388,-9642,-37043,-67663,28794,-8801,13621,12241,55379,84290,21692,-95906,-85617,-17341,-63767,80183,-4942,-51478,30997,-13658,8838,17452,-82869,-39897,68449,31964,98158,-49489,62283,-62209,-92792,-59342,55146,-38533,20496,62667,62593,36095,-12470,5453,-50451,74716,-17902,3302,-16760,-71642,-34819,96459,-72860,21638,47342,-69897,-40180,44466,76496,84659,13848,-91600,-90887,-63742,-2156,-84981,-99280,94326,-33854,92029,-50811,98711,-36459,-75555,79110,-88164,-97397,-84217,97457,64387,30513,-53190,-83215,252,2344,-27177,-92945,-89010,82662,-11670,86069,53417,42702,97082,3695,-14530,-46334,17910,77999,28009,-12374,15498,-46941,97088,-35030,95040,92095,-59469,-24761,46491,67357,-66658,37446,-65130,-50416,99197,30925,27308,54122,-44719,12582,-99525,-38446,-69050,-22352,94757,-56062,33684,-40199,-46399,96842,-50881,-22380,-65021,40582,53623,-76034,77018,-97074,-84838,-22953,-74205,79715,-33920,-35794,-91369,73421,-82492,63680,-14915,-33295,37145,76852,-69442,60125,-74166,74308,-1900,-30195,-16267,-60781,-27760,5852,38917,25742,-3765,49097,-63541,98612,-92865,-30248,9612,-8798,53262,95781,-42278,-36529,7252,-27394,-5021,59178,80934,-48480,-75131,-54439,-19145,-48140,98457,-6601,-51616,-89730,78028,32083,-48904,16822,-81153,-8832,48720,-80728,-45133,-86647,-4259,-40453,2590,28613,50523,-4105,-27790,-74579,-17223,63721,33489,-47921,97628,-97691,-14782,-65644,18008,-93651,-71266,80990,-76732,-47104,35368,28632,59818,-86269,-89753,34557,-92230,-5933,-3487,-73557,-13174,-43981,-43630,-55171,30254,-83710,-99583,-13500,71787,5017,-25117,-78586,86941,-3251,-23867,-36315,75973,86272,-45575,77462,-98836,-10859,70168,-32971,-38739,-12761,93410,14014,-30706,-77356,-85965,-62316,63918,-59914,-64088,1591,-10957,38004,15129,-83602,-51791,34381,-89382,-26056,8942,5465,71458,-73805,-87445,-19921,-80784,69150,-34168,28301,-68955,18041,6059,82342,9947,39795,44047,-57313,48569,81936,-2863,-80932,32976,-86454,-84207,33033,32867,9104,-16580,-25727,80157,-70169,53741,86522,84651,68480,84018,61932,7332,-61322,-69663,76370,41206,12326,-34689,17016,82975,-23386,39417,72793,44774,-96259,3213,79952,29265,-61492,-49337,14162,65886,3342,-41622,-62659,-90402,-24751,88511,54739,-21383,-40161,-96610,-24944,-602,-76842,-21856,69964,43994,-15121,-85530,12718,13170,-13547,69222,62417,-75305,-81446,-38786,-52075,-23110,97681,-82800,-53178,11474,35857,94197,-58148,-23689,32506,92154,-64536,-73930,-77138,97446,-83459,70963,22452,68472,-3728,-25059,-49405,95129,-6167,12808,99918,30113,-12641,-26665,86362,-33505,50661,26714,33701,89012,-91540,40517,-12716,-57185,-87230,29914,-59560,13200,-72723,58272,23913,-45586,-96593,-26265,-2141,31087,81399,92511,-34049,20577,2803,26003,8940,42117,40887,-82715,38269,40969,-50022,72088,21291,-67280,-16523,90535,18669,94342,-39568,-88080,-99486,-20716,23108,-28037,63342,36863,-29420,-44016,75135,73415,16059,-4899,86893,43136,-7041,33483,-67612,25327,40830,6184,61805,4247,81119,-22854,-26104,-63466,63093,-63685,60369,51023,51644,-16350,74438,-83514,99083,10079,-58451,-79621,48471,67131,-86940,99093,11855,-22272,-67683,-44371,9541,18123,37766,-70922,80385,-57513,-76021,-47890,36154,72935,84387,-92681,-88303,-7810,59902,-90,-64704,-28396,-66403,8860,13343,33882,85680,7228,28160,-14003,54369,-58893,92606,-63492,-10101,64714,58486,29948,-44679,-22763,10151,-56695,4031,-18242,-36232,86168,-14263,9883,47124,47271,92761,-24958,-73263,-79661,-69147,-18874,29546,-92588,-85771,26451,-86650,-43306,-59094,-47492,-34821,-91763,-47670,33537,22843,67417,-759,92159,63075,94065,-26988,55276,65903,30414,-67129,-99508,-83092,-91493,-50426,14349,-83216,-76090,32742,-5306,-93310,-60750,-60620,-45484,-21108,-58341,-28048,-52803,69735,78906,81649,32565,-86804,-83202,-65688,-1760,89707,93322,-72750,84134,71900,-37720,19450,-78018,22001,-23604,26276,-21498,65892,-72117,-89834,-23867,55817,-77963,42518,93123,-83916,63260,-2243,-97108,85442,-36775,17984,-58810,99664,-19082,93075,-69329,87061,79713,16296,70996,13483,-74582,49900,-27669,-40562,1209,-20572,34660,83193,75579,7344,64925,88361,60969,3114,44611,-27445,53049,-16085,-92851,-53306,13859,-33532,86622,-75666,-18159,-98256,51875,-42251,-27977,-18080,23772,38160,41779,9147,94175,99905,-85755,62535,-88412,-52038,-68171,93255,-44684,-11242,-104,31796,62346,-54931,-55790,-70032,46221,56541,-91947,90592,93503,4071,20646,4856,-63598,15396,-50708,32138,-85164,38528,-89959,53852,57915,-42421,-88916,-75072,67030,-29066,49542,-71591,61708,-53985,-43051,28483,46991,-83216,80991,-46254,-48716,39356,-8270,-47763,-34410,874,-1186,-7049,28846,11276,21960,-13304,-11433,-4913,55754,79616,70423,-27523,64803,49277,14906,-97401,-92390,91075,70736,21971,-3303,55333,-93996,76538,54603,-75899,98801,46887,35041,48302,-52318,55439,24574,14079,-24889,83440,14961,34312,-89260,-22293,-81271,-2586,-71059,-10640,-93095,-5453,-70041,66543,74012,-11662,-52477,-37597,-70919,92971,-17452,-67306,-80418,7225,-89296,24296,86547,37154,-10696,74436,-63959,58860,33590,-88925,-97814,-83664,85484,-8385,-50879,57729,-74728,-87852,-15524,-91120,22062,28134,80917,32026,49707,-54252,-44319,-35139,13777,44660,85274,25043,58781,-89035,-76274,6364,-63625,72855,43242,-35033,12820,-27460,77372,-47578,-61162,-70758,-1343,-4159,64935,56024,-2151,43770,19758,-30186,-86040,24666,-62332,-67542,73180,-25821,-27826,-45504,-36858,-12041,20017,-24066,-56625,-52097,-47239,-90694,8959,7712,-14258,-5860,55349,61808,-4423,-93703,64681,-98641,-25222,46999,-83831,-54714,19997,-68477,66073,51801,-66491,52061,-52866,79907,-39736,-68331,68937,91464,98892,910,93501,31295,-85873,27036,-57340,50412,21,-2445,29471,71317,82093,-94823,-54458,-97410,39560,-7628,66452,39701,54029,37906,46773,58296,60370,-61090,85501,-86874,71443,-72702,-72047,14848,34102,77975,-66294,-36576,31349,52493,-70833,-80287,94435,39745,-98291,84524,-18942,10236,93448,50846,94023,-6939,47999,14740,30165,81048,84935,-19177,-13594,32289,62628,-90612,-542,-66627,64255,71199,-83841,-82943,-73885,8623,-67214,-9474,-35249,62254,-14087,-90969,21515,-83303,94377,-91619,19956,-98810,96727,-91939,29119,-85473,-82153,-69008,44850,74299,-76459,-86464,8315,-49912,-28665,59052,-69708,76024,-92738,50098,18683,-91438,18096,-19335,35659,91826,15779,-73070,67873,-12458,-71440,-46721,54856,97212,-81875,35805,36952,68498,81627,-34231,81712,27100,-9741,-82612,18766,-36392,2759,41728,69743,26825,48355,-17790,17165,56558,3295,-24375,55669,-16109,24079,73414,48990,-11931,-78214,90745,19878,35673,-15317,-89086,94675,-92513,88410,-93248,-19475,-74041,-19165,32329,-26266,-46828,-18747,45328,8990,-78219,-25874,-74801,-44956,-54577,-29756,-99822,-35731,-18348,-68915,-83518,-53451,95471,-2954,-13706,-8763,-21642,-37210,16814,-60070,-42743,27697,-36333,-42362,11576,85742,-82536,68767,-56103,-63012,71396,-78464,-68101,-15917,-11113,-3596,77626,-60191,-30585,-73584,6214,-84303,18403,23618,-15619,-89755,-59515,-59103,-74308,-63725,-29364,-52376,-96130,70894,-12609,50845,-2314,42264,-70825,64481,55752,4460,-68603,-88701,4713,-50441,-51333,-77907,97412,-66616,-49430,60489,-85262,-97621,-18980,44727,-69321,-57730,66287,-92566,-64427,-14270,11515,-92612,-87645,61557,24197,-81923,-39831,-10301,-23640,-76219,-68025,92761,-76493,68554,-77734,-95620,-11753,-51700,98234,-68544,-61838,29467,46603,-18221,-35441,74537,40327,-58293,75755,-57301,-7532,-94163,18179,-14388,-22258,-46417,-48285,18242,-77551,82620,250,-20060,-79568,-77259,82052,-98897,-75464,48773,-79040,-11293,45941,-67876,-69204,-46477,-46107,792,60546,-34573,-12879,-94562,20356,-48004,-62429,96242,40594,2099,99494,25724,-39394,-2388,-18563,-56510,-83570,-29214,3015,74454,74197,76678,-46597,60630,-76093,37578,-82045,-24077,62082,-87787,-74936,58687,12200,-98952,70155,-77370,21710,-84625,-60556,-84128,925,65474,-15741,-94619,88377,89334,44749,22002,-45750,-93081,-14600,-83447,46691,85040,-66447,-80085,56308,44310,24979,-29694,57991,4675,-71273,-44508,13615,-54710,23552,-78253,-34637,50497,68706,81543,-88408,-21405,6001,-33834,-21570,-46692,-25344,20310,71258,-97680,11721,59977,59247,-48949,98955,-50276,-80844,-27935,-76102,55858,-33492,40680,66691,-33188,8284,64893,-7528,6019,-85523,8434,-64366,-56663,26862,30008,-7611,-12179,-70076,21426,-11261,-36864,-61937,-59677,929,-21052,3848,-20888,-16065,98995,-32293,-86121,-54564,77831,68602,74977,31658,40699,29755,98424,80358,-69337,26339,13213,-46016,-18331,64713,-46883,-58451,-70024,-92393,-4088,70628,-51185,71164,-75791,-1636,-29102,-16929,-87650,-84589,-24229,-42137,-15653,94825,13042,88499,-47100,-90358,-7180,29754,-65727,-42659,-85560,-9037,-52459,20997,-47425,17318,21122,20472,-23037,65216,-63625,-7877,-91907,24100,-72516,22903,-85247,-8938,73878,54953,87480,-31466,-99524,35369,-78376,89984,-15982,94045,-7269,23319,-80456,-37653,-76756,2909,81936,54958,-12393,60560,-84664,-82413,66941,-26573,-97532,64460,18593,-85789,-38820,-92575,-43663,-89435,83272,-50585,13616,-71541,-53156,727,-27644,16538,34049,57745,34348,35009,16634,-18791,23271,-63844,95817,21781,16590,59669,15966,-6864,48050,-36143,97427,-59390,96931,78939,-1958,50777,43338,-51149,39235,-27054,-43492,67457,-83616,37179,10390,85818,2391,73635,87579,-49127,-81264,-79023,-81590,53554,-74972,-83940,-13726,-39095,29174,78072,76104,47778,25797,-29515,-6493,-92793,22481,-36197,-65560,42342,15750,97556,99634,-56048,-35688,13501,63969,-74291,50911,39225,93702,-3490,-59461,-30105,-46761,-80113,92906,-68487,50742,36152,-90240,-83631,24597,-50566,-15477,18470,77038,40223,-80364,-98676,70957,-63647,99537,13041,31679,86631,37633,-16866,13686,-71565,21652,-46053,-80578,-61382,68487,-6417,4656,20811,67013,-30868,-11219,46,74944,14627,56965,42275,-52480,52162,-84883,-52579,-90331,92792,42184,-73422,-58440,65308,-25069,5475,-57996,59557,-17561,2826,-56939,14996,-94855,-53707,99159,43645,-67719,-1331,21412,41704,31612,32622,1919,-69333,-69828,22422,-78842,57896,-17363,27979,-76897,35008,46482,-75289,65799,20057,7170,41326,-76069,90840,-81253,-50749,3649,-42315,45238,-33924,62101,96906,58884,-7617,-28689,-66578,62458,50876,-57553,6739,41014,-64040,-34916,37940,13048,-97478,-11318,-89440,-31933,-40357,-59737,-76718,-14104,-31774,28001,4103,41702,-25120,-31654,63085,-3642,84870,-83896,-76422,-61520,12900,88678,85547,33132,-88627,52820,63915,-27472,78867,-51439,33005,-23447,-3271,-39308,39726,-74260,-31874,-36893,93656,910,-98362,60450,-88048,99308,13947,83996,-90415,-35117,70858,-55332,-31721,97528,82982,-86218,6822,25227,36946,97077,-4257,-41526,56795,89870,75860,-70802,21779,14184,-16511,-89156,-31422,71470,69600,-78498,74079,-19410,40311,28501,26397,-67574,-32518,68510,38615,19355,-6088,-97159,-29255,-92523,3023,-42536,-88681,64255,41206,44119,52208,39522,-52108,91276,-70514,83436,63289,-79741,9623,99559,12642,85950,83735,-21156,-67208,98088,-7341,-27763,-30048,-44099,-14866,-45504,-91704,19369,13700,10481,-49344,-85686,33994,19672,36028,60842,66564,-24919,33950,-93616,-47430,-35391,-28279,56806,74690,39284,-96683,-7642,-75232,37657,-14531,-86870,-9274,-26173,98640,88652,64257,46457,37814,-19370,9337,-22556,-41525,39105,-28719,51611,-93252,98044,-90996,21710,-47605,-64259,-32727,53611,-31918,-3555,33316,-66472,21274,-37731,-2919,15016,48779,-88868,1897,41728,46344,-89667,37848,68092,-44011,85354,-43776,38739,-31423,-66330,65167,-22016,59405,34328,-60042,87660,-67698,-59174,-1408,-46809,-43485,-88807,-60489,13974,22319,55836,-62995,-37375,-4185,32687,-36551,-75237,58280,26942,-73756,71756,78775,-40573,14367,-71622,-77338,24112,23414,-7679,-51721,87492,85066,-21612,57045,10673,-96836,52461,-62218,-9310,65862,-22748,89906,-96987,-98698,26956,-43428,46141,47456,28095,55952,67323,-36455,-60202,-43302,-82932,42020,77036,10142,60406,70331,63836,58850,-66752,52109,21395,-10238,-98647,-41962,27778,69060,98535,-28680,-52263,-56679,66103,-42426,27203,80021,10153,58678,36398,63112,34911,20515,62082,-15659,-40785,27054,43767,-20289,65838,-6954,-60228,-72226,52236,-35464,25209,-15462,-79617,-41668,-84083,62404,-69062,18913,46545,20757,13805,24717,-18461,-47009,-25779,68834,64824,34473,39576,31570,14861,-15114,-41233,95509,68232,67846,84902,-83060,17642,-18422,73688,77671,-26930,64484,-99637,73875,6428,21034,-73471,19664,-68031,15922,-27028,48137,54955,-82793,-41144,-10218,-24921,-28299,-2288,68518,-54452,15686,-41814,66165,-72207,-61986,80020,50544,-99500,16244,78998,40989,14525,-56061,-24692,-94790,21111,37296,-90794,72100,70550,-31757,17708,-74290,61910,78039,-78629,-25033,73172,-91953,10052,64502,99585,-1741,90324,-73723,68942,28149,30218,24422,16659,10710,-62594,94249,96588,46192,34251,73500,-65995,-81168,41412,-98724,-63710,-54696,-52407,19746,45869,27821,-94866,-76705,-13417,-61995,-71560,43450,67384,-8838,-80293,-28937,23330,-89694,-40586,46918,80429,-5475,78013,25309,-34162,37236,-77577,86744,26281,-29033,-91813,35347,13033,-13631,-24459,3325,-71078,-75359,81311,19700,47678,-74680,-84113,45192,35502,37675,19553,76522,-51098,-18211,89717,4508,-82946,27749,85995,89912,-53678,-64727,-14778,32075,-63412,-40524,86440,-2707,-36821,63850,-30883,67294,-99468,-23708,34932,34386,98899,29239,-23385,5897,54882,98660,49098,70275,17718,88533,52161,63340,50061,-89457,19491,-99156,24873,-17008,64610,-55543,50495,17056,-10400,-56678,-29073,-42960,-76418,98562,-88104,-96255,10159,-90724,54011,12052,45871,-90933,-69420,67039,37202,78051,-52197,-40278,-58425,65414,-23394,-1415,6912,-53447,7352,17307,-78147,63727,98905,55412,-57658,-32884,-44878,22755,39730,3638,35111,39777,74193,38736,-11829,-61188,-92757,55946,-71232,-63032,-83947,39147,-96684,-99233,25131,-32197,24406,-55428,-61941,25874,-69453,64483,-19644,-68441,12783,87338,-48676,66451,-447,-61590,50932,-11270,29035,65698,-63544,10029,80499,-9461,86368,91365,-81810,-71914,-52056,-13782,44240,-30093,-2437,24007,67581,-17365,-69164,-8420,-69289,-29370,48010,90439,13141,69243,50668,39328,61731,78266,-81313,17921,-38196,55261,9948,-24970,75712,-72106,28696,7461,31621,61047,51476,56512,11839,-96916,-82739,28924,-99927,58449,37280,69357,11219,-32119,-62050,-48745,-83486,-52376,42668,82659,68882,38773,46269,-96005,97630,25009,-2951,-67811,99801,81587,-79793,-18547,-83086,69512,33127,-92145,-88497,47703,59527,1909,88785,-88882,69188,-46131,-5589,-15086,36255,-53238,-33009,82664,53901,35939,-42946,-25571,33298,69291,53199,74746,-40127,-39050,91033,51717,-98048,87240,36172,65453,-94425,-63694,-30027,59004,88660,3649,-20267,-52565,-67321,34037,4320,91515,-56753,60115,27134,68617,-61395,-26503,-98929,-8849,-63318,10709,-16151,61905,-95785,5262,23670,-25277,90206,-19391,45735,37208,-31992,-92450,18516,-90452,-58870,-58602,93383,14333,17994,82411,-54126,-32576,35440,-60526,-78764,-25069,-9022,-394,92186,-38057,55328,-61569,67780,77169,19546,-92664,-94948,44484,-13439,83529,27518,-48333,72998,38342,-90553,-98578,-76906,81515,-16464,78439,92529,35225,-39968,-10130,-7845,-32245,-74955,-74996,67731,-13897,-82493,33407,93619,59560,-24404,-57553,19486,-45341,34098,-24978,-33612,79058,71847,76713,-95422,6421,-96075,-59130,-28976,-16922,-62203,69970,68331,21874,40551,89650,51908,58181,66480,-68177,34323,-3046,-49656,-59758,43564,-10960,-30796,15473,-20216,46085,-85355,41515,-30669,-87498,57711,56067,63199,-83805,62042,91213,-14606,4394,-562,74913,10406,96810,-61595,32564,31640,-9732,42058,98052,-7908,-72330,1558,-80301,34878,32900,3939,-8824,88316,20937,21566,-3218,-66080,-31620,86859,54289,90476,-42889,-15016,-18838,75456,30159,-67101,42328,-92703,85850,-5475,23470,-80806,68206,17764,88235,46421,-41578,74005,-81142,80545,20868,-1560,64017,83784,68863,-97516,-13016,-72223,79630,-55692,82255,88467,28007,-34686,-69049,-41677,88535,-8217,68060,-51280,28971,49088,49235,26905,-81117,-44888,40623,74337,-24662,97476,79542,-72082,-35093,98175,-61761,-68169,59697,-62542,-72965,59883,-64026,-37656,-92392,-12113,-73495,98258,68379,-21545,64607,-70957,-92254,-97460,-63436,-8853,-19357,-51965,-76582,12687,-49712,45413,-60043,33496,31539,-57347,41837,67280,-68813,52088,-13155,-86430,-15239,-45030,96041,18749,-23992,46048,35243,-79450,85425,-58524,88781,-39454,53073,-48864,-82289,39086,82540,-11555,25014,-5431,-39585,-89526,2705,31953,-81611,36985,-56022,68684,-27101,11422,64655,-26965,-63081,-13840,-91003,-78147,-8966,41488,1988,99021,-61575,-47060,65260,-23844,-21781,-91865,-19607,44808,2890,63692,-88663,-58272,15970,-65195,-45416,-48444,-78226,-65332,-24568,42833,-1806,-71595,80002,-52250,30952,48452,-90106,31015,-22073,62339,63318,78391,28699,77900,-4026,-76870,-45943,33665,9174,-84360,-22684,-16832,-67949,-38077,-38987,-32847,51443,-53580,-13505,9344,-92337,26585,70458,-52764,-67471,-68411,-1119,-2072,-93476,67981,40887,-89304,-12235,41488,1454,5355,-34855,-72080,24514,-58305,3340,34331,8731,77451,-64983,-57876,82874,62481,-32754,-39902,22451,-79095,-23904,78409,-7418,77916}; -// int[] arr = new int[]{2,5,8,6,2,4,1,88,43,21,15,13,-1,-3,-5,-4,-44}; - ThreeSum ts = new ThreeSum(); - List list=ts.threeSum(arr); - long endTime = System.currentTimeMillis(); //��ȡ��ʼɦ�� - System.out.println("��������ɦ�䣺" + (endTime - startTime) + "ms"); - System.out.println("end"); - } - - /** - * Method: binarySearch(int[] arr, int s, int k) - */ - @Test - public void testBinarySearch() throws Exception { -//TODO: Test goes here... - ThreeSum ts = new ThreeSum(); - int[] arr = new int[10]; - for (int i = 0; i < arr.length; i++) { - arr[i]= new Random().nextInt(50); - System.out.print(" "+arr[i]); - } - System.out.println(); - Arrays.sort(arr); - System.out.print("["); - for (int i = 0; i < arr.length; i++) { - System.out.print(" "+arr[i]); - } - System.out.println("]"); - System.out.println(ts.binarySearch(arr,25,0)); - } - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/TwoAdd2Test.java b/comxjtu/src/test/test/com/leetcode/Question/TwoAdd2Test.java deleted file mode 100644 index a8fb46a..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/TwoAdd2Test.java +++ /dev/null @@ -1,44 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.TwoAdd2; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** -* TwoAdd2 Tester. -* -* @author -* @since
���� 25, 2018
-* @version 1.0 -*/ -public class TwoAdd2Test { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: addTwoNumbers(ListNode l1, ListNode l2) -* -*/ -@Test -public void testAddTwoNumbers() throws Exception { - TwoAdd2 ttt=new TwoAdd2(); - System.out.println("first"); - TwoAdd2.ListNode rs1 = ttt.trans(753865680); - System.out.println("second"); - TwoAdd2.ListNode rs2 = ttt.trans(798580876); - TwoAdd2.ListNode l = ttt.addTwoNumbers(rs1,rs2); - ttt.show(l); - -//TODO: Test goes here... -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/TwoAddTest.java b/comxjtu/src/test/test/com/leetcode/Question/TwoAddTest.java deleted file mode 100644 index 814d7bc..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/TwoAddTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.TwoAdd; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** -* TwoAdd Tester. -* -* @author -* @since
���� 25, 2018
-* @version 1.0 -*/ -public class TwoAddTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: addTwoNumbers(ListNode l1, ListNode l2) -* -*/ -@Test -public void testAddTwoNumbers() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: size(ListNode l) -* -*/ -@Test -public void testSize() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: trans(int k) -* -*/ -@Test -public void testTrans() throws Exception { - System.out.println(Long.MAX_VALUE); - System.out.println(Integer.MAX_VALUE); - TwoAdd ttt=new TwoAdd(); - System.out.println("first"); - TwoAdd.ListNode rs1 = ttt.trans(11111111111l); - System.out.println("second"); - TwoAdd.ListNode rs2 = ttt.trans(11111111111l); - ttt.addTwoNumbers(rs1,rs2); - -//TODO: Test goes here... -// System.out.println(Math.pow(10,2)); -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/ValidParenthesesTest.java b/comxjtu/src/test/test/com/leetcode/Question/ValidParenthesesTest.java deleted file mode 100644 index 2a86d0e..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/ValidParenthesesTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.ValidParentheses; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** -* ValidParentheses Tester. -* -* @author -* @since
���� 27, 2018
-* @version 1.0 -*/ -public class ValidParenthesesTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: isValid(String s) -* -*/ -@Test -public void testIsValid() throws Exception { -//TODO: Test goes here... - String s ="{[]}"; - System.out.println(new ValidParentheses().isValid(s)); -// assert new ValidParentheses().isValid(s); - -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/Question/isPalindromeTest.java b/comxjtu/src/test/test/com/leetcode/Question/isPalindromeTest.java deleted file mode 100644 index 6cf8722..0000000 --- a/comxjtu/src/test/test/com/leetcode/Question/isPalindromeTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package test.com.leetcode.Question; - -import com.leetcode.Question.isPalindrome; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** -* isPalindrome Tester. -* -* @author -* @since
���� 25, 2018
-* @version 1.0 -*/ -public class isPalindromeTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: isPalindrome(int x) -* - * @param i - */ -@Test -public void testIsPalindrome(){ -//TODO: Test goes here... - System.out.println(new isPalindrome().isPalindrome(-121)); -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/base/InverseArrayTest.java b/comxjtu/src/test/test/com/leetcode/base/InverseArrayTest.java deleted file mode 100644 index 873bb06..0000000 --- a/comxjtu/src/test/test/com/leetcode/base/InverseArrayTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package test.com.leetcode.base; - -import com.leetcode.base.InverseArray; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** -* InverseArray Tester. -* -* @author -* @since
���� 25, 2018
-* @version 1.0 -*/ -public class InverseArrayTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: inverseArr(int[] arr) -* -*/ -@Test -public void testInverseArr() throws Exception { -//TODO: Test goes here... - int[] arr1 = new int[]{1,2,3,4,5}; - int[] arr2 = new int[]{1,2,3,4,5,6}; - arr1 = new InverseArray().inverseArr(arr1); - arr2= new InverseArray().inverseArr(arr2); - for (int i = 0; i < arr1.length; i++) { - System.out.print(arr1[i]); - } - System.out.println(""); - for (int i = 0; i < arr2.length; i++) { - System.out.print(arr2[i]); - } -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/primary/MoveZeroesTest.java b/comxjtu/src/test/test/com/leetcode/primary/MoveZeroesTest.java deleted file mode 100644 index 8ca7f4f..0000000 --- a/comxjtu/src/test/test/com/leetcode/primary/MoveZeroesTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package test.com.leetcode.primary; - -import com.leetcode.primary.MoveZeroes; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** -* MoveZeroes Tester. -* -* @author -* @since
���� 29, 2018
-* @version 1.0 -*/ -public class MoveZeroesTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: moveZeroes(int[] nums) -* -*/ -@Test -public void testMoveZeroes() throws Exception { -//TODO: Test goes here... - MoveZeroes mz = new MoveZeroes(); - int[] nums = new int[]{0,1,0,3,12}; - mz.moveZeroes(nums); - for (int i = 0; i < nums.length; i++) { - System.out.print(nums[i]); - } -} - - -} diff --git a/comxjtu/src/test/test/com/leetcode/primary/RotateTest.java b/comxjtu/src/test/test/com/leetcode/primary/RotateTest.java deleted file mode 100644 index dda82b6..0000000 --- a/comxjtu/src/test/test/com/leetcode/primary/RotateTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package test.com.leetcode.primary; - -import com.leetcode.primary.Rotate; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** - * Rotate Tester. - * - * @author - * @version 1.0 - * @since
���� 29, 2018
- */ -public class RotateTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: rotate(int[] nums, int k) - */ - @Test - public void testRotate() throws Exception { -//TODO: Test goes here... - Rotate r = new Rotate(); - r.rotate(new int[]{1,2,3,4,5,6,7},3); - r.rotate(new int[]{-1,-100,3,99},2); - r.rotate(new int[]{},3); - r.rotate(new int[]{1,2,3},-1); - } - - -} diff --git a/comxjtu/src/test/test/com/leetcode/primary/StringsTest.java b/comxjtu/src/test/test/com/leetcode/primary/StringsTest.java deleted file mode 100644 index 4d0cfe9..0000000 --- a/comxjtu/src/test/test/com/leetcode/primary/StringsTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package test.com.leetcode.primary; - -import com.leetcode.primary.Strings; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -/** -* Strings Tester. -* -* @author -* @since
���� 30, 2018
-* @version 1.0 -*/ -public class StringsTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: reverseString(String s) -* -*/ -@Test -public void testReverseString() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: firstUniqChar(String s) -* -*/ -@Test -public void testFirstUniqChar() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: isAnagram(String s, String t) -* -*/ -@Test -public void testIsAnagram() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: isPalindrome(String s) -* -*/ -@Test -public void testIsPalindrome() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: myAtoi(String str) -* -*/ -@Test -public void testMyAtoi() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: strStr(String haystack, String needle) -* -*/ -@Test -public void testStrStr() throws Exception { -//TODO: Test goes here... - Strings s = new Strings(); - System.out.println(s.strStr("hello","ll")); -} - - -} diff --git a/comxjtu/src/test/test/coom/xjtu/ch2/SelectionSortTest.java b/comxjtu/src/test/test/coom/xjtu/ch2/SelectionSortTest.java deleted file mode 100644 index dd9d972..0000000 --- a/comxjtu/src/test/test/coom/xjtu/ch2/SelectionSortTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package test.coom.xjtu.ch2; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.util.Random; - -/** - * SelectionSort Tester. - * - * @author - * @version 1.0 - * @since - */ -public class SelectionSortTest { - - @Before - public void before() throws Exception { - } - - @After - public void after() throws Exception { - } - - /** - * Method: sort(Comparable[] a) - */ - @Test - public void testSort() throws Exception { - int[] a = new int[20]; - for (int i = 0; i < a.length; i++) { - a[i] = new Random().nextInt(100); - System.out.println(a[i]); - } - -//TODO: Test goes here... - } - - -} diff --git a/comxjtu/target/classes/A.class b/comxjtu/target/classes/A.class index bf51d64..9efe496 100644 Binary files a/comxjtu/target/classes/A.class and b/comxjtu/target/classes/A.class differ diff --git a/comxjtu/target/classes/com/HW/Main.class b/comxjtu/target/classes/com/HW/Main.class deleted file mode 100644 index 34efeef..0000000 Binary files a/comxjtu/target/classes/com/HW/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/HW/Main2.class b/comxjtu/target/classes/com/HW/Main2.class deleted file mode 100644 index eacc658..0000000 Binary files a/comxjtu/target/classes/com/HW/Main2.class and /dev/null differ diff --git a/comxjtu/target/classes/com/HW/Main3$Answer.class b/comxjtu/target/classes/com/HW/Main3$Answer.class deleted file mode 100644 index 18faa41..0000000 Binary files a/comxjtu/target/classes/com/HW/Main3$Answer.class and /dev/null differ diff --git a/comxjtu/target/classes/com/HW/Main3.class b/comxjtu/target/classes/com/HW/Main3.class deleted file mode 100644 index 9f9a982..0000000 Binary files a/comxjtu/target/classes/com/HW/Main3.class and /dev/null differ diff --git a/comxjtu/target/classes/com/HW/Test.class b/comxjtu/target/classes/com/HW/Test.class deleted file mode 100644 index 4b7b006..0000000 Binary files a/comxjtu/target/classes/com/HW/Test.class and /dev/null differ diff --git a/comxjtu/target/classes/com/N360/DivideGold.class b/comxjtu/target/classes/com/N360/DivideGold.class deleted file mode 100644 index 72157fe..0000000 Binary files a/comxjtu/target/classes/com/N360/DivideGold.class and /dev/null differ diff --git a/comxjtu/target/classes/com/N360/Main.class b/comxjtu/target/classes/com/N360/Main.class deleted file mode 100644 index a606060..0000000 Binary files a/comxjtu/target/classes/com/N360/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/N360/Main2.class b/comxjtu/target/classes/com/N360/Main2.class deleted file mode 100644 index 5378f7d..0000000 Binary files a/comxjtu/target/classes/com/N360/Main2.class and /dev/null differ diff --git a/comxjtu/target/classes/com/N360/Main3.class b/comxjtu/target/classes/com/N360/Main3.class deleted file mode 100644 index b17fa3b..0000000 Binary files a/comxjtu/target/classes/com/N360/Main3.class and /dev/null differ diff --git a/comxjtu/target/classes/com/N360/Test.class b/comxjtu/target/classes/com/N360/Test.class deleted file mode 100644 index 222df53..0000000 Binary files a/comxjtu/target/classes/com/N360/Test.class and /dev/null differ diff --git a/comxjtu/target/classes/com/SF/Long.class b/comxjtu/target/classes/com/SF/Long.class deleted file mode 100644 index 9ff9376..0000000 Binary files a/comxjtu/target/classes/com/SF/Long.class and /dev/null differ diff --git a/comxjtu/target/classes/com/SF/Main.class b/comxjtu/target/classes/com/SF/Main.class deleted file mode 100644 index 93d894a..0000000 Binary files a/comxjtu/target/classes/com/SF/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/Tecent/Main.class b/comxjtu/target/classes/com/Tecent/Main.class deleted file mode 100644 index 324dd12..0000000 Binary files a/comxjtu/target/classes/com/Tecent/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/Tecent/Test.class b/comxjtu/target/classes/com/Tecent/Test.class deleted file mode 100644 index 2f5188c..0000000 Binary files a/comxjtu/target/classes/com/Tecent/Test.class and /dev/null differ diff --git a/comxjtu/target/classes/com/ZTE.class b/comxjtu/target/classes/com/ZTE.class deleted file mode 100644 index 55c1e71..0000000 Binary files a/comxjtu/target/classes/com/ZTE.class and /dev/null differ diff --git a/comxjtu/target/classes/com/ali/Main.class b/comxjtu/target/classes/com/ali/Main.class deleted file mode 100644 index f4cedf8..0000000 Binary files a/comxjtu/target/classes/com/ali/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/ali/Main2.class b/comxjtu/target/classes/com/ali/Main2.class deleted file mode 100644 index f59d753..0000000 Binary files a/comxjtu/target/classes/com/ali/Main2.class and /dev/null differ diff --git a/comxjtu/target/classes/com/alibaba/Main.class b/comxjtu/target/classes/com/alibaba/Main.class deleted file mode 100644 index 871779c..0000000 Binary files a/comxjtu/target/classes/com/alibaba/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/alibaba/Point.class b/comxjtu/target/classes/com/alibaba/Point.class deleted file mode 100644 index 01ad403..0000000 Binary files a/comxjtu/target/classes/com/alibaba/Point.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/A.class b/comxjtu/target/classes/com/java/DesignPatterns/A.class deleted file mode 100644 index cc1b906..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/A.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/B.class b/comxjtu/target/classes/com/java/DesignPatterns/B.class deleted file mode 100644 index 0f72e7b..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/B.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/C.class b/comxjtu/target/classes/com/java/DesignPatterns/C.class deleted file mode 100644 index e76a4b9..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/C.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/Client.class b/comxjtu/target/classes/com/java/DesignPatterns/Client.class deleted file mode 100644 index c37097a..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/Client.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/Singleton.class b/comxjtu/target/classes/com/java/DesignPatterns/Singleton.class deleted file mode 100644 index 8ad4a1b..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/Singleton.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/StaticFactory.class b/comxjtu/target/classes/com/java/DesignPatterns/StaticFactory.class deleted file mode 100644 index 10b000f..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/StaticFactory.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/DesignPatterns/food.class b/comxjtu/target/classes/com/java/DesignPatterns/food.class deleted file mode 100644 index 71da98c..0000000 Binary files a/comxjtu/target/classes/com/java/DesignPatterns/food.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/Dijkstra/Dijkstra.class b/comxjtu/target/classes/com/java/Dijkstra/Dijkstra.class deleted file mode 100644 index a43ebaa..0000000 Binary files a/comxjtu/target/classes/com/java/Dijkstra/Dijkstra.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/Dijkstra/Edge.class b/comxjtu/target/classes/com/java/Dijkstra/Edge.class deleted file mode 100644 index e14c0c6..0000000 Binary files a/comxjtu/target/classes/com/java/Dijkstra/Edge.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/Dijkstra/Graph.class b/comxjtu/target/classes/com/java/Dijkstra/Graph.class deleted file mode 100644 index 112ab59..0000000 Binary files a/comxjtu/target/classes/com/java/Dijkstra/Graph.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/Dijkstra/Vertex.class b/comxjtu/target/classes/com/java/Dijkstra/Vertex.class deleted file mode 100644 index 8a04d6b..0000000 Binary files a/comxjtu/target/classes/com/java/Dijkstra/Vertex.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル1ドル.class b/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル1ドル.class deleted file mode 100644 index 80e7df2..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル.class b/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル.class deleted file mode 100644 index bf117ee..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/AtomicTest1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/AtomicTest2ドル.class b/comxjtu/target/classes/com/java/concurrent/AtomicTest2ドル.class deleted file mode 100644 index 9b0f4b8..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/AtomicTest2ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/AtomicTest.class b/comxjtu/target/classes/com/java/concurrent/AtomicTest.class deleted file mode 100644 index 63eb2e5..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/AtomicTest.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/CountDownL1ドル.class b/comxjtu/target/classes/com/java/concurrent/CountDownL1ドル.class deleted file mode 100644 index e051e49..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/CountDownL1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/CountDownL2ドル.class b/comxjtu/target/classes/com/java/concurrent/CountDownL2ドル.class deleted file mode 100644 index 2de1871..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/CountDownL2ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/CountDownL.class b/comxjtu/target/classes/com/java/concurrent/CountDownL.class deleted file mode 100644 index 3fe8cb3..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/CountDownL.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/CycliBarr1ドル.class b/comxjtu/target/classes/com/java/concurrent/CycliBarr1ドル.class deleted file mode 100644 index 56c1e75..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/CycliBarr1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/CycliBarr.class b/comxjtu/target/classes/com/java/concurrent/CycliBarr.class deleted file mode 100644 index dd02c2f..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/CycliBarr.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/MyTask.class b/comxjtu/target/classes/com/java/concurrent/MyTask.class deleted file mode 100644 index 84a4c80..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/MyTask.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication1ドル.class b/comxjtu/target/classes/com/java/concurrent/ThreadCommunication1ドル.class deleted file mode 100644 index d4b85ee..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication2ドル.class b/comxjtu/target/classes/com/java/concurrent/ThreadCommunication2ドル.class deleted file mode 100644 index e36521d..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication2ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication.class b/comxjtu/target/classes/com/java/concurrent/ThreadCommunication.class deleted file mode 100644 index 40f2289..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/ThreadCommunication.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/concurrent/ThreadPoolTest.class b/comxjtu/target/classes/com/java/concurrent/ThreadPoolTest.class deleted file mode 100644 index 218e586..0000000 Binary files a/comxjtu/target/classes/com/java/concurrent/ThreadPoolTest.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/Fanshe.class b/comxjtu/target/classes/com/java/other/Fanshe.class deleted file mode 100644 index 3e39f1a..0000000 Binary files a/comxjtu/target/classes/com/java/other/Fanshe.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/Hash.class b/comxjtu/target/classes/com/java/other/Hash.class deleted file mode 100644 index befd5f7..0000000 Binary files a/comxjtu/target/classes/com/java/other/Hash.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/LinkedHashMapTest.class b/comxjtu/target/classes/com/java/other/LinkedHashMapTest.class deleted file mode 100644 index cd9deb3..0000000 Binary files a/comxjtu/target/classes/com/java/other/LinkedHashMapTest.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/MyTask.class b/comxjtu/target/classes/com/java/other/MyTask.class deleted file mode 100644 index cf4b836..0000000 Binary files a/comxjtu/target/classes/com/java/other/MyTask.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/Student.class b/comxjtu/target/classes/com/java/other/Student.class deleted file mode 100644 index b16907d..0000000 Binary files a/comxjtu/target/classes/com/java/other/Student.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/Test.class b/comxjtu/target/classes/com/java/other/Test.class deleted file mode 100644 index 5ceb02b..0000000 Binary files a/comxjtu/target/classes/com/java/other/Test.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/TreeMapTest1ドル.class b/comxjtu/target/classes/com/java/other/TreeMapTest1ドル.class deleted file mode 100644 index f6387c3..0000000 Binary files a/comxjtu/target/classes/com/java/other/TreeMapTest1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/java/other/TreeMapTest.class b/comxjtu/target/classes/com/java/other/TreeMapTest.class deleted file mode 100644 index 769952f..0000000 Binary files a/comxjtu/target/classes/com/java/other/TreeMapTest.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/Question/Compare.class b/comxjtu/target/classes/com/leetcode/Question/Compare.class new file mode 100644 index 0000000..e9089d7 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/Compare.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/LC39.class b/comxjtu/target/classes/com/leetcode/Question/LC39.class new file mode 100644 index 0000000..c50a6a3 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/LC39.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/LC40.class b/comxjtu/target/classes/com/leetcode/Question/LC40.class new file mode 100644 index 0000000..7e823e0 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/LC40.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/ListNode.class b/comxjtu/target/classes/com/leetcode/Question/ListNode.class index 018a33d..eb953a1 100644 Binary files a/comxjtu/target/classes/com/leetcode/Question/ListNode.class and b/comxjtu/target/classes/com/leetcode/Question/ListNode.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/ValidParentheses.class b/comxjtu/target/classes/com/leetcode/Question/ValidParentheses.class index ff2492e..39266c8 100644 Binary files a/comxjtu/target/classes/com/leetcode/Question/ValidParentheses.class and b/comxjtu/target/classes/com/leetcode/Question/ValidParentheses.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc123.class b/comxjtu/target/classes/com/leetcode/Question/lc123.class new file mode 100644 index 0000000..dc1e9d1 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc123.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc130.class b/comxjtu/target/classes/com/leetcode/Question/lc130.class new file mode 100644 index 0000000..bad8756 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc130.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc131.class b/comxjtu/target/classes/com/leetcode/Question/lc131.class new file mode 100644 index 0000000..fd8bac4 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc131.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc171ドル.class b/comxjtu/target/classes/com/leetcode/Question/lc171ドル.class new file mode 100644 index 0000000..9a76694 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc171ドル.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc17.class b/comxjtu/target/classes/com/leetcode/Question/lc17.class new file mode 100644 index 0000000..dcbeac9 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc17.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc198.class b/comxjtu/target/classes/com/leetcode/Question/lc198.class new file mode 100644 index 0000000..2c4236b Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc198.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc200.class b/comxjtu/target/classes/com/leetcode/Question/lc200.class new file mode 100644 index 0000000..2d7c01e Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc200.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc213.class b/comxjtu/target/classes/com/leetcode/Question/lc213.class new file mode 100644 index 0000000..fa511da Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc213.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc216.class b/comxjtu/target/classes/com/leetcode/Question/lc216.class new file mode 100644 index 0000000..5b1c979 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc216.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc300.class b/comxjtu/target/classes/com/leetcode/Question/lc300.class new file mode 100644 index 0000000..0cba290 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc300.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc37.class b/comxjtu/target/classes/com/leetcode/Question/lc37.class new file mode 100644 index 0000000..e8dd744 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc37.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc401.class b/comxjtu/target/classes/com/leetcode/Question/lc401.class new file mode 100644 index 0000000..27b103c Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc401.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc417.class b/comxjtu/target/classes/com/leetcode/Question/lc417.class new file mode 100644 index 0000000..c2d84e6 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc417.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc438.class b/comxjtu/target/classes/com/leetcode/Question/lc438.class index 57d7469..63befd3 100644 Binary files a/comxjtu/target/classes/com/leetcode/Question/lc438.class and b/comxjtu/target/classes/com/leetcode/Question/lc438.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc46.class b/comxjtu/target/classes/com/leetcode/Question/lc46.class new file mode 100644 index 0000000..a6b3b1a Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc46.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc47.class b/comxjtu/target/classes/com/leetcode/Question/lc47.class new file mode 100644 index 0000000..8536651 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc47.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc51.class b/comxjtu/target/classes/com/leetcode/Question/lc51.class new file mode 100644 index 0000000..6094375 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc51.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc52.class b/comxjtu/target/classes/com/leetcode/Question/lc52.class new file mode 100644 index 0000000..4a76d25 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc52.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc71.class b/comxjtu/target/classes/com/leetcode/Question/lc71.class index e6a468d..165f924 100644 Binary files a/comxjtu/target/classes/com/leetcode/Question/lc71.class and b/comxjtu/target/classes/com/leetcode/Question/lc71.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc78.class b/comxjtu/target/classes/com/leetcode/Question/lc78.class new file mode 100644 index 0000000..131b2d2 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc78.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc79.class b/comxjtu/target/classes/com/leetcode/Question/lc79.class new file mode 100644 index 0000000..02b4146 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc79.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc90.class b/comxjtu/target/classes/com/leetcode/Question/lc90.class new file mode 100644 index 0000000..30ff399 Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc90.class differ diff --git a/comxjtu/target/classes/com/leetcode/Question/lc93.class b/comxjtu/target/classes/com/leetcode/Question/lc93.class new file mode 100644 index 0000000..3ae975f Binary files /dev/null and b/comxjtu/target/classes/com/leetcode/Question/lc93.class differ diff --git a/comxjtu/target/classes/com/leetcode/base/Back.class b/comxjtu/target/classes/com/leetcode/base/Back.class deleted file mode 100644 index 9c32233..0000000 Binary files a/comxjtu/target/classes/com/leetcode/base/Back.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/base/Codec.class b/comxjtu/target/classes/com/leetcode/base/Codec.class deleted file mode 100644 index 73a0e86..0000000 Binary files a/comxjtu/target/classes/com/leetcode/base/Codec.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/base/Link.class b/comxjtu/target/classes/com/leetcode/base/Link.class deleted file mode 100644 index 0300df8..0000000 Binary files a/comxjtu/target/classes/com/leetcode/base/Link.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/base/MyLinkedList.class b/comxjtu/target/classes/com/leetcode/base/MyLinkedList.class deleted file mode 100644 index 360f10c..0000000 Binary files a/comxjtu/target/classes/com/leetcode/base/MyLinkedList.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/base/Tree$Command.class b/comxjtu/target/classes/com/leetcode/base/Tree$Command.class index 8ed038e..787d689 100644 Binary files a/comxjtu/target/classes/com/leetcode/base/Tree$Command.class and b/comxjtu/target/classes/com/leetcode/base/Tree$Command.class differ diff --git a/comxjtu/target/classes/com/leetcode/base/Tree$TreeLinkNode.class b/comxjtu/target/classes/com/leetcode/base/Tree$TreeLinkNode.class index 10fa399..8f5d6b7 100644 Binary files a/comxjtu/target/classes/com/leetcode/base/Tree$TreeLinkNode.class and b/comxjtu/target/classes/com/leetcode/base/Tree$TreeLinkNode.class differ diff --git a/comxjtu/target/classes/com/leetcode/base/Tree$TreeNode.class b/comxjtu/target/classes/com/leetcode/base/Tree$TreeNode.class index 948a7e1..5207180 100644 Binary files a/comxjtu/target/classes/com/leetcode/base/Tree$TreeNode.class and b/comxjtu/target/classes/com/leetcode/base/Tree$TreeNode.class differ diff --git a/comxjtu/target/classes/com/leetcode/base/Tree.class b/comxjtu/target/classes/com/leetcode/base/Tree.class index 184b612..8564810 100644 Binary files a/comxjtu/target/classes/com/leetcode/base/Tree.class and b/comxjtu/target/classes/com/leetcode/base/Tree.class differ diff --git a/comxjtu/target/classes/com/leetcode/base/TreeNode.class b/comxjtu/target/classes/com/leetcode/base/TreeNode.class index 57a0c52..af64aeb 100644 Binary files a/comxjtu/target/classes/com/leetcode/base/TreeNode.class and b/comxjtu/target/classes/com/leetcode/base/TreeNode.class differ diff --git a/comxjtu/target/classes/com/leetcode/middle/Backpacking.class b/comxjtu/target/classes/com/leetcode/middle/Backpacking.class deleted file mode 100644 index 59660d2..0000000 Binary files a/comxjtu/target/classes/com/leetcode/middle/Backpacking.class and /dev/null differ diff --git a/comxjtu/target/classes/com/leetcode/middle/DP.class b/comxjtu/target/classes/com/leetcode/middle/DP.class index 9868a9c..e82384d 100644 Binary files a/comxjtu/target/classes/com/leetcode/middle/DP.class and b/comxjtu/target/classes/com/leetcode/middle/DP.class differ diff --git a/comxjtu/target/classes/com/leetcode/middle/Link$ListNode.class b/comxjtu/target/classes/com/leetcode/middle/Link$ListNode.class index b0b6af2..1adf8c5 100644 Binary files a/comxjtu/target/classes/com/leetcode/middle/Link$ListNode.class and b/comxjtu/target/classes/com/leetcode/middle/Link$ListNode.class differ diff --git a/comxjtu/target/classes/com/leetcode/primary/DP.class b/comxjtu/target/classes/com/leetcode/primary/DP.class index 22695c4..8d37772 100644 Binary files a/comxjtu/target/classes/com/leetcode/primary/DP.class and b/comxjtu/target/classes/com/leetcode/primary/DP.class differ diff --git a/comxjtu/target/classes/com/liulishuo/Main.class b/comxjtu/target/classes/com/liulishuo/Main.class deleted file mode 100644 index 291c017..0000000 Binary files a/comxjtu/target/classes/com/liulishuo/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/netease/Dict.class b/comxjtu/target/classes/com/netease/Dict.class deleted file mode 100644 index 69d93c9..0000000 Binary files a/comxjtu/target/classes/com/netease/Dict.class and /dev/null differ diff --git a/comxjtu/target/classes/com/netease/Main.class b/comxjtu/target/classes/com/netease/Main.class deleted file mode 100644 index a8f06bb..0000000 Binary files a/comxjtu/target/classes/com/netease/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/netease/Max.class b/comxjtu/target/classes/com/netease/Max.class deleted file mode 100644 index cd9b97b..0000000 Binary files a/comxjtu/target/classes/com/netease/Max.class and /dev/null differ diff --git a/comxjtu/target/classes/com/netease/Nod.class b/comxjtu/target/classes/com/netease/Nod.class deleted file mode 100644 index ced1fb0..0000000 Binary files a/comxjtu/target/classes/com/netease/Nod.class and /dev/null differ diff --git a/comxjtu/target/classes/com/netease/Tower.class b/comxjtu/target/classes/com/netease/Tower.class deleted file mode 100644 index 3b26876..0000000 Binary files a/comxjtu/target/classes/com/netease/Tower.class and /dev/null differ diff --git a/comxjtu/target/classes/com/neteaseO/Main.class b/comxjtu/target/classes/com/neteaseO/Main.class deleted file mode 100644 index 1ffa761..0000000 Binary files a/comxjtu/target/classes/com/neteaseO/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/neteaseO/Main3.class b/comxjtu/target/classes/com/neteaseO/Main3.class deleted file mode 100644 index d8ecfd8..0000000 Binary files a/comxjtu/target/classes/com/neteaseO/Main3.class and /dev/null differ diff --git a/comxjtu/target/classes/com/sensetime/Main.class b/comxjtu/target/classes/com/sensetime/Main.class deleted file mode 100644 index 64ec653..0000000 Binary files a/comxjtu/target/classes/com/sensetime/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xiaohongshu/Main.class b/comxjtu/target/classes/com/xiaohongshu/Main.class deleted file mode 100644 index 6689122..0000000 Binary files a/comxjtu/target/classes/com/xiaohongshu/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xiaohongshu/Main2.class b/comxjtu/target/classes/com/xiaohongshu/Main2.class deleted file mode 100644 index 28d1e2a..0000000 Binary files a/comxjtu/target/classes/com/xiaohongshu/Main2.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xiaomi/Main.class b/comxjtu/target/classes/com/xiaomi/Main.class deleted file mode 100644 index 0e84a6d..0000000 Binary files a/comxjtu/target/classes/com/xiaomi/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/Test.class b/comxjtu/target/classes/com/xjtu/Test.class deleted file mode 100644 index 7c3d775..0000000 Binary files a/comxjtu/target/classes/com/xjtu/Test.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/BinarySearch.class b/comxjtu/target/classes/com/xjtu/ch1/BinarySearch.class deleted file mode 100644 index c76fde3..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/BinarySearch.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/Evaluate.class b/comxjtu/target/classes/com/xjtu/ch1/Evaluate.class deleted file mode 100644 index 2e0e7c4..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/Evaluate.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack1ドル.class b/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack1ドル.class deleted file mode 100644 index 5eed4e6..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack$ListIterator.class b/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack$ListIterator.class deleted file mode 100644 index 3af0b3e..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack$ListIterator.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack.class b/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack.class deleted file mode 100644 index e9585f3..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/ResizingArrayStack.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/Stack1ドル.class b/comxjtu/target/classes/com/xjtu/ch1/Stack1ドル.class deleted file mode 100644 index 905589c..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/Stack1ドル.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/Stack$ListIterator.class b/comxjtu/target/classes/com/xjtu/ch1/Stack$ListIterator.class deleted file mode 100644 index 3ccf10c..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/Stack$ListIterator.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/Stack$Node.class b/comxjtu/target/classes/com/xjtu/ch1/Stack$Node.class deleted file mode 100644 index a0cc8e5..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/Stack$Node.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/Stack.class b/comxjtu/target/classes/com/xjtu/ch1/Stack.class deleted file mode 100644 index 1725756..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/Stack.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch1/ThreeSumFast.class b/comxjtu/target/classes/com/xjtu/ch1/ThreeSumFast.class deleted file mode 100644 index ac22e08..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch1/ThreeSumFast.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/BaseSort.class b/comxjtu/target/classes/com/xjtu/ch2/BaseSort.class deleted file mode 100644 index 6ec6589..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/BaseSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/HeapSort.class b/comxjtu/target/classes/com/xjtu/ch2/HeapSort.class deleted file mode 100644 index 06048a5..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/HeapSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/InsertSort.class b/comxjtu/target/classes/com/xjtu/ch2/InsertSort.class deleted file mode 100644 index 86198bc..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/InsertSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/MaxPQ.class b/comxjtu/target/classes/com/xjtu/ch2/MaxPQ.class deleted file mode 100644 index 71d87ec..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/MaxPQ.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/MergeBUSort.class b/comxjtu/target/classes/com/xjtu/ch2/MergeBUSort.class deleted file mode 100644 index c531e5d..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/MergeBUSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/MergeSort.class b/comxjtu/target/classes/com/xjtu/ch2/MergeSort.class deleted file mode 100644 index bed47d8..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/MergeSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/Quick3waySort.class b/comxjtu/target/classes/com/xjtu/ch2/Quick3waySort.class deleted file mode 100644 index 2d187fa..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/Quick3waySort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/QuickSort.class b/comxjtu/target/classes/com/xjtu/ch2/QuickSort.class deleted file mode 100644 index 21f443a..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/QuickSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/SelectionSort.class b/comxjtu/target/classes/com/xjtu/ch2/SelectionSort.class deleted file mode 100644 index e4aca38..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/SelectionSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch2/ShellSort.class b/comxjtu/target/classes/com/xjtu/ch2/ShellSort.class deleted file mode 100644 index 5adb4b9..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch2/ShellSort.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch3/BST$Node.class b/comxjtu/target/classes/com/xjtu/ch3/BST$Node.class deleted file mode 100644 index 19d9b8d..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch3/BST$Node.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch3/BST.class b/comxjtu/target/classes/com/xjtu/ch3/BST.class deleted file mode 100644 index 7bc61ae..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch3/BST.class and /dev/null differ diff --git a/comxjtu/target/classes/com/xjtu/ch3/BinarySearchST.class b/comxjtu/target/classes/com/xjtu/ch3/BinarySearchST.class deleted file mode 100644 index 2818299..0000000 Binary files a/comxjtu/target/classes/com/xjtu/ch3/BinarySearchST.class and /dev/null differ diff --git a/comxjtu/target/classes/com/yuanjing/Main.class b/comxjtu/target/classes/com/yuanjing/Main.class deleted file mode 100644 index 1cc5a1f..0000000 Binary files a/comxjtu/target/classes/com/yuanjing/Main.class and /dev/null differ diff --git a/comxjtu/target/classes/com/yuanjing/Solution.class b/comxjtu/target/classes/com/yuanjing/Solution.class deleted file mode 100644 index 2e0e94e..0000000 Binary files a/comxjtu/target/classes/com/yuanjing/Solution.class and /dev/null differ diff --git a/comxjtu/target/classes/interview/common/Node.class b/comxjtu/target/classes/interview/common/Node.class deleted file mode 100644 index 1508a92..0000000 Binary files a/comxjtu/target/classes/interview/common/Node.class and /dev/null differ diff --git a/comxjtu/target/classes/interview/loop/BinarySearch.class b/comxjtu/target/classes/interview/loop/BinarySearch.class deleted file mode 100644 index d8f3826..0000000 Binary files a/comxjtu/target/classes/interview/loop/BinarySearch.class and /dev/null differ diff --git a/comxjtu/target/classes/interview/loop/LinkedListDelete.class b/comxjtu/target/classes/interview/loop/LinkedListDelete.class deleted file mode 100644 index 5bf64ce..0000000 Binary files a/comxjtu/target/classes/interview/loop/LinkedListDelete.class and /dev/null differ diff --git a/comxjtu/target/classes/interview/recursion/LinkedListCreator.class b/comxjtu/target/classes/interview/recursion/LinkedListCreator.class deleted file mode 100644 index c70e56c..0000000 Binary files a/comxjtu/target/classes/interview/recursion/LinkedListCreator.class and /dev/null differ diff --git a/comxjtu/target/classes/interview/recursion/LinkedListReverse.class b/comxjtu/target/classes/interview/recursion/LinkedListReverse.class deleted file mode 100644 index 0145dc5..0000000 Binary files a/comxjtu/target/classes/interview/recursion/LinkedListReverse.class and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sensetime/345円212円240円347円202円271円.jpg" "b/comxjtu/target/classes/main/java/com/sensetime/345円212円240円347円202円271円.jpg" deleted file mode 100644 index b764377..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sensetime/345円212円240円347円202円271円.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sensetime/346円212円242円347円241円254円345円270円201円.jpg" "b/comxjtu/target/classes/main/java/com/sensetime/346円212円242円347円241円254円345円270円201円.jpg" deleted file mode 100644 index 0edf92f..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sensetime/346円212円242円347円241円254円345円270円201円.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sensetime/350円265円260円350円277円267円345円256円253円.jpg" "b/comxjtu/target/classes/main/java/com/sensetime/350円265円260円350円277円267円345円256円253円.jpg" deleted file mode 100644 index 84e582f..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sensetime/350円265円260円350円277円267円345円256円253円.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185258.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185258.jpg" deleted file mode 100644 index 614c3a4..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185258.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852581.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852581.jpg" deleted file mode 100644 index 17b9712..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852581.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852582.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852582.jpg" deleted file mode 100644 index 0e77e79..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201852582.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185324.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185324.jpg" deleted file mode 100644 index 614c3a4..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185324.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185325.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185325.jpg" deleted file mode 100644 index 17b9712..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185325.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853251.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853251.jpg" deleted file mode 100644 index 0e77e79..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853251.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185349.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185349.jpg" deleted file mode 100644 index 614c3a4..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185349.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853491.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853491.jpg" deleted file mode 100644 index 17b9712..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853491.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853492.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853492.jpg" deleted file mode 100644 index 0e77e79..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853492.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853493.jpg" "b/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853493.jpg" deleted file mode 100644 index 7cde816..0000000 Binary files "a/comxjtu/target/classes/main/java/com/sougou/345円276円256円344円277円241円345円233円276円347円211円207円_201809201853493.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185609.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185609.jpg" deleted file mode 100644 index b07947d..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_20180920185609.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856091.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856091.jpg" deleted file mode 100644 index b51e6a2..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856091.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856092.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856092.jpg" deleted file mode 100644 index e9c3332..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856092.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856093.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856093.jpg" deleted file mode 100644 index 24d4154..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856093.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856094.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856094.jpg" deleted file mode 100644 index 7b9f6c1..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856094.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856095.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856095.jpg" deleted file mode 100644 index 674e239..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856095.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856096.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856096.jpg" deleted file mode 100644 index 7eecf03..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856096.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856097.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856097.jpg" deleted file mode 100644 index e7ead57..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856097.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856098.jpg" "b/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856098.jpg" deleted file mode 100644 index bd71e98..0000000 Binary files "a/comxjtu/target/classes/main/java/com/tecent&other/345円276円256円344円277円241円345円233円276円347円211円207円_201809201856098.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200816.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200816.jpg" deleted file mode 100644 index 1f297ac..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200816.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202008161.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202008161.jpg" deleted file mode 100644 index c1a2420..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202008161.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200911.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200911.jpg" deleted file mode 100644 index 1f297ac..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_20180920200911.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009111.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009111.jpg" deleted file mode 100644 index c1a2420..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009111.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009112.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009112.jpg" deleted file mode 100644 index 6e3937c..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009112.jpg" and /dev/null differ diff --git "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009113.jpg" "b/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009113.jpg" deleted file mode 100644 index 8ca20fd..0000000 Binary files "a/comxjtu/target/classes/main/java/com/xiaomi/345円276円256円344円277円241円345円233円276円347円211円207円_201809202009113.jpg" and /dev/null differ diff --git a/comxjtu/target/classes/power/Entity/AbstractMember.class b/comxjtu/target/classes/power/Entity/AbstractMember.class deleted file mode 100644 index 086b0c6..0000000 Binary files a/comxjtu/target/classes/power/Entity/AbstractMember.class and /dev/null differ diff --git a/comxjtu/target/classes/power/Simulation.class b/comxjtu/target/classes/power/Simulation.class deleted file mode 100644 index 0f0ccd5..0000000 Binary files a/comxjtu/target/classes/power/Simulation.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/CountSayTest.class b/comxjtu/target/classes/test/com/leetcode/Question/CountSayTest.class deleted file mode 100644 index 3a121a7..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/CountSayTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/MergeTwoListsTest.class b/comxjtu/target/classes/test/com/leetcode/Question/MergeTwoListsTest.class deleted file mode 100644 index e1dff8d..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/MergeTwoListsTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/RemoveDuplicateTest.class b/comxjtu/target/classes/test/com/leetcode/Question/RemoveDuplicateTest.class deleted file mode 100644 index 6a67755..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/RemoveDuplicateTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/SearchInsertTest.class b/comxjtu/target/classes/test/com/leetcode/Question/SearchInsertTest.class deleted file mode 100644 index e9a0c02..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/SearchInsertTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/ThreeSumTest.class b/comxjtu/target/classes/test/com/leetcode/Question/ThreeSumTest.class deleted file mode 100644 index 6b48d7f..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/ThreeSumTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/TwoAdd2Test.class b/comxjtu/target/classes/test/com/leetcode/Question/TwoAdd2Test.class deleted file mode 100644 index 1a68091..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/TwoAdd2Test.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/TwoAddTest.class b/comxjtu/target/classes/test/com/leetcode/Question/TwoAddTest.class deleted file mode 100644 index 9a241bb..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/TwoAddTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/TwoSumSolutionTest.class b/comxjtu/target/classes/test/com/leetcode/Question/TwoSumSolutionTest.class deleted file mode 100644 index 3e09118..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/TwoSumSolutionTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/ValidParenthesesTest.class b/comxjtu/target/classes/test/com/leetcode/Question/ValidParenthesesTest.class deleted file mode 100644 index 90ca361..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/ValidParenthesesTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/Question/isPalindromeTest.class b/comxjtu/target/classes/test/com/leetcode/Question/isPalindromeTest.class deleted file mode 100644 index 4a8370e..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/Question/isPalindromeTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/base/InverseArrayTest.class b/comxjtu/target/classes/test/com/leetcode/base/InverseArrayTest.class deleted file mode 100644 index f862d50..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/base/InverseArrayTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/primary/MoveZeroesTest.class b/comxjtu/target/classes/test/com/leetcode/primary/MoveZeroesTest.class deleted file mode 100644 index fd6e7c1..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/primary/MoveZeroesTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/primary/RotateTest.class b/comxjtu/target/classes/test/com/leetcode/primary/RotateTest.class deleted file mode 100644 index 07743fc..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/primary/RotateTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/leetcode/primary/StringsTest.class b/comxjtu/target/classes/test/com/leetcode/primary/StringsTest.class deleted file mode 100644 index df33061..0000000 Binary files a/comxjtu/target/classes/test/com/leetcode/primary/StringsTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/com/xjtu/ch1/ThreeSumFastTest.class b/comxjtu/target/classes/test/com/xjtu/ch1/ThreeSumFastTest.class deleted file mode 100644 index 48f3997..0000000 Binary files a/comxjtu/target/classes/test/com/xjtu/ch1/ThreeSumFastTest.class and /dev/null differ diff --git a/comxjtu/target/classes/test/coom/xjtu/ch2/SelectionSortTest.class b/comxjtu/target/classes/test/coom/xjtu/ch2/SelectionSortTest.class deleted file mode 100644 index 5ae577c..0000000 Binary files a/comxjtu/target/classes/test/coom/xjtu/ch2/SelectionSortTest.class and /dev/null differ diff --git a/readme.md b/readme.md index 2c244ed..8acd731 100644 --- a/readme.md +++ b/readme.md @@ -1,32 +1,35 @@ -remember to push and merge +# 互联网公司JAVA笔试题总结+leetcode按算法与数据结构类型总结+java面试知识(包括高并发知识) -# 2019�����л�������˾JAVA�������ܽ�+leetcode���㷨�����ݽṹ�����ܽ�+java����֪ʁ - -д��readme�����Ķ��ɣ�ϣ���ܰ�����һЩ��~~~ +写个简短的readme方便阅读吧,希望能帮助到一些人~~~ * * * * * -## L·1⁄4�ṹ -1. com���μĻ����ǰ��չ�˾���ֽ��з����ı����⣬������������\[����������]����Щ��L·û�����ü�д��ֻ�Ǽ���д��˼·. -2. com.java���μ�������һЩ���ԣ����磺 -concurrent�����������ಢ���е�ԭ���ࡢCountDownLatch���̳߳صȣ� -DesignPatterns������ģʽ��ֻɻ���˾������ļ�ͬ�����İ�ȫ����ģʽ�͹�������ģʽ; -other������һЩ�������䡢Dijkstra�ȣ� -3. com.leetcode������s��leetcodeCN��L·�Ĵ𰸣� -* Question�����ǰ�����L·�ı��Ż��������������ģ� -* base�����ǰ���[leetcode-CN���ݽṹר��](https://leetcode-cn.com/explore/learn/) �ܽ���һЩ���룬�����������ַ��������� -* primary��middle��senior���ǰ���[leetcode-CN�����㷨ר��](https://leetcode-cn.com/explore/interview/) �ܽ���һЩ���룻 - * ���У�primary��[�����㷨](https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/) �� - * middle��[�м��㷨](https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/) �� - * senior��[�߼��㷨](https://leetcode-cn.com/explore/interview/card/top-interview-questions-hard/) ; -* ���ò�˵һ�£���������ר���ܽ�����Щ** ���ĺܺ�** �����ҿ��Զ࿴�����ڻ���ͨ�� -4. com.xjtu�������Լ����� **�㷨����4�棩** ��д��һЩ�������ֲ��ҡ������ȵ�һЩ���롣 +## 目录结构 +1. com.company包下的基本是按照公司名字进行分类的笔试题,个人能力有限\[ ̄□ ̄||],有些题目没有来得及写,只是简单写了思路. +2. com.leetcode包下是刷的leetcodeCN题目的答案: + * Question包下是按照题目的编号或者名称来整理的; + * base包下是按照[leetcode-CN数据结构专题](https://leetcode-cn.com/explore/learn/) 总结的一些代码,包括数组和字符串、树和链表; + * primary、middle、senior包是按照[leetcode-CN面试算法专题](https://leetcode-cn.com/explore/interview/) 总结的一些代码; + * 其中,primary是[初级算法](https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/) ; + * middle是[中级算法](https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/) ; + * senior是[高级算法](https://leetcode-cn.com/explore/interview/card/top-interview-questions-hard/) ; + * everyday包下为leetcode上的每日一题。 + * 不得不说一下,力扣网按专题总结的这些**真的很好** ,大家可以多看看,融会贯通。 + +3. com.interview包下是递归和循环控制的实例 +4. com.concurrency包为Java并发相关的程序,具体内容移植到springBoot项目,参见[并发面试基础](https://github.com/JayVae/concurrencyLearning) +5. com.algorithom4包下是自己跟着 **算法(第4版)** 来写的一些包括二分查找、排序等的一些代码。 +6. com.javaBasic包下的是做的一些测试,比如: + * concurrent包下是试验多并发中的原子类、CountDownLatch、线程池等; + * DesignPatterns是设计模式,分别按照创建型、结构型、行为型进行了实现; + * other包下是一些包括反射、Dijkstra等; + * * * * * -## ���� -���⣬�Լ�Ҳ�ڲ����жԳ��õ��㷨�����ݽṹ�����˱ʼ��ܽᣬ����Ҳ���Բο��ο�[java�����㷨�ܽ�](https://jayvae.github.io/categories/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95/)�� -L·1⁄4���£� -![�����㷨�ܽ�L·1⁄4](https://raw.githubusercontent.com/JayVae/pictures/master/res/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93%E5%88%86%E7%B1%BB1.jpg) +## 其他 +另外,自己也在博客中对常用的算法与数据结构进行了笔记总结,大家也可以参考参考[java面试算法总结](https://jayvae.github.io/categories/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95/), +目录如下: +![面试算法总结目录](https://raw.githubusercontent.com/JayVae/pictures/master/res/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93%E5%88%86%E7%B1%BB1.jpg) -![�����㷨�ܽ�L·1⁄4](https://raw.githubusercontent.com/JayVae/pictures/master/res/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%932.jpg) +![面试算法总结目录](https://raw.githubusercontent.com/JayVae/pictures/master/res/%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%932.jpg) * * * * * -���ڸ����������ޣ������⻹�벻�ߴͽ̡�O(��_��)O����~ \ No newline at end of file +由于个人能力有限,有问题还请不吝赐教。O(∩_∩)O哈哈~ \ No newline at end of file

AltStyle によって変換されたページ (->オリジナル) /