- 博客(107)
- 收藏
- 关注
原创 leetcode刷题 跳跃游戏 II java版
先看题目:先看下题目,感觉很常规:当时写下一个公式,nums[i] + i > nums.length - 1;不过真的写代码有点费劲。参考了一下大佬们的解法:https://leetcode-cn.com/problems/jump-game-ii/solution/tiao-yue-you-xi-ii-by-leetcode-solution/讲的很详细,我自己理解了几遍,下面写一下自己的想法:第一种办法:反向贪心查找,这个是比较常规可以想到的,先去看要到达倒数第二步,需要满
2021-06-30 16:21:18
223
原创 leetcode刷题之三数之和 --java版
先看题目:这个和之前做的第16题思想是一致的,先找到一个固定的nums[i], 然后不断变化left和right,然后去找到满足和为0的要求: public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); if (nums.length < 3) { return new ArrayList<>(); }
2021-06-04 10:46:05
226
原创 Java刷题之 最接近的三数之和 --差分
先看题目:刚刚看完题目,觉得比较简单,觉得这个就直接写两个变量,先是内部比一下,然后再写一个变量, 将每次内部的值和外部比一下,感觉就ok。结果很打脸,因为是3个数,还是没有那么的快速搞定。后面转念一想,之前做过那么多字符串递归回溯的,我可以穷举出每3个字符串,然后求和,和target值比较,找出差值最小,其中,中间可能还需要用map缓存一想每个数组的和作为key,然后将与target的差值作为value。想的可真麻烦。我还真的去尝试了,无果public int threeSumClosest(in
2021-06-04 09:38:10
208
原创 leetcode 字符串处理 --基本计算器 II --java版
先看题目:第一感觉:应该是分为各种情况去计算,加减乘除相关的计算。自己先写了一版,比较挫,感觉数字老是比运算符号慢一步 public int calculate(String s) { int result = 0; Deque<Integer> stack = new LinkedList<>(); stack.push(1); int numTemp = 0; for (int i =
2021-06-02 21:41:14
272
4
原创 leetcode刷题 --栈的使用 java版
先看题目:刚刚看到题目,感觉很简单,这个题目怎么可能是hard呢?额,后面持续打脸。一开始完全没有意识到这个是个不断迭代,寻找最长的长度的问题。直接上代码: public int longestValidParentheses(String s) { int result = 0; Deque<Character> stack = new LinkedList<>(); for (int i = 0; i < s.l
2021-06-01 16:45:25
270
2
原创 回溯算法大探秘 --java版
回溯算法学习:找了几个相似的题目,统一学习了一下:第一个题目:大小字母的全排列题目描述:一开始想用回溯法,对回溯法了解的并不那么深入,去百度了一下,觉得这篇文章写得很好,回溯法现在理解到,回溯法就是需要有一个结束条件,满足结束条件,就添加或者返回元素,不满足时,去寻找满足的条件,然后按照题目的要求,去寻找满足条件的情况。上面是形式上的,从具体的遍历方式上,类似于深度搜索,先一步一步遍历,知道找到满足条件的,然后开始往前倒推,倒到上一步,找到满足条件的,这样一直倒推到最后,所有的情况都被遍历完
2021-05-29 17:39:39
223
2
原创 leetcode刷题之1160拼写单词 java题解(超详细)
题目如下图所示:一开始有点懵,然后想着暴力求解的话,用words里面的每个单词去chars里面去查找,如果全都找到了就加一,好像有点蠢,后面参考了一下网上的一些想法,去比较words里面每个字母的个数,是不是比chars里面字母的个数小或者等于,是的话,就能组成自己试了一下,还可以:public int countCharacters(String[] words, String chars) { Map<Character, Integer> map = new Has
2020-11-21 15:26:30
477
3
原创 小白都能懂的设计模式 java版 动态代理模式 实战练习(超详细)
以之前静态代理租房为例,看动态代理如何实现:静态代理模式实战练习对了,还找到了JDK1.8一个在线文档还不错,推荐给大家:jdk1.8API文档先要了解上一节说的两个类,proxy以及InvocationHandle这一部分先写好了,后面详细解释package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;
2020-11-06 22:34:20
215
原创 小白都能懂的设计模式 java版 静态代理模式再理解 实战练习(超详细)
通过具体的实践来说明下代理模式的这两点:公共事物交给代理角色,实现了业务分工公共事物发生变化是,方便集中管理
2020-11-03 12:07:25
147
原创 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)
静态代理:角色分析:抽象角色:一般使用接口或者是抽象类来解决真实角色:被代理的角色代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作客户:访问代理对象的人以一个租房子的例子来讲一下静态代理模式:房客去租房子,不去直接找房东,而是通过中介来租房,中介通常会有些附加操作来看下代码:租房接口:package agent;//租房public interface Rent { public void rent();}房东对象:package agent;/
2020-11-03 12:02:35
254
原创 原创 小白都能懂的设计模式 java版 代理模式(总览)
为什么学习代理模式呢?这个是SpringAOP的底层代理模式分类:分为静态代理和动态代理这个是代理模式,大概模型图:后续更新
2020-11-02 09:01:21
143
原创 小白都能懂的设计模式 java版 桥接模式具体实现(超详细)
桥接模式:是将抽象部分与 实现部分分离,使他们可以队里变化,是一种对象结构型模式,又称为柄体模式或者接口模式实战一下,将品牌和类型相互分离,当有需要的时候互相组合:先写一个品牌的接口package bridge;//品牌public interface Brand { void info();}分别实现一个苹果品牌还有一个联想品牌:package bridge;//苹果品牌public class Apple implements Brand { @Overrid
2020-10-30 09:12:11
308
6
原创 小白都能懂的设计模式 java版 适配器模式 回顾总结(超详细)
适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本不兼容而不在一起工作的那些类可以一起工作这个会更新~
2020-10-29 09:05:52
119
原创 小白都能懂的设计模式 java版 适配器模式具体实现(超详细)
适配器模式是一种结构型模式适配器模式作用:从程序的结构上实现松耦合,可以扩大整体的类结构,用来解决更大的问题适配器模式可以想象成一个USB网线转换器具体代码会更新
2020-10-28 10:35:31
161
原创 小白都能懂的设计模式 java版 原型模式 存在浅拷贝问题以及解决办法(超详细)
在这一节里,https://blog.csdn.net/weixin_45806131/article/details/109282894是一个浅拷贝,v1和v2同时指向date,理论上应该v2也有一个自己的date,也就是进行一个深拷贝这个会更新
2020-10-26 09:02:17
113
原创 小白都能懂的设计模式 java版 原型模式 原理和实战练习(超详细)
原型模式也是一种创建型模式:表示以某个东西为原型,进行拷贝这个比较简单,直接可以看代码:先写一个radio对象package prototype;import javax.xml.crypto.Data;import java.util.Date;//实现一个接口Cloneable, 重写一个方法clone()//video类public class Video implements Cloneable { private String name; private Date
2020-10-26 08:59:19
222
2
原创 小白都能懂的设计模式 java版 建造者模式 拓展小节(超详细)
上一篇的例子中https://blog.csdn.net/weixin_45806131/article/details/109235373是Build模式的常规用法,Director类在Bulider模式中具有非常重要的作用,用于指导具体构建者如何构建产品,控制调用的先后顺序,并且向调用者返回完整的产品类,但是有时候需要简化系统结构,可以把Director和抽象建造者进行结合可以通过静态内部类方式实现零件无需装配构造,这种方式更加灵活,更加符合定义比如麦当劳的套餐,服务员(具体建造者)可以随意搭配
2020-10-24 06:00:09
116
原创 小白都能懂的设计模式 java版 建造者模式 具体实现(超详细)
建造者:package build;//抽象的建造者,定义一些方法public abstract class Builder { abstract void bulidA(); //地基 abstract void bulidB(); //钢筋工程 abstract void bulidC(); //铺电线 abstract void bulidD(); //粉刷 //完工,得到具体的产品 abstract Product getProduc
2020-10-23 09:11:54
135
4
原创 小白都能懂的设计模式 java版 建造者模式 基本概念
建造者模式是一种创建型模式,提供了一种创建对象的最佳方式可以将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示在用户不知道对象的建造过程和细节,可以直接创建复杂对象举个例子:工厂(建造者模式):复杂制造汽车(组装过程和细节在工厂内完成)汽车购买者(用户):只需要说出产品型号(对象的类型和内容),购买可以直接使用(不需要知道汽车如何组装)这些是建造者模式的基本概念,具体的还是要通过代码实践了解更深入好了,今天先到这里~...
2020-10-23 08:46:38
70
原创 小白都能懂的设计模式 java版 抽象工厂模式 实战练习(超详细)
比如要生产华为手机,华为路由器,小米手机,小米路由器先写路由器和手机的接口:package abstract1;//手机产品接口public interface IphoneProduct { void start(); void shutdown(); void callup(); void sendMes();}package abstract1;//路由器产品接口public interface IRouteProduct { void
2020-10-22 11:02:10
283
4
原创 小白都能懂的设计模式 java版 抽象工厂模式 基本概念
抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂为其他工厂的工厂它提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类优点:具体产品在应用层的代码隔离,无需关心创建细节将一个系列产品放到一起创建缺点:规定了可能被创建产品集合,扩展新产品困难增加了系统抽象性和理解难度具体的代码会再更新好了,今天先到这里~...
2020-10-21 09:02:26
73
原创 小白都能懂的设计模式 java版 简单工厂模式和工厂模式小节
先看下工厂模式框图:工厂模式每次都要实现一个车工厂,不用改动原来的代码,但是代码的数量增加很多从结构复杂度:简单工厂比较简单从代码复杂度:简单工厂比较简单从编程复杂度:简单工厂比较简单从管理复杂度:简单工厂比较简单根据设计原则,使用工厂设计模式,根据实际业务,选择简单工厂模式比较方便...
2020-10-21 08:51:37
220
原创 小白都能懂的设计模式 java版 工厂模式实战练习(超详细)
上一节说了,简单工厂模式不满足开闭原则:https://blog.csdn.net/weixin_45806131/article/details/109153865我们再看一下,工厂模式:新建一个车工厂的接口: package methodFactory;//工厂方法模式public interface CarFactory { Car getCar();}通过实现这个接口,新建五菱和特斯拉的车工厂package methodFactory;public class W
2020-10-19 09:02:57
191
2
原创 小白都能懂的设计模式 java版 简单工厂模式实战练习(超详细)
我们原来写一个实现类:先有一个接口:package factory.simple;public interface Car { void name();}写这个接口的两个实现类:在这package factory.simple;public class Tesla implements Car { @Override public void name() { System.out.println("特斯拉"); }}package
2020-10-19 08:52:54
322
1
原创 小白都能懂的设计模式 java版 工厂模式 概念讲解
工厂模式作用:实现了创建者和调用者分离详细分类:简单工厂模式工厂方法模式抽象工厂模式满足OOP七大设计原则之:开闭原则:一个软件的实体应该对外扩展开放,对修改关闭依赖倒转原则:针对接口编程,不针对实现编程迪米特法则:只与你最直接的朋友通信,避免与陌生人通信核心本质:实例化对象不使用new,用工厂方法代替将选择实现类,创建对象统一管理和控制,从而将调用者和实现解耦...
2020-10-16 11:12:47
124
原创 java实现网络编程之 UDP多线程在线聊天(超详细)
这个涉及到多线程发送端:package chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;p
2020-10-15 09:06:08
295
1
原创 java实现网络编程之 经典UDP通信 实现聊天(超详细)
用UDP模拟聊天:发送端:package chat;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;public class UdpSenderDemo01
2020-10-14 09:01:39
528
原创 java实现网络编程之 经典UDP通信实战练习(超详细)
UDP不需要建立连接,但是需要知道对方的地址同样通过代码来实战一下:服务端:package network;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class UdpClient { public static void main(String[] args) th
2020-10-13 09:01:57
266
2
原创 网络编程之 TCP,UDP的区别和联系
tcp,udp都是传输层的协议简单通俗的讲一下tcp和udp之间的区别:TCP类似打电话连接是稳定的,建立连接需要三次握手,四次挥手,客户端负责发送消息,服务器端处理消息,传输完成后,释放连接,传输效率低UDP类似发短信不建立连接,是不稳定的,客户端和服务器端没有明确的界限,都能发送和接收消息,不管对方有无准备好,都可发送消息,可能会受到DDOS(饱和攻击)传输效率高TCP三次握手,四次挥手简单解释:三次握手:A:我要建立连接B:知道了,建立连接吧A:建立连接四次挥手:
2020-10-13 08:51:47
196
原创 java实现网络编程之 经典TCP通信实战练习(超详细)
模拟tcp通信:一个客户端的类,一个服务器端的类下面看下具体实现:客户端代码:package network;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;//客户端public class TcpClient01 { public st
2020-10-12 09:00:49
417
2
原创 玩转java多线程 之多线程基础 回顾总结线程的创建
好了,回顾一下,创建线程的三种方式:package duoxiancheng;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;import java.util.concurrent.FutureTask;//回顾总结线程的创建public class ThreadNew { public sta
2020-10-11 14:00:11
231
6
原创 玩转java多线程 之多线程基础 解决生产者消费者问题 线程池实践
线程池:经常创建和销毁使用量特别大的资源,比如并发情况下的线程,对性能影响很大通过提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中,可以避免频繁创建销毁,实现重复利用线程池可以提高响应速度,降低资源消耗,便于线程管理JDK5.0提供了线程池相关的api,executorService和excutorsexecutorService:真正的线程池接口,常见子类ThreadPoolExecutor执行任务,没有返回值,一般用来执行Runnablevoid execute(Runna
2020-10-11 13:50:28
300
原创 玩转java多线程 之多线程基础 解决生产者消费者问题 信号灯法实践
信号灯法实践:package duoxiancheng;//测试生产者消费者问题,信号灯法public class TestPc2 { public static void main(String[] args) { TV tv = new TV(); new Player(tv).start(); new Watcher(tv).start(); }}//生产者:演员class Player extends Thread {
2020-10-11 13:32:51
100
原创 玩转java多线程 之多线程基础 解决生产者消费者问题 管程法实践
管程法实践:package duoxiancheng;//测试生产者消费者模型,利用管程法缓冲区来解决//生产者,消费者,产品,缓冲区public class TestPc { public static void main(String[] args) { SynContainer synContainer = new SynContainer(); new Productor(synContainer).start(); new Con
2020-10-11 12:37:19
110
原创 玩转java多线程 之多线程基础 生产者消费者问题 以及 解决此类问题的方法
有两个线程,一个生产线程,一个消费线程应用场景:假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者取走消费假设没有商品,生产者将产品放入仓库,否则停止生产并等待,直到仓库中产品被消费者取走为止如果有产品,消费者取走消费,否则停止消费等待,直到仓库中有产品为止...
2020-10-10 09:01:54
547
原创 玩转java多线程 之多线程基础 Lock锁实战练习
从JDK5.0开始,java提供了更强大的线程同步机制,通过显式定义同步锁对象来实现同步,同步锁用Lock对象充当。java.util.concurrent.locks Lock接口是控制多个线程对共享资源进行访问的工具,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应该先获得Lock对象。ReentrantLock类实现了Lock, 它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以
2020-10-10 08:50:14
438
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人