23/11/3 算法每日一题
题目1: 115. 不同的子序列给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 + 7 取模。
eg1:abbbit”, t = “rabbit”输出:3
1234567891011121314151617181920212223class Solution { public static final int N = (int)1e9+7; public int numDistinct(String s, String t) { //dp[i][j]表示在 s[i:] 的子序列中 t[j:] 出现的个数。 //上述表示中,s[i:]表示 s 从下标 i 到末尾的子字符串,t[j:] 表示 t 从下标 j 到末尾的子字符串。 //当s[i]==t[j]时,dp[i][j]=dp[i+1][j+1]+dp[i+1][j]; //当s[i]!=t[j]时,dp[i][j]=dp[i+1][j] int m = s.length(), ...
java基础刷题笔记12
Java刷题笔记12T1 Switch支持的数据类型
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。
在Java7中,也支持了String类型 String byte short int char Enum 类型
T2 线程锁的对象
同步代码块(synchronized(this),synchronized(类实例对象),锁是小括号()中的实例对象)
同步非静态方法(synchronized method),锁的是当前对象的实例对象
T3 互斥锁
采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。
任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。
A.可以获得对任何对象的互斥锁定,”任何”错误。
B 线程的创建方式与线程之间互斥无关
C ...
java基础刷题笔记11
Java刷题笔记11T1 自定义类的引用/值传递问题
在调用second方法时传进来了一个引用,然后 v.i=20 将引用地址上的i改成了20
通过new 创了一个新的Value,让引用指向新创的value,所以在second方法内输出的就是新创建的value的内容
然后返回main函数,由于原来的v指针并没有改变,但是其中i的值在second方法中被改为了20,所以在main中v.i输出为20
T2 ArrayList的扩容问题
Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8
如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容
T3 JVM内存区划
JVM内存区:程序计数器、虚拟机栈、本地方法栈、堆、方法区(包括常量池)。
不属于JVM内存区:直接内存(Direct Memory),用户I/O操作
T4 JDK8 与 接口的方法/变量修饰符JDK8及以后,允许我们在接口中定义static方法和default方法。
在jdk8之前,interface之中可以定义变量和方法,变量必须是public ...
JaveEE基础多线程
多线程与反射多线程首先回顾进程的概念
进程是程序执行的实体,每一个进程都是一个应用程序,CPU一个核心同时只能处理一个进程,当出现多个进程需要同时运行时,CPU一般通过时间片轮转调度算法,来实现多个进程的同时运行
在一个进程中同时执行多个任务需要借助线程
线程是程序执行中一个单一的顺序控制流程, 一个进程可以有多个线程, 线程是程序执行流的最小单元, 各个线程之间共享程序的内存空间, 线程之间切换速度也高于进程
线程的创建和启动我们可以通过创建一个Thread对象来创建一个新的线程,在Thread构造方法中只需要传入一个Runnable接口的实现,所以这里可以直接使用lambda表达式
1234567public static void main(String[] args) { System.out.println("我是主线程! "); Thread t = new Thread(() -> { //直接编写逻辑 System.out.println("我是另一个线程!"); & ...
Redis6 学习笔记
Redis 6 笔记NoSQL概论NoSQL全称Not Only SQL,它是一种非关系型的数据库,相比传统SQL关系型数据库,它有以下特点
不保证关系数据的ACID特性
不遵循SQL标准
消除数据间相关性
优势
性能远超传统关系型数据库
灵活易于扩展
数据模型灵活
高可用
=> 海量高并发数据解决方案
NoSQL数据库分为以下几种
键值存储数据库: 所有数据都以键值方式存储,类似于HashMap,使用简单,性能高
列存储数据库: 通常用来应对分布式存储的海量数据; 一个键会指向多个列
文档型数据库: 以一种特定的文档格式存储数据;
图形数据库: 用类似于图的数据结构存储数据,结合相关算法实现高速访问
Redis数据库就是一个开源的键值存储数据库,所有数据都存放在内存中,性能远远高于磁盘IO, 并且支持数据持久化,横向扩展,主从复制等等
实际生产中,需要将MySQL和Redis在不同情况下搭配使用
基本操作与MySQL不同,Redis不具有像MySQL那样严格的表结构; 它是一个键值数据库,因此,可以用像Map一样的操作方式,通过键值对向Redis数据库中添加数 ...
java基础刷题笔记10
Java刷题笔记10T1 局部变量
局部变量必须有初始值
成员变量(定义在类中的变量): 可以不进行初始化,Java会自动初始化
局部变量(定义在方法中的变量): 必须进行初始化
类变量(static修饰): 随着类的加载而加载
常量(final修饰)
T2 subSet方法
subSet是指向原数据的,原数据修改,subSet也跟着修改。
subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。
T3 Math.ceil()
1Math.ceil(d1)
ceil 方法上有这么一段注释:If the argument value is less than zero but greater than -1.0, then the result is negative zero
如果参数小于0且大于-1.0,结果为 -0
1Math.floor(d1)
ceil 和 floor 方法 上都有一句话:If the argum ...