yubのAlgorithm.0xe
逆波兰表达式求值link:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路分析最开始的思路就是用栈解决,非运算符号的先入栈,遇到运算符再出栈对运算符进行判断之后进行相应的运算最后出栈即可.【注意一点】 为了保证运算顺序,运算都是num2对num1操作(因为先进后出)
前提是搞懂逆波兰式本质是二叉树中的中序遍历变成了后序遍历.
暴力版12345678910111213141516171819202122232425262728293031323334class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); int num1,num2; for(String s:tokens) { if(s.equals("+")) { stack.p ...
yubのAlgorithm.0xf
前K个高频元素link:347. 前 K 个高频元素 - 力扣(LeetCode)
思路分析对于统计元素出现的频率,这一类问题可以用map来进行统计(key和value无敌)key存放元素,value存放出现的频率.其实最开始想到的是暴力的遍历循环,逐个判断计数排列,剔除出现频率最小的元素.想用set但是不匹配统计频率的要求.就需要Set和Lsit结合.最后发现还是离不开心爱的map啊(大顶堆秒了)
大顶堆实现1234567891011121314151617181920class Solution { public int[] topKFrequent(int[] nums, int k) { //创建Map Map<Integer,Integer> map = new HashMap<>(); for(int num:nums) { //确保更新元素 map.put(num,map.getOrDefault(num,0)+1); ...
yubのAlgorithm0.0
闲言碎语 思来想去还是想把之前打卡的内容搬过来(毕竟博客修修补补还是勉强可以凑合看 笑)还是作为自己的点滴记录吧.【是的看到的日期一样的纯属是懒得改 不要学习懒惰】 wi师傅说毕设手搓一个自己的博客系统GitHub上能有几千star那包过的,倒是有这么个想法,说不定自己哪天也可以实现呢. 之后搬运过来的内容也算是复习了,希望自己能在薄弱的方面越来越好.【这个时候在Harmony开发课上插着耳机一个人passion hh】
希望自己这次能真正坚持下来.(在学习的学弟学妹们也继续加油哦 期待你们成为自己理想中的pwn✌)
共勉.
Java多线程_0x9_
多线程篇九常见的锁策略虽然我们开发者一般只关注如何使用锁,但设计锁我们也需要有一定的了解.
乐观锁和悲观锁顾名思义,两个锁一个是考虑的最优情况一个考虑最坏情况.
乐观锁在加锁之前,假设数据一般情况下不会产生冲突,只在数据进行返回更新的时候进行检查校验,如果发生并行冲突就返回错误信息,让用户重新进行决策.(就是加锁之前预估出现所冲突的概率不大所以在加锁前不会进行太多的工作【加锁过程做的事少加锁的速度更快但是更容易引入一些其他问题消耗CPU资源】)比如你想吃饭,但是食堂这个时候被军爷占领了,你觉得你去的过够早军爷抢不过你,直接冲去食堂,结果排上了长长的队伍.【没加锁但能识别数据冲突】
悲观锁在加锁之前,总假设数据从一开始就容易被修改,每次拿数据的时候就会加锁.想拿到这个数据只能等待阻塞拿到锁.(在加锁之前预估出现锁冲突的概率很大,加锁的时候会做更多的工作防止意外,此时加锁的速度可能更慢,但是整个过程中更不容易出现其他问题)和上述同样的情况,为了防止空跑一趟你给可预定窗口发消息询问能否预定(相当于加锁)得到肯定答复之后会来取餐如果生意太火爆没回或者说不够预定的就下次再去这个窗口.
Synch ...
Java多线程_0x8_
多线程篇八线程池什么是线程池?顾名思义,线程池是一个存放了很多线程的池子.既然有很多线程,那一定很方便调用对吧,有很多线程那大家一定喜欢一起玩吧(并发).
线程池是一种并发编程中常用的技术,用于管理和重用线程.线程池由线程池管理器、工作队列和线程池中的线程构成.
线程池的优点由于进程的频繁创建和销毁带来的巨大开销,所以聪明的大佬们选择引入线程池或者更轻量级的协程(纤程).协程的本质室程序员再用户态代码中进行调度,不依赖内核.纯用户态代码是基于线程封装过来的就比内核调用更加安全.而引入线程池就能**减少每次启动、销毁线程的损耗.**【用完了也不用销毁,多次利用,喜欢用一辈子的奥特乐袋子!(bushi】
标准库中线程池Tips
corePoolSize: 核心线程数(一个线程池里,最少有多少个线程)maximumPoolSize :最大线程数(一个线程池中,最多有多少个线程)keepAliveTime:线程空闲超过这个时间阈值,就会被销毁unit:时间单位,取分钟,秒,小时等等workQueue:和定时器相同,线程池也可以有很多任务,也可以设置为带有优先级的ThreadFactory: 线 ...
Java多线程_0x7_
多线程篇七定时器什么是定时器听到定时器,首先想到的是“闹钟”.到一个设置好的时间之后就执行某个指定好的代码.(在实际开发中非常常用,如网络通信【邮件发送】)你在抢演唱会门票,已经到了支付页面,但是网突然崩了,页面显示让你等待,这下怎么办!!对于我们来说是不能无限的等待下去的,我们需要一个等待期限最好是尽快处理,此处的等待时间就通过定时器来实现了.
标准库中的定时器标准库中提供了一个Timer类.其核心方法为schedule.(注意不要自命名Timer类)schedule 包含两个参数. 第一个参数指定即将要执行的任务代码, 第二个参数指定多长时间之后 执行 (单位为毫秒).
上代码!
12345678910111213141516import java.util.Timer;import java.util.TimerTask;public class TimeKeeper { public static void main(String[] args) { Timer timer = new Timer(); //匿名内部类 继承 ...
Java多线程_0x6_
多线程篇六什么是单例模式?单例模式是最常见的 设计模式.顾名思义,单例模式指的就是单个实例的模式.(针对某些类只能使用一个对象的场景【如MySQL、JDBC、DataSource】)
设计模式设计模式是针对某些问题场景而产生的处理问题的方法.(就跟你想吃早饭,可以选择自己做或者出去买或者蹭别人或者别的解决方法一样)tips单例模式是线程安全的,能保证某个类在程序中只存在唯一一份实例而不会创建出多个实例.
单例模式又分为饿汗和懒汉两种.
饿汉模式创建的比较早,类加载时就创建出了.
123456789101112131415class Singleton { private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance() { return instance; }} public class TestSingleton { ...
Java多线程_0x5_
多线程篇五——wait和notify如笔者理解有误,欢迎交流指正⭐
线程的执行先后顺序难以预料【抢占式执行】,但是实际开发中我们会需要掌握当下线程的执行顺序.这就是wait和notify的作用.【都是Object方法即随便定义一个对象豆可以使用wait和notify】
wait()方法wait执行过程1.释放当前的锁2.让线程进入阻塞3.当线程被唤醒的时候重新获取到锁
上代码
12345678910public class Demo15 { public static void main(String[] args) throws InterruptedException { Object object = new Object(); synchronized (object) { System.out.println("waiting..."); object.wait(); System.out.println("end.& ...
Java多线程_0x4_
多线程篇四——volatile关键字如笔者理解有误,欢迎交流指正⭐
首先我们要明晰的一点是计算机运行程序或代码时经常要访问数据,这些依赖的数据往往存储在内存中.CPU使用变量的时候需要先从内存中读取出来放到CPU的寄存器中|由此我们可得读内存比读硬盘快,读寄存器比读内存快,但是CPU一旦涉及读/写内存速率很低.此时我们聪明得编译器就会帮忙了(虽然有时候会帮倒忙) 编译器可能会对代码做出优化,减少读内存的次数。提高整体的效率.
volatile能保证内存可见性上代码
12345678910111213141516171819import java.util.Scanner;public class Demo14 { public static int flg = 0; public static void main(String[] args) { Thread t1 = new Thread(() -> { while(flg == 0) { //啥也 ...
Java多线程_0x3_
多线程篇三如笔者理解有误,欢迎交流指正⭐线程安全划重点!!!
什么是线程安全想对线程安全做一个具体清晰的解释很困难,为什么这么说?当然是具体情况具体分析.(就像很多人都喜欢吃面条 有的人喜欢吃炸酱 有的人喜欢吃刀削【其他不具体拓展 因为饿了w】可以具体细分)
但是!我们可以这样认为 如果多线程环境下代码运行的结果是符合我们预期的 ,即使在单线程环境应得的结果,则说明这个线程是安全的.
产生线程安全的原因抢占式执行(系统内核)上我们熟悉的实例代码
1234567891011121314151617181920212223242526272829303132// 线程安全public class Demo13 { // 此处定义一个 int 类型的变量 private static int count = 0; public static void main(String[] args) throws InterruptedException { Object locker = new Object(); Object lo ...