新增设计模式和算法题目
- 添加了抽象工厂模式、适配器模式、桥接模式、建造者模式、组合模式、装饰器模式、享元模式、外观模式和工厂方法模式的实现 - 新增了交替打印、LeetCode算法题目(包括LCS、最长递增子序列、子序列判断、矩阵最长公共子数组等)的实现 - 优化了Semaphore实现的交替打印程序 Default Changelist AbstractFactoryPattern.java AdapterPattern.java Alternate_printing.java BridgingPattern.java BuildPattern.java ComboPattern.java DecoratorPattern.java EnjoyPattern.java FacadePattern.java FactoryMethodPattern.java FunctionInterfaceDemo.java FunctionInterfaceDemo.java LCR155.java LCR186.java LeetCode115.java LeetCode155.java LeetCode230.java LeetCode300.java LeetCode392.java LeetCode718.java LeetCode912.java PrototypePattern.java ProxyPattern.java rustDesk.yaml SocketDemo.java SpringFactoryBean.java ThreadConnect.java
This commit is contained in:
parent
00672efdc8
commit
355ac33a49
@ -1,4 +1,5 @@
|
|||||||
package cn.whaifree.designPattern;
|
package cn.whaifree.designPattern.kama.CreateType.AbstractFactoryPattern;
|
||||||
|
|
||||||
|
|
||||||
public class AbstractFactoryPattern {
|
public class AbstractFactoryPattern {
|
||||||
|
|
||||||
@ -60,12 +61,12 @@ class ModernChair implements Chair{
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
interface AbstractFactory{
|
interface AbstractFactory{
|
||||||
Sofa generateSofa();
|
Sofa generateSofa();
|
||||||
Chair generateChair();
|
Chair generateChair();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 现代工厂可以创建多种商品
|
||||||
class ModernFactory implements AbstractFactory {
|
class ModernFactory implements AbstractFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -0,0 +1,93 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.CreateType.BuildPattern;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 构造器模式,
|
||||||
|
* public BCycle build() {
|
||||||
|
* return new BCycle(this);
|
||||||
|
* }
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 18:18
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class BuildPattern {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
int i = scanner.nextInt();
|
||||||
|
for (int i1 = 0; i1 < i; i1++) {
|
||||||
|
String next = scanner.next();
|
||||||
|
BCycle bCycle = RoadType.getBCycle(next);
|
||||||
|
System.out.println(bCycle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum RoadType{
|
||||||
|
MOUNTAIN("mountain",BCycle.newBuilder().setFrame("Aluminum Frame").setTries("Knobby Tires").build()),
|
||||||
|
ROAD("road",BCycle.newBuilder().setFrame("Carbon Frame").setTries("Slim Tires").build());
|
||||||
|
|
||||||
|
String key;
|
||||||
|
BCycle bCycle;
|
||||||
|
|
||||||
|
RoadType(String road, BCycle build) {
|
||||||
|
this.key = road;
|
||||||
|
this.bCycle = build;
|
||||||
|
}
|
||||||
|
public static BCycle getBCycle(String key){
|
||||||
|
for (RoadType roadType : RoadType.values()) {
|
||||||
|
if(roadType.key.equals(key)){
|
||||||
|
return roadType.bCycle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BCycle{
|
||||||
|
private String frame;
|
||||||
|
private String tires;
|
||||||
|
|
||||||
|
public BCycle(Builder builder) {
|
||||||
|
this.frame = builder.frame;
|
||||||
|
this.tires = builder.tires;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Builder newBuilder(){
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static class Builder{
|
||||||
|
|
||||||
|
private String frame;
|
||||||
|
private String tires;
|
||||||
|
|
||||||
|
public BCycle build() {
|
||||||
|
return new BCycle(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setFrame(String frame) {
|
||||||
|
this.frame = frame;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setTries(String tries) {
|
||||||
|
this.tires = tries;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return frame + " " + tires;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,132 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.CreateType.FactoryMethodPattern;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 工厂方法模式
|
||||||
|
*
|
||||||
|
* 工厂方法模式
|
||||||
|
* 单一产品:工厂方法模式主要用于创建单一类型的产品。它定义了一个创建对象的接口,但允许子类决定实例化哪一个类。
|
||||||
|
* 单一责任原则:工厂方法模式中的工厂类只负责创建一种产品。
|
||||||
|
*
|
||||||
|
* 扩展性:当需要增加新的产品时,需要新增具体的工厂类。
|
||||||
|
* 代码结构:
|
||||||
|
* 定义一个创建产品的接口。
|
||||||
|
* 具体工厂实现这个接口来创建对应的具体产品。
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 抽象工厂模式
|
||||||
|
* 产品族:抽象工厂模式用于创建一组相关或依赖的对象(即产品族),而无需指定它们具体的类。
|
||||||
|
* 多产品:一个工厂可以创建多个相关的对象。
|
||||||
|
* 扩展性:当需要增加新的产品族时,需要新增具体的工厂类;但当需要增加新的产品种类时,不需要修改现有的工厂类。
|
||||||
|
* 代码结构:
|
||||||
|
* 定义一个创建一系列相关产品的接口。
|
||||||
|
* 具体工厂实现这个接口来创建对应的一系列具体产品。
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 16:28
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class FactoryMethodPattern {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
int i = scanner.nextInt();
|
||||||
|
for (int i1 = 0; i1 < i; i1++) {
|
||||||
|
String next = scanner.next();
|
||||||
|
int j = scanner.nextInt();
|
||||||
|
// for (int i2 = 0; i2 < j; i2++) {
|
||||||
|
// Context.getFactory(next).produce();
|
||||||
|
// }
|
||||||
|
for (int k = 0; k < j; k++) {
|
||||||
|
FactoryContext.getiFactory(next).produce();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
enum FactoryContext {
|
||||||
|
Circle("Circle", new CircleFactory()),
|
||||||
|
Square("Square", new SquareFactory()),
|
||||||
|
;
|
||||||
|
|
||||||
|
String name;
|
||||||
|
IFactory iFactory;
|
||||||
|
|
||||||
|
FactoryContext(String name, IFactory iFactory) {
|
||||||
|
this.name = name;
|
||||||
|
this.iFactory = iFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IFactory getiFactory(String key) {
|
||||||
|
for (FactoryContext value : values()) {
|
||||||
|
if (value.name.equals(key)) {
|
||||||
|
return value.iFactory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Context{
|
||||||
|
static Map<String, IFactory> map = new HashMap<>();
|
||||||
|
static {
|
||||||
|
map.put("Circle", new CircleFactory());
|
||||||
|
map.put("Square", new SquareFactory());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IFactory getFactory(String key){
|
||||||
|
if (map.containsKey(key)) {
|
||||||
|
return map.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new IFactory() {
|
||||||
|
@Override
|
||||||
|
public Shape produce() {
|
||||||
|
System.out.println("No Factory");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Shape{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Circle extends Shape{
|
||||||
|
|
||||||
|
}
|
||||||
|
class Square extends Shape{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IFactory{
|
||||||
|
Shape produce();
|
||||||
|
}
|
||||||
|
|
||||||
|
class CircleFactory implements IFactory{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Shape produce() {
|
||||||
|
System.out.println("Circle Block");
|
||||||
|
return new Circle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SquareFactory implements IFactory{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Shape produce() {
|
||||||
|
System.out.println("Square Block");
|
||||||
|
return new Square();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.CreateType.PrototypePattern;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 18:35
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class PrototypePattern {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws CloneNotSupportedException {
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
String color = scanner.next();
|
||||||
|
int height = scanner.nextInt();
|
||||||
|
int width = scanner.nextInt();
|
||||||
|
int num = scanner.nextInt();
|
||||||
|
Shape shape = new Shape(color, width, height);
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
System.out.println(shape.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Shape implements Cloneable{
|
||||||
|
String color;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
// Color: Red, Width: 10, Height: 5
|
||||||
|
return "Color: " + color + ", Width: " + width + ", Height: " + height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Shape(String color, int width, int height) {
|
||||||
|
this.color = color;
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Shape clone() throws CloneNotSupportedException {
|
||||||
|
return (Shape) super.clone();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.AdapterPattern;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 18:58
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class AdapterPattern {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
USBAdapter usbAdapter = new USBAdapter();
|
||||||
|
|
||||||
|
Computer computer = new Computer();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
int i = scanner.nextInt();
|
||||||
|
for (int i1 = 0; i1 < i; i1++) {
|
||||||
|
int i2 = scanner.nextInt();
|
||||||
|
if (i2 == 1) {
|
||||||
|
System.out.println(computer.inject(new TypeCInterface()));
|
||||||
|
}else if (i2 == 2){
|
||||||
|
USBInterface usbInterface = new USBInterface(); // USB接口
|
||||||
|
TypeCInterface adapt = usbAdapter.adapt(usbInterface);// 适配器转换为TypeC
|
||||||
|
System.out.println(computer.inject(adapt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Computer{
|
||||||
|
|
||||||
|
public String inject(TypeCInterface in) {
|
||||||
|
return in.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Interface{
|
||||||
|
String data;
|
||||||
|
}
|
||||||
|
|
||||||
|
class USBAdapter {
|
||||||
|
|
||||||
|
public TypeCInterface adapt(USBInterface usbInterface) {
|
||||||
|
return new TypeCInterface(usbInterface.data + " Adapter");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class USBInterface extends TypeCInterface {
|
||||||
|
public USBInterface() {
|
||||||
|
this.data = "USB";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class TypeCInterface extends Interface {
|
||||||
|
|
||||||
|
public TypeCInterface() {
|
||||||
|
this.data = "TypeC";
|
||||||
|
}
|
||||||
|
public TypeCInterface(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.BridgingPattern;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 18:36
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class BridgingPattern {
|
||||||
|
|
||||||
|
interface TEL{
|
||||||
|
public void showBrand();
|
||||||
|
}
|
||||||
|
static class Sony implements TEL{
|
||||||
|
public void showBrand(){
|
||||||
|
System.out.print("Sony TV");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static class TCL implements TEL{
|
||||||
|
public void showBrand(){
|
||||||
|
System.out.print("TCL TV");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static abstract class Operation{
|
||||||
|
protected TEL tel;
|
||||||
|
|
||||||
|
public void setTel(TEL tel){
|
||||||
|
this.tel = tel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void operation();
|
||||||
|
}
|
||||||
|
static class Open extends Operation{
|
||||||
|
public void operation(){
|
||||||
|
tel.showBrand();
|
||||||
|
System.out.println(" is ON");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static class Close extends Operation{
|
||||||
|
public void operation(){
|
||||||
|
tel.showBrand();
|
||||||
|
System.out.println(" is OFF");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static class Switch extends Operation{
|
||||||
|
public void operation(){
|
||||||
|
System.out.print("Switching ");
|
||||||
|
tel.showBrand();
|
||||||
|
System.out.println(" channel");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Main{
|
||||||
|
public static void main (String[] args) {
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
int nums = sc.nextInt();
|
||||||
|
TEL tel;
|
||||||
|
Operation opera;
|
||||||
|
while(nums-- > 0){
|
||||||
|
int type = sc.nextInt();
|
||||||
|
int move = sc.nextInt();
|
||||||
|
if(type == 0){
|
||||||
|
tel = new Sony();
|
||||||
|
}else{
|
||||||
|
tel = new TCL();
|
||||||
|
}
|
||||||
|
if(move == 2){
|
||||||
|
opera = new Open();
|
||||||
|
opera.setTel(tel);
|
||||||
|
opera.operation();
|
||||||
|
}else if(move == 3){
|
||||||
|
opera = new Close();
|
||||||
|
opera.setTel(tel);
|
||||||
|
opera.operation();
|
||||||
|
}else{
|
||||||
|
opera = new Switch();
|
||||||
|
opera.setTel(tel);
|
||||||
|
opera.operation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.ComboPattern;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 19:11
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class ComboPattern {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
CompanyComposite company = new CompanyComposite(sc.next());
|
||||||
|
DepartmentComposite departmentComposite = null;
|
||||||
|
int n = sc.nextInt();
|
||||||
|
while(n > 0){
|
||||||
|
String type = sc.next();
|
||||||
|
if(type.equals("D")){
|
||||||
|
String department = sc.next();
|
||||||
|
departmentComposite = new DepartmentComposite(department);
|
||||||
|
company.add(departmentComposite);
|
||||||
|
}else{
|
||||||
|
String personnel = sc.next();
|
||||||
|
PersonnelLeaf personnelLeaf = new PersonnelLeaf(personnel);
|
||||||
|
if(departmentComposite != null) {
|
||||||
|
departmentComposite.add(personnelLeaf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
System.out.println("Company Structure:");
|
||||||
|
company.print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Component
|
||||||
|
interface Component{
|
||||||
|
void print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leaf
|
||||||
|
static class PersonnelLeaf implements Component{
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public PersonnelLeaf(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print() {
|
||||||
|
System.out.println(" "+name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Composite
|
||||||
|
// 部门
|
||||||
|
static class DepartmentComposite implements Component{
|
||||||
|
private String name;
|
||||||
|
private List<Component> list = new ArrayList<>();
|
||||||
|
|
||||||
|
public DepartmentComposite(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(Component component){
|
||||||
|
list.add(component);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print() {
|
||||||
|
System.out.println(" " + name);
|
||||||
|
for(Component component : list){
|
||||||
|
component.print();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公司-- 下面包括多个子类(部门-->员工)
|
||||||
|
static class CompanyComposite implements Component{
|
||||||
|
private String name;
|
||||||
|
private List<Component> list = new ArrayList<>();
|
||||||
|
|
||||||
|
public CompanyComposite(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(Component component){
|
||||||
|
list.add(component);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print() {
|
||||||
|
System.out.println(name);
|
||||||
|
for(Component component : list){
|
||||||
|
component.print();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.DecoratorPattern;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 16:43
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class DecoratorPattern {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
|
||||||
|
while (scanner.hasNext()) {
|
||||||
|
int a = scanner.nextInt();
|
||||||
|
int b = scanner.nextInt();
|
||||||
|
if (a == 1) {
|
||||||
|
Coffee blackCoffee = new BlackCoffee();
|
||||||
|
CoffeeDecorator coffeeDecorator = new CoffeeDecorator(blackCoffee);
|
||||||
|
coffeeDecorator.decorate(blackCoffee, b);
|
||||||
|
} else {
|
||||||
|
Coffee latte = new Latte();
|
||||||
|
CoffeeDecorator coffeeDecorator = new CoffeeDecorator(latte);
|
||||||
|
coffeeDecorator.decorate(latte, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Coffee {
|
||||||
|
void addCoffeeBeans();
|
||||||
|
}
|
||||||
|
|
||||||
|
class BlackCoffee implements Coffee {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCoffeeBeans() {
|
||||||
|
System.out.println("Brewing Black Coffee");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Latte implements Coffee {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCoffeeBeans() {
|
||||||
|
System.out.println("Brewing Latte");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CoffeeDecorator {
|
||||||
|
|
||||||
|
private final Coffee coffee;
|
||||||
|
|
||||||
|
public CoffeeDecorator(Coffee coffee) {
|
||||||
|
this.coffee = coffee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Coffee decorate(Coffee coffee, int add) {
|
||||||
|
if (add == 1) {
|
||||||
|
addMilk(coffee);
|
||||||
|
} else {
|
||||||
|
addSugar(coffee);
|
||||||
|
}
|
||||||
|
return coffee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMilk(Coffee coffee) {
|
||||||
|
coffee.addCoffeeBeans();
|
||||||
|
System.out.println("Adding Milk");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSugar(Coffee coffee) {
|
||||||
|
coffee.addCoffeeBeans();
|
||||||
|
System.out.println("Adding Sugar");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.EnjoyPattern;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 19:17
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class EnjoyPattern {
|
||||||
|
|
||||||
|
|
||||||
|
class Shape{
|
||||||
|
private String id;
|
||||||
|
private int x;
|
||||||
|
private int y;
|
||||||
|
|
||||||
|
|
||||||
|
public Shape(String id, int x, int y) {
|
||||||
|
this.id = id;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShareFactory{
|
||||||
|
|
||||||
|
Map<String, Shape> map;
|
||||||
|
|
||||||
|
public ShareFactory() {
|
||||||
|
this.map = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Shape setAndGetShape(String id,int x,int y){
|
||||||
|
Shape shape = map.get(id);
|
||||||
|
if (shape == null) {
|
||||||
|
shape = new Shape(id, x, y);
|
||||||
|
}
|
||||||
|
return shape;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.FacadePattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 18:15
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class FacadePattern {
|
||||||
|
// 提供了一个统一的接口,用于访问子系统中的一群接口
|
||||||
|
|
||||||
|
public class Facade {
|
||||||
|
private Switch ac;
|
||||||
|
private Switch lamp;
|
||||||
|
private Switch tv;
|
||||||
|
|
||||||
|
public Facade(Switch ac, Switch lamp, Switch tv) {
|
||||||
|
this.ac = ac;
|
||||||
|
this.lamp = lamp;
|
||||||
|
this.tv = tv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void turnOffAll() {
|
||||||
|
ac.off();
|
||||||
|
lamp.off();
|
||||||
|
tv.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void turnOff(int o) {
|
||||||
|
switch (o) {
|
||||||
|
case 1:
|
||||||
|
ac.off();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
lamp.off();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
tv.off();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.println("Invalid option.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubSystemClasses
|
||||||
|
// 开关
|
||||||
|
interface Switch{
|
||||||
|
void off();
|
||||||
|
}
|
||||||
|
|
||||||
|
//空调
|
||||||
|
class AirConditioning implements Switch {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void off() {
|
||||||
|
System.out.println("Air Conditioner is turned off.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//台灯
|
||||||
|
class DeskLamp implements Switch {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void off() {
|
||||||
|
System.out.println("Desk Lamp is turned off.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//电视机
|
||||||
|
class Television implements Switch {
|
||||||
|
@Override
|
||||||
|
public void off() {
|
||||||
|
System.out.println("Television is turned off.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.FacadePattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 18:33
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class SpringFactoryBean {
|
||||||
|
}
|
||||||
|
|
||||||
|
//class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 门面模式的获取对象
|
||||||
|
// * @return
|
||||||
|
// * @throws BeansException
|
||||||
|
// */
|
||||||
|
// @Nullable
|
||||||
|
// public Object getObject() throws BeansException {
|
||||||
|
// this.initializeAdvisorChain();
|
||||||
|
// if (this.isSingleton()) {
|
||||||
|
// return this.getSingletonInstance();
|
||||||
|
// } else {
|
||||||
|
// if (this.targetName == null) {
|
||||||
|
// this.logger.info("Using non-singleton proxies with singleton targets is often undesirable. Enable prototype proxies by setting the 'targetName' property.");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return this.newPrototypeInstance();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// private synchronized Object getSingletonInstance() {
|
||||||
|
// if (this.singletonInstance == null) {
|
||||||
|
// this.targetSource = this.freshTargetSource();
|
||||||
|
// if (this.autodetectInterfaces && this.getProxiedInterfaces().length == 0 && !this.isProxyTargetClass()) {
|
||||||
|
// Class<?> targetClass = this.getTargetClass();
|
||||||
|
// if (targetClass == null) {
|
||||||
|
// throw new FactoryBeanNotInitializedException("Cannot determine target class for proxy");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// this.setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass, this.proxyClassLoader));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// super.setFrozen(this.freezeProxy);
|
||||||
|
// this.singletonInstance = this.getProxy(this.createAopProxy());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return this.singletonInstance;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
|
@ -0,0 +1,69 @@
|
|||||||
|
package cn.whaifree.designPattern.kama.StructureType.ProxyPattern;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 16:30
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class ProxyPattern {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
int i = scanner.nextInt();
|
||||||
|
Integer[] sizes = new Integer[i];
|
||||||
|
for (int i1 = 0; i1 < i; i1++) {
|
||||||
|
sizes[i1] = scanner.nextInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
User user = new User();
|
||||||
|
Proxy proxy = new Proxy(sizes);
|
||||||
|
proxy.rent(user);
|
||||||
|
}
|
||||||
|
@Data
|
||||||
|
static class House{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
public House(int size) {
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Proxy {
|
||||||
|
|
||||||
|
List<House> housee;
|
||||||
|
|
||||||
|
|
||||||
|
// 所有房源
|
||||||
|
public Proxy(Integer... integers) {
|
||||||
|
housee = Arrays.stream(integers).map(House::new).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rent(User user) {
|
||||||
|
housee.forEach(
|
||||||
|
house -> {
|
||||||
|
if (house.size < 100) {
|
||||||
|
System.out.println("No");
|
||||||
|
}else {
|
||||||
|
user.rent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class User{
|
||||||
|
public void rent() {
|
||||||
|
System.out.println("YES");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package cn.whaifree.leetCode.Tree;
|
||||||
|
|
||||||
|
import cn.whaifree.leetCode.model.TreeNode;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/3 17:00
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode230 {
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TreeNode treeNode = TreeNode.constructTreeByArray(5,3,6,2,4,null,null,1);
|
||||||
|
System.out.println(new Solution().kthSmallest(treeNode, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
int res = 0;
|
||||||
|
public int kthSmallest(TreeNode root, int k) {
|
||||||
|
if (root == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int left = kthSmallest(root.left, k);
|
||||||
|
if (left != -1) {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
res++;
|
||||||
|
if (res == k) {
|
||||||
|
return root.val;
|
||||||
|
}
|
||||||
|
int right = kthSmallest(root.right, k);
|
||||||
|
if (right != -1) {
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 13:15
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LCR155 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
Solution solution = new Solution();
|
||||||
|
Node node = new Node(4);
|
||||||
|
node.left = new Node(2);
|
||||||
|
node.right = new Node(5);
|
||||||
|
node.left.left = new Node(1);
|
||||||
|
node.left.right = new Node(3);
|
||||||
|
Node node1 = solution.treeToDoublyList(node);
|
||||||
|
System.out.println(node1);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
public int val;
|
||||||
|
public Node left;
|
||||||
|
public Node right;
|
||||||
|
|
||||||
|
public Node() {}
|
||||||
|
|
||||||
|
public Node(int _val) {
|
||||||
|
val = _val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(int _val,Node _left,Node _right) {
|
||||||
|
val = _val;
|
||||||
|
left = _left;
|
||||||
|
right = _right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Definition for a Node.
|
||||||
|
class Node {
|
||||||
|
public int val;
|
||||||
|
public Node left;
|
||||||
|
public Node right;
|
||||||
|
|
||||||
|
public Node() {}
|
||||||
|
|
||||||
|
public Node(int _val) {
|
||||||
|
val = _val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(int _val,Node _left,Node _right) {
|
||||||
|
val = _val;
|
||||||
|
left = _left;
|
||||||
|
right = _right;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
Node pre;
|
||||||
|
Node index;
|
||||||
|
|
||||||
|
public Node treeToDoublyList(Node root) {
|
||||||
|
if (root == null)
|
||||||
|
return null;
|
||||||
|
pre = new Node(-1);
|
||||||
|
index = pre; // index作为链表指针
|
||||||
|
in(root);
|
||||||
|
index.right = pre.right;
|
||||||
|
pre.right.left = index;
|
||||||
|
return pre.right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void in(Node root) {
|
||||||
|
if (root == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
in(root.left);
|
||||||
|
index.right = root;
|
||||||
|
root.left = index;
|
||||||
|
index = index.right;
|
||||||
|
|
||||||
|
in(root.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 14:20
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LCR186 {
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
Solution solution = new Solution();
|
||||||
|
int[] places = {0, 6, 9, 0, 7};
|
||||||
|
System.out.println(solution.checkDynasty(places));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
* 给你5个数字,判断是否是顺子
|
||||||
|
* @param places
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean checkDynasty(int[] places) {
|
||||||
|
// Arrays.sort(places);
|
||||||
|
|
||||||
|
int min = Integer.MAX_VALUE;
|
||||||
|
int max = Integer.MIN_VALUE;
|
||||||
|
HashSet<Integer> set = new HashSet<>();
|
||||||
|
for (int i = 0; i < places.length; i++) {
|
||||||
|
if (places[i] == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (set.contains(places[i])) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
set.add(places[i]);
|
||||||
|
}
|
||||||
|
min = Math.min(min, places[i]);
|
||||||
|
max = Math.max(max, places[i]);
|
||||||
|
}
|
||||||
|
// 0 0 7 8 9
|
||||||
|
// 7 0 0 10 12
|
||||||
|
return max - min < 5; // 在这个区间,并且没有重复,则必然会顺子
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 10:23
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode115 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
Solution solution = new Solution();
|
||||||
|
int i = solution.numDistinct("babgbag", "bag");
|
||||||
|
System.out.println(i);
|
||||||
|
// rabbit
|
||||||
|
int i1 = solution.numDistinct("rabbbit", "rabbit");
|
||||||
|
System.out.println(i1);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* '' b a g
|
||||||
|
* 1 0 0 0
|
||||||
|
* b 1 1 0 0
|
||||||
|
* a 1 1 1 0
|
||||||
|
* b 1 2 1 0 一样: 之前的子序列 dp[i-1][j-1] + s其他前缀在t中出现的 dp[i-1][j]
|
||||||
|
* g
|
||||||
|
* a
|
||||||
|
* g
|
||||||
|
*
|
||||||
|
* '' b a b g b a g
|
||||||
|
*'' 1 1 1 1 1 1 1 1
|
||||||
|
* b 0 1 1 2 2 3 3 3
|
||||||
|
* a 0 0 1 1 1 1 4 4
|
||||||
|
* g 0 0 0 0 1 1 1 5
|
||||||
|
* 一样:用左上角+左 表示i-1 j 中匹配的次数(这个char i用的是前面的,不用第s[i - 1]来匹配) + 本次i-1 j-1 (使用i-1进行匹配)就差这个i匹配的
|
||||||
|
* else : 用左
|
||||||
|
*
|
||||||
|
* '' b a b g b a g
|
||||||
|
*'' 0 0 0 0 0 0 0 0
|
||||||
|
* b 0 1 1 2 2 3 3 3
|
||||||
|
* a 0 0 1 1 1 1 4 4
|
||||||
|
* g 0 0 0 0 1 1 1 5
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @param t
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int numDistinct(String s, String t) {
|
||||||
|
|
||||||
|
char[] sChar = s.toCharArray();
|
||||||
|
char[] tChar = t.toCharArray();
|
||||||
|
int[][] dp = new int[sChar.length + 1][tChar.length + 1];
|
||||||
|
for (int i = 0; i < sChar.length; i++) {
|
||||||
|
dp[i][0] = 1;
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= sChar.length; i++) {
|
||||||
|
for (int j = 1; j <= tChar.length; j++) {
|
||||||
|
if (sChar[i - 1] == tChar[j - 1]) {
|
||||||
|
// 如果相同
|
||||||
|
// 使用i-1进行匹配 dp[i - 1][j - 1] bagg和bag t匹配到s的第二个g时,使用第一个g
|
||||||
|
// 不用第s[i - 1]来匹配 dp[i - 1][j] bagg和bag t匹配到s的第二个g时,不使用第一个g
|
||||||
|
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
|
||||||
|
} else {
|
||||||
|
// 不用s[i - 1]来匹配
|
||||||
|
dp[i][j] = dp[i - 1][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[sChar.length][tChar.length];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 13:06
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode155 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
MinStack minStack = new MinStack();
|
||||||
|
minStack.push(-2);
|
||||||
|
minStack.push(0);
|
||||||
|
minStack.push(-3);
|
||||||
|
System.out.println(minStack.getMin());
|
||||||
|
minStack.pop();
|
||||||
|
System.out.println(minStack.top());
|
||||||
|
System.out.println(minStack.getMin());
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Item{
|
||||||
|
public int value;
|
||||||
|
public int nowMin;
|
||||||
|
|
||||||
|
public Item(int value, int nowMin) {
|
||||||
|
this.value = value;
|
||||||
|
this.nowMin = nowMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNowMin() {
|
||||||
|
return nowMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MinStack {
|
||||||
|
Deque<Item> stack;
|
||||||
|
public MinStack() {
|
||||||
|
stack = new LinkedList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void push(int val) {
|
||||||
|
if (stack.isEmpty()) {
|
||||||
|
stack.push(new Item(val, val));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Item peek = stack.peek();
|
||||||
|
int min = Math.min(peek.nowMin, val);
|
||||||
|
stack.push(new Item(val, min));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pop() {
|
||||||
|
stack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int top() {
|
||||||
|
return stack.peek().getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMin() {
|
||||||
|
return stack.peek().getNowMin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Your MinStack object will be instantiated and called as such:
|
||||||
|
* MinStack obj = new MinStack();
|
||||||
|
* obj.push(val);
|
||||||
|
* obj.pop();
|
||||||
|
* int param_3 = obj.top();
|
||||||
|
* int param_4 = obj.getMin();
|
||||||
|
*/
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/3 16:27
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode300 {
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp[i] 表示以0-i的,最长递增子序列的长度
|
||||||
|
* int tmp
|
||||||
|
*
|
||||||
|
* [10,9,2,5,3,7,101,18]
|
||||||
|
* 1 1 1 2 2 3 4 4
|
||||||
|
*
|
||||||
|
* i = 0 - len
|
||||||
|
* j = i -- 0
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 上升的增加尽可能少
|
||||||
|
*
|
||||||
|
* @param nums
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int lengthOfLIS(int[] nums) {
|
||||||
|
|
||||||
|
int[] dp = new int[nums.length];
|
||||||
|
Arrays.fill(dp, 1);
|
||||||
|
|
||||||
|
for (int i = 1; i < nums.length; i++) {
|
||||||
|
// 以i结尾的最大递增长度
|
||||||
|
for (int j = 0; j < i; j++) {
|
||||||
|
if (nums[j] < nums[i]) {
|
||||||
|
dp[i] = Math.max(dp[i], dp[j] + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Arrays.stream(dp).max().getAsInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/4 11:11
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode392 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
String s = "bb";
|
||||||
|
String t = "ahbgdc";
|
||||||
|
System.out.println(new Solution().isSubsequence(s, t));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
* '' a h b g d c
|
||||||
|
*'' 1 1 1 1 1 1 1
|
||||||
|
* a 0 1 1 1 1 1 1 == 用i-1 j-1 else 左边
|
||||||
|
* b 0 0 0 1 1 1 1
|
||||||
|
* c 0 0 0 0 0 0 1
|
||||||
|
*
|
||||||
|
* '' a h b g d c
|
||||||
|
*'' 1 1 1 1 1 1 1
|
||||||
|
* a 0 1 1 1 1 1 1
|
||||||
|
* x 0 0 0 0 0 0 0
|
||||||
|
* c 0 0 0 0 0 0 0
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @param t
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isSubsequence(String s, String t) {
|
||||||
|
|
||||||
|
if (s.length() == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (t.length() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (s.length() == 1 && t.length() == 1 ) {
|
||||||
|
if (s.charAt(0) == t.charAt(0)) {
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean[][] dp = new boolean[s.length() + 1][t.length() + 1];
|
||||||
|
Arrays.fill(dp[0], true);
|
||||||
|
|
||||||
|
for (int i = 1; i <= s.length(); i++) {
|
||||||
|
for (int j = 1; j <= t.length(); j++) {
|
||||||
|
if (s.charAt(i - 1) == t.charAt(j - 1)) {
|
||||||
|
dp[i][j] = dp[i - 1][j - 1];
|
||||||
|
} else {
|
||||||
|
dp[i][j] = dp[i][j - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[s.length()][t.length()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/5 12:25
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode718 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums1 = new int[]{0,1,1,1,1};
|
||||||
|
int[] nums2 = new int[]{1,0,1,0,1};
|
||||||
|
Solution solution = new Solution();
|
||||||
|
int length = solution.findLength(nums1, nums2);
|
||||||
|
System.out.println(length);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这个问题关键在于重复的数字会被重复使用
|
||||||
|
*
|
||||||
|
* 0,1,1,1,1
|
||||||
|
* 1 0 1 1 1 1
|
||||||
|
* 0 1 1 1 1 1
|
||||||
|
* 1 1 2
|
||||||
|
* 0
|
||||||
|
* 1
|
||||||
|
*以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串
|
||||||
|
*
|
||||||
|
* @param nums1
|
||||||
|
* @param nums2
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int findLength(int[] nums1, int[] nums2) {
|
||||||
|
|
||||||
|
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
|
||||||
|
int max = 0;
|
||||||
|
for (int i = 1; i <= nums1.length; i++) {
|
||||||
|
for (int j = 1; j <= nums2.length; j++) {
|
||||||
|
if (nums1[i - 1] == nums2[j - 1]) {
|
||||||
|
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||||
|
} else {
|
||||||
|
dp[i][j] = 0;
|
||||||
|
}
|
||||||
|
max = Math.max(max, dp[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,10 @@
|
|||||||
package cn.whaifree.redo.redo_all_240924;
|
package cn.whaifree.redo.redo_all_240924;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @Author whai文海
|
* @Author whai文海
|
||||||
@ -7,4 +12,158 @@ package cn.whaifree.redo.redo_all_240924;
|
|||||||
* @注释
|
* @注释
|
||||||
*/
|
*/
|
||||||
public class LeetCode912 {
|
public class LeetCode912 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {5,2,3,1};
|
||||||
|
new QuickSort().sort(nums, 0, nums.length - 1);
|
||||||
|
System.out.println(Arrays.toString(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
class QuickSort {
|
||||||
|
|
||||||
|
Random random = new Random();
|
||||||
|
public int[] sortArray(int[] nums) {
|
||||||
|
sort(nums, 0, nums.length - 1);
|
||||||
|
return nums;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sort(int[] nums, int start, int end) {
|
||||||
|
if (start >= end) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = start + random.nextInt(end - start + 1);
|
||||||
|
swap(nums, index, end);
|
||||||
|
int base = nums[end];
|
||||||
|
|
||||||
|
|
||||||
|
int l = start;
|
||||||
|
int r = end;
|
||||||
|
while (start < end) {
|
||||||
|
while (start < end && nums[start] <= base) {
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
while (start < end && nums[end] >= base) {
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
// if (start < end) {
|
||||||
|
swap(nums, start, end);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
swap(nums, start, r);
|
||||||
|
sort(nums, l, end - 1);
|
||||||
|
sort(nums, start + 1, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void swap(int[] nums, int i, int j) {
|
||||||
|
int temp = nums[i];
|
||||||
|
nums[i] = nums[j];
|
||||||
|
nums[j] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test2() {
|
||||||
|
int[] nums = {5,2,3,1};
|
||||||
|
System.out.println(Arrays.toString(new MergeSort().sortArray(nums)));
|
||||||
|
}
|
||||||
|
|
||||||
|
class MergeSort {
|
||||||
|
public int[] sortArray(int[] nums) {
|
||||||
|
if (nums.length <= 1) {
|
||||||
|
return nums;
|
||||||
|
}
|
||||||
|
if (nums.length == 2) {
|
||||||
|
if (nums[0] > nums[1]) {
|
||||||
|
return new int[]{nums[1], nums[0]};
|
||||||
|
}else {
|
||||||
|
return new int[]{nums[0], nums[1]};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = nums.length ;
|
||||||
|
int[] ints1 = Arrays.copyOfRange(nums, 0, len / 2);
|
||||||
|
int[] ints2 = Arrays.copyOfRange(nums, len / 2, len);
|
||||||
|
int[] sort1 = sortArray(ints1);
|
||||||
|
int[] sort2 = sortArray(ints2);
|
||||||
|
int[] sort = sort(sort1, sort2);
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] sort(int[] nums1, int[] nums2) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int index1 = 0;
|
||||||
|
int index2 = 0;
|
||||||
|
int index = 0;
|
||||||
|
int[] res = new int[nums1.length + nums2.length];
|
||||||
|
while (index1 < nums1.length && index2 < nums2.length) {
|
||||||
|
if (nums1[index1] <= nums2[index2]) {
|
||||||
|
res[index++] = nums1[index1++];
|
||||||
|
} else {
|
||||||
|
res[index++] = nums2[index2++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (index1 < nums1.length) {
|
||||||
|
res[index++] = nums1[index1++];
|
||||||
|
}
|
||||||
|
while (index2 < nums2.length) {
|
||||||
|
res[index++] = nums2[index2++];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test3() {
|
||||||
|
int[] nums = {-1,2,-8,-10};
|
||||||
|
System.out.println(Arrays.toString(new HeapSort().sortArray(nums)));
|
||||||
|
}
|
||||||
|
|
||||||
|
class HeapSort {
|
||||||
|
|
||||||
|
|
||||||
|
public int[] sortArray(int[] nums) {
|
||||||
|
Heap heap = new Heap(nums);
|
||||||
|
for (int i = nums.length - 1; i > 0; i--) {
|
||||||
|
heap.heapUp(i);
|
||||||
|
}
|
||||||
|
return nums;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Heap{
|
||||||
|
int[] heap = null;
|
||||||
|
|
||||||
|
public Heap(int[] nums) {
|
||||||
|
heap = nums;
|
||||||
|
}
|
||||||
|
public void heapUp(int end) {
|
||||||
|
int nonLeaf = (end - 1) / 2;
|
||||||
|
while (nonLeaf >= 0) {
|
||||||
|
int left = nonLeaf * 2 + 1;
|
||||||
|
int right = nonLeaf * 2 + 2;
|
||||||
|
int maxIndex = nonLeaf;
|
||||||
|
if (left <= end && heap[left] > heap[maxIndex]) {
|
||||||
|
maxIndex = left;
|
||||||
|
}
|
||||||
|
if (right <= end && heap[right] > heap[maxIndex]) {
|
||||||
|
maxIndex = right;
|
||||||
|
}
|
||||||
|
if (nonLeaf != maxIndex) {
|
||||||
|
swap(this.heap, nonLeaf, maxIndex);
|
||||||
|
|
||||||
|
}
|
||||||
|
nonLeaf--;
|
||||||
|
}
|
||||||
|
swap(heap, 0, end);
|
||||||
|
}
|
||||||
|
public void swap(int[] nums, int i, int j) {
|
||||||
|
int temp = nums[i];
|
||||||
|
nums[i] = nums[j];
|
||||||
|
nums[j] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -255,7 +255,7 @@ class AIOServer{
|
|||||||
|
|
||||||
// 读取客户端发送的数据
|
// 读取客户端发送的数据
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(1024);
|
ByteBuffer buffer = ByteBuffer.allocate(1024);
|
||||||
client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
|
CompletionHandler<Integer, ByteBuffer> handler = new CompletionHandler<>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当读取操作成功完成时的处理逻辑
|
* 当读取操作成功完成时的处理逻辑
|
||||||
@ -300,7 +300,12 @@ class AIOServer{
|
|||||||
public void failed(Throwable exc, ByteBuffer attachment) {
|
public void failed(Throwable exc, ByteBuffer attachment) {
|
||||||
// 处理读取失败情况,此处未定义具体行为
|
// 处理读取失败情况,此处未定义具体行为
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
client.read(buffer, buffer, handler);
|
||||||
|
|
||||||
server.accept(null, this);
|
server.accept(null, this);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
package cn.whaifree.tech.java;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/3 19:10
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class FunctionInterfaceDemo {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
MyInterface myInterface = x -> x;
|
||||||
|
int run = myInterface.run(1);
|
||||||
|
System.out.println(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyClass {
|
||||||
|
public static void doSome(MyInterface myInterface) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface MyInterface {
|
||||||
|
|
||||||
|
abstract int run(int x);
|
||||||
|
}
|
@ -16,33 +16,52 @@ import java.util.concurrent.Semaphore;
|
|||||||
public class Alternate_printing {
|
public class Alternate_printing {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
Semaphore s0 = new Semaphore(1);
|
Semaphore s1 = new Semaphore(1); // permits = 1 表示 可以使用acquire对Semaphore的state--,或者使用release对Semaphore的state++
|
||||||
Semaphore s1 = new Semaphore(0);
|
Semaphore s2 = new Semaphore(0);
|
||||||
|
Semaphore s3 = new Semaphore(0);
|
||||||
|
|
||||||
new Thread(new FutureTask<>(new Callable<>() {
|
Thread threadA = new Thread(() -> {
|
||||||
@Override
|
for (int i = 0; i < 10; i++) {
|
||||||
public Object call() throws Exception {
|
try {
|
||||||
for (int i = 0; i < 50; i++) {
|
s1.acquire(); // 获取信号量
|
||||||
s0.acquire();
|
|
||||||
System.out.println("a");
|
System.out.println("a");
|
||||||
s1.release();
|
s2.release(); // 释放信号量给下一个线程
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
System.out.println("Thread A interrupted.");
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
})).start();
|
});
|
||||||
|
|
||||||
|
Thread threadB = new Thread(() -> {
|
||||||
new Thread(new FutureTask<>(new Callable<>() {
|
for (int i = 0; i < 10; i++) {
|
||||||
@Override
|
try {
|
||||||
public Object call() throws Exception {
|
s2.acquire(); // 获取信号量
|
||||||
for (int i = 0; i < 50; i++) {
|
|
||||||
s1.acquire();
|
|
||||||
System.out.println("b");
|
System.out.println("b");
|
||||||
s0.release();
|
s3.release(); // 释放信号量给下一个线程
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
System.out.println("Thread B interrupted.");
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
})).start();
|
});
|
||||||
|
|
||||||
|
Thread threadC = new Thread(() -> {
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
try {
|
||||||
|
s3.acquire(); // 获取信号量
|
||||||
|
System.out.println("c");
|
||||||
|
s1.release(); // 释放信号量给第一个线程
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
System.out.println("Thread C interrupted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
threadA.start();
|
||||||
|
threadB.start();
|
||||||
|
threadC.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package cn.whaifree.tech.thread;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PipedInputStream;
|
||||||
|
import java.io.PipedOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/3 18:51
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ThreadConnect {
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
PipedOutputStream pipedOutputStream = new PipedOutputStream();
|
||||||
|
PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);
|
||||||
|
|
||||||
|
// 创建一个线程用于写入数据
|
||||||
|
Thread writerThread = new Thread(() -> {
|
||||||
|
try {
|
||||||
|
pipedOutputStream.write("Hello, Piped I/O!".getBytes());
|
||||||
|
pipedOutputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 创建一个线程用于读取数据
|
||||||
|
Thread readerThread = new Thread(() -> {
|
||||||
|
try {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int bytesRead = pipedInputStream.read(buffer);
|
||||||
|
System.out.println("Received: " + new String(buffer, 0, bytesRead));
|
||||||
|
pipedInputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
writerThread.start();
|
||||||
|
readerThread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,69 @@
|
|||||||
|
package cn.whaifree.tech;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/3 19:18
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class FunctionInterfaceDemo {
|
||||||
|
static ReentrantLock lock = new ReentrantLock();
|
||||||
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
|
||||||
|
HashMap<Object, Object> map = new HashMap<>();
|
||||||
|
// map.put(null, null);
|
||||||
|
System.out.println(map.get(null));
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
System.out.println("1");
|
||||||
|
try {
|
||||||
|
lock.lock();
|
||||||
|
throw new RuntimeException();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
System.out.println("2");
|
||||||
|
try {
|
||||||
|
lock.lock();
|
||||||
|
throw new RuntimeException();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
|
||||||
|
// MyInterface myInterface = x -> x;
|
||||||
|
// int run = myInterface.run(1);
|
||||||
|
// System.out.println(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyClass {
|
||||||
|
public static void doSome(MyInterface myInterface) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
interface MyInterface {
|
||||||
|
|
||||||
|
abstract int run(int x);
|
||||||
|
|
||||||
|
}
|
41
ForJdk8/src/main/java/cn/whaifree/tech/rustDesk.yaml
Normal file
41
ForJdk8/src/main/java/cn/whaifree/tech/rustDesk.yaml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
networks:
|
||||||
|
rustdesk-net:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
services:
|
||||||
|
hbbs:
|
||||||
|
container_name: hbbs
|
||||||
|
ports:
|
||||||
|
- 26115:21115
|
||||||
|
- 26116:21116 # 自定义 hbbs 映射端口
|
||||||
|
- 26116:21116/udp # 自定义 hbbs 映射端口
|
||||||
|
image: rustdesk/rustdesk-server
|
||||||
|
command: hbbs
|
||||||
|
volumes:
|
||||||
|
- ./hbbs:/root # 自定义挂载目录
|
||||||
|
networks:
|
||||||
|
- rustdesk-net
|
||||||
|
depends_on:
|
||||||
|
- hbbr
|
||||||
|
restart: unless-stopped
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 64M
|
||||||
|
|
||||||
|
hbbr:
|
||||||
|
container_name: hbbr
|
||||||
|
ports:
|
||||||
|
- 26117:21117 # 自定义 hbbr 映射端口
|
||||||
|
image: rustdesk/rustdesk-server
|
||||||
|
command: hbbr
|
||||||
|
volumes:
|
||||||
|
- ./hbbr:/root # 自定义挂载目录
|
||||||
|
networks:
|
||||||
|
- rustdesk-net
|
||||||
|
restart: unless-stopped
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 64M
|
Loading…
Reference in New Issue
Block a user