- 博客(63)
- 收藏
- 关注
原创 贪心算法 day08(加油站+单调递增的数字+坏了的计算机)
思路:gas[index] - cost[index],ret 表示的是在i位置开始循环时剩余的油量a到达的最大路径假设是f那么我们可以得出 a + b + c + d + e +f < 0 那么从b开始的话到达f那也是小于0的无法循环(b是正数 即只能从正的位置开始循环)
2025-04-10 09:17:55
396
原创 网络原理-初识
独立模式:计算机之间相互独立。每个终端A、B、C各自持有客户端数据随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即可以多个计算机协调工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。数据共享的本质是,即计算机通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以分为和。。局域网主机之间能够方便的进行通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。局域网组件网络的方式有很多:(1)基于网络直连(2)基于集线器组建。
2024-11-30 18:53:59
924
原创 文件内容的读写
java中针对文件内容的操作主要是通过一组“流对象”来实现。计算机中的流和水流非常相似,如果要节100ml水我们可以一次就接完,也可以分2次一次接50ml,分10次一次接10ml等等,文件读写也是类似的,从文件读取100字节数据,1次把100字节都读完,分2次一次读50字节,分10次一次读10字节等等可以有很多种方式。因此计算机中针对读写文件也是使用流(stream)词,流是操作系统层面的术语和语言无关各种编程语言操作文件都叫流。java中提供了一组类表示流。
2024-11-26 11:57:17
1020
原创 贪心算法 day07
链接:. - 力扣(LeetCode)题目思路: 代码:2.跳跃游戏 II链接:. - 力扣(LeetCode)思路: 代码:3.跳跃游戏1链接:. - 力扣(LeetCode)思路:和上一题差不多,只是当无法到达最后一下标时left会大于right无法进入循环返回false
2024-11-20 16:39:46
448
1
原创 文件操作和Io
我们来看看file类中常见属性、构造方法和方法构造方法中,参数String文件的路径使用绝对路径和相对路径均可pathSeparator是分隔符getPath()可能返回的是相对路径也可能是绝对路径。
2024-11-20 16:35:32
918
原创 线程安全的集合类(ArrayList、Hash)
在实际开发中,用到的Hash表很可能比较大(桶有很多个),即使多线程访问上述的Hash表,同一时刻两个线程恰好访问同一个链表的可能性概率比较低。利用的是写时拷贝思想。当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行copy,复制出一个新的容器,复制过程中如果有其他线程在读就直接读取旧版本的数据,虽然复制过程不是原子的但是提供的是旧版本不影响其他线程读取,然后在新的容器添加元素同时把引用由旧数组指向新数组。1.发现需要扩容的线程,只需创建一个新的数组,同时只搬几个元素过去。
2024-11-16 17:31:48
875
原创 JUC的常见类
callable接口和Runnable接口是并列关系,但是Runnable返回值是void重写的是run方法更注重执行的过程而不是结果,而callable重写的是call方法,call是有返回值的返回值的类型是泛型参数。
2024-11-16 14:47:27
927
原创 贪心算法day 06
思路:计算每个字符个数如果是偶数个那么肯定可以组成回文串,如果是奇数个就会有一个无法组成回文串,但是在最中间还是可以有一个不是成队的字符这个字符就从多的奇数中随机取一个就好。这里使用模拟hash的方式来实现每个字符的计数。
2024-11-14 20:18:53
421
原创 多线程进阶
CAS上面的代码不属于原子的,但是CAS是一个原子的硬件指令完成操作。我们可以试着理解这份伪代码,其中的address指的是内存地址,expectValue指的是寄存器的值,swapValue是另一个寄存器的值。先判断内存中的值和寄存器1的值是否一致,如果一致就把内存值和寄存器2进行交换,但是基本上只是关心交换后内存的值,不关心寄存器2的值,这里也可以理解成赋值。
2024-11-11 12:03:31
1202
原创 synchronized总结
synchronized确保同一时间只有一个线程可以进入同步块或同步方法,避免了多线程并发访问共享资源的冲突问题。下面我们来看一个例子,两个线程获取同一个锁,锁被占用后,剩下的那个线程就会进行阻塞等待。由结果我们可以知道,线程一释放锁后,由唤醒线程二才能获取到锁。
2024-11-11 11:49:11
941
原创 贪心day04(买卖股票的最佳时机)
思路:我们其实只需遍历一篇就可以解决这个问题。首先我们定义一个min为无穷大值,再遍历只要有数字比min跟小我们就更改min的值就好,此时我们只需要找出prices[i]-min的最小值就好。思路:从下面的曲线图我们可以看出,只要是上涨的地方我们就进行买卖。2.买卖股票的最佳时机二。
2024-11-09 16:48:18
311
原创 贪心算法day03(最长递增序列问题)
思路:我们只需要设置两个数进行比较就好。设a为nums[0],b 为一个无穷大的数,只要有比a小的数字就赋值a,比a大的数字就赋值b,如果有比b大的数字说明可以组成一个三元子序列直接返回true。
2024-11-08 20:35:08
476
原创 贪心算法day02(最长递增子序列)
目录1.最长递增子序列方法一:动态规划方法二:贪心+二分查找1.最长递增子序列链接:. - 力扣(LeetCode)方法一:动态规划思路:我们定义dp[i]为最长递增子序列,那么dp[j]就是在小于i范围内的最长子序列,最长子序列最少为1,所以dp数组初始化为1.代码实行步骤如下:这种情况下时间复杂度为O(n*2) ,空间复杂度为O(n)具体实现如下:class Solution { public int lengthOfLIS(i
2024-11-05 10:04:18
475
原创 定时器的实现
在这样的情况下我,如果们可以创建多个线程,负责执行这里的队列中的任务,一个负责执行这里的队列中的任务,一个负责扫描,扫描到需要执行的任务,添加到另一个线程池的任务队列中,由多个线程负责执行。2.如果当前时刻为14:00 队首任务时刻为14:30 ,本来是要wait30分钟的但是十分钟过去了恰好有一个新的任务添加来了,调用了schedule 添加了14:20的新任务来执行,如果是sleep那么无法被唤醒意味着14:20这个任务无法执行。定时器是软件开发中的一个重要组件类似一个闹钟,时间到了就执行一些逻辑。
2024-10-31 09:12:16
1126
原创 贪心算法day 01
注意点:double t = queue.poll()会将queue队列数字减少一个后再除以2,queue.offer(queue.poll()/ 2)思路:把数子画成波峰波谷 左右端点以及波峰波谷就是我们要找的最大摆序列。问题:如何表示波峰波谷以及什么情况下添加最大摆动序列。主要问题:如何将数字改为字符串以及排序。思路:创建大跟堆将最大的数进行减半。
2024-10-27 19:11:14
495
原创 Thread类阻塞队列的用法练习
所谓的死锁就是线程一拥有锁1,线程二拥有锁2,双方在拥有自身锁的同时尝试获取对方的锁,最终两个线程就会进入无线等待的状态,这就是死锁。给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.实现代码, 能够创建两个线程, 对这个数组的所有元素求和.需要让他们同时启动,并按 c,b,a的顺序打印。有三个线程,线程名称分别为:a,b,c。有三个线程,分别只能打印A,B和C。每个线程打印自己的名称。
2024-10-27 11:49:38
357
1
原创 线程安全问题以及单例模式
在这段代码中,Sc.next()是带有阻塞的操作等待用户在控制台输入,notify这里同样也是需要先拿到锁再进行notify(属于java给出的限制),wait操作必须搭配锁来进行因为wait需要释放锁,但是notify操作原则上说不涉及加锁的操作但是java也是强制要求notify搭配synchronized,线程、锁都是操作系统本身支持的特性,wait和notify在操作系统中也有原生的对应的api,原生api中wait必须搭配锁来使用notify则不需要。但是我们不是在单例模式下只能实例一次的吗?
2024-10-22 07:58:40
918
原创 关于线程安全
按照之前对锁的设定,第二次加锁的时候就会产生阻塞等待,直到第一次的锁被释放,才能获得到第二个锁,但是释放第一个锁也是由该线程完成的,结果线程躺平了,啥也不干,也就无法进行解锁这样的操作,这时就会产生死锁的现象。但是在java中为了很好的解决这些问题,在synchronized中引入了可重入的概念,但是在c++中不具有这样的特性很容易就产生死锁的现象。
2024-10-19 16:06:28
952
1
原创 Thread类的基本用用法
线程创建需要Thread类但是不需要import导入是为什么?因为java.lang默认import不需要导入,java.lang中包含Thread为什么在MyThread类中只能使用try catch 无法使用throws?因为父类Thread run中没有throws结果:一直循环下去hello main 和 hello world谁先谁后都有可能,这是两个线程调度顺序是随机的,无法预测谁先执行谁后执行。
2024-10-14 21:43:24
850
原创 进程与线程的区别与联系
进程就是一个的程序,现在的操作系统百十来个进程很常见,这么多进程需要操作系统来管理防止系统出现紊乱,那操作系统如何管理进程呢?首先使用结构体描述出进程的核心属性,描述时形成的结构体就是进程控制块(PCB),进程控制块(PCB)是一个非常大的结构体,有很多属性,同时进程中还有PID(进程的身份标识符)。
2024-10-12 11:40:15
1023
2
原创 Thread类的用法练习(1)
由于打印1 和 打印2分别在不同的线程中执行,具体先执行哪个线程是由系统决定的,且无法预测,所以两种情况都有可能。4.实现 Runnable, 重写 run, 使用匿名内部类。3.继承 Thread, 重写 run, 使用匿名内部类。2.实现 Runnable, 重写 run。6.请回答以下代码的输出, 并解释原因。此题可能输出结果为 2 1 或 1 2;5.使用 lambda 表达式。
2024-10-11 19:20:46
266
原创 day04笔试练习
题目思路:定义 a b c 三个变量 使 c 一直加到比 n 大的最近的斐波那契数 此时比较 c 和 b 哪个数离得最近就好。
2024-10-04 17:57:22
371
原创 day03 笔试练习
同时left下标向右移动一位,right在之前的位置上继续右移,因为输入的数字都是大于1的数字所以right没必要从left新下标开始相加,left右移sum只会减少,而right下标是第一次出现sum相加大于等于x的下标,所以前面的数字相加肯定是小于x的。我们创建两个变量 left,right,都从1下标位置开始记录,right一直向后移动直到相加的结果大于等于x的时候开始更新 retLeft 和 retRight 下标(retLeft 和 retRight指的是相加结果大于等于sum目前最小区间下标)
2024-10-04 00:37:52
597
原创 day02笔试练习
接着我们在第一次出现str1 或者 第一次出现 str2 的位置的右边查看是否有 str2 或者 str1,如果有的话 prev2 和 prev1 存放该位置 再把 prev1 存放的位置和 prev2 存放的位置进行相减存放在ret中。首先: 我们遍历给出的字符串找到第一个出现str1 或者 str2 的位置,同时我们再创建两个变量 prev1 和 prev2,prev1 存放 str1 所在的位置 prev2 存放 str2 所在的位置。
2024-10-02 23:40:54
516
1
原创 day01笔试练习
该题通过枚举和拆分数字来解决问题首先把【L,R】之间的数字列举出来,这种方式我们称为枚举再对数字通过余10的方式判断该数字个位、十位、百位是否为2初次余10只能判断个位,要想判断十位、百位 则需要通过除10的方式进一步舍去之前判断过的位数因此我们需要先余十判断个位,再除十去掉个位,再余十判断十位 ,依次进行余十除十的操作。
2024-09-26 09:12:08
267
原创 索引的使用
6.const,system:单表中最多右一个匹配行,查询起来非常迅速,例如根据主键或唯一索引查询。system是const类型的特例,当查询的表只有的情况下,使用system。3.range:扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、< 、> 等的查询。5.eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。4.ref:使用非唯一索引或非唯一索引前缀进行查找,不是主键或不是唯一索引。explain +语句。3.子查询中使用索引。
2024-09-21 22:02:36
492
原创 索引的介绍
MYSQL的索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得表的查询可以通过对索引的搜索来加快速度。MYSQL索引类似于书籍的目录,通过指向数据行的位置,可以快速定位和访问表中的数据,比如汉语字典的目录页,我们可以按照笔画、偏旁部首、拼音等的目录(索引)快速查找需要的字。1.2 为什么要使用索引使用索引的目的只有一个,就是提升数据检索的效率,在应用程序的运行过程中,查询操作的频率远远高于增删该的评率2.索引应该选择哪种数据结构HASH。
2024-09-19 22:06:54
1188
原创 顺序表与链表练习
解析:链表的插入和删除不是所有情况下都比顺序表快,比如尾插尾删,顺序表的时间复杂度为O(1),并且如果是单链表,如果要在中间某个节点的前面插入/删除一个节点,则需要遍历。B错误:链表中的元素在内存中不一定连续,因为new的时候,会从堆上分配空间,具体分配出来的空间是否每次都连续,这个不一定。A正确:链表中节点之间是通过next引用相互指向的,故插入或者删除元素时只需要修改几个引用的指向即可,不需要搬移元素。D错误:LinkedList中插入或者删除元素,只需要修改几个引用的指向即可,不需要搬移愿意,
2024-09-07 13:04:19
1231
1
原创 栈的概念练习
有效长度一般是rear-front, 但是循环队列中rear有可能小于front,减完之后可能是负数,所以需要+N,此时结果刚好是队列中有效元素个数,但如果rear大于front,减完之后就是有效元素个数了,再加N后有效长度会超过N,故需要%N。选项B中,一个栈模拟入队列,一个栈模拟出队列,出队列时直接弹出模拟出队列栈的栈顶元素,当该栈为空时,将模拟入队列栈中所有元素导入即可,不是每次都需要导入元素,故错误。选项C中,一个栈模拟入队列,一个栈模拟出队列,入队列时,将元素直接往模拟入队列的栈中存放。
2024-09-04 00:16:00
845
原创 LinkedList与链表
由于在,时间复杂度为,效率比较低,因此ArrayList不适合在任意位置插入或者删除元素,因此引入了LinkedList,即链表结构。
2024-09-03 23:45:12
1269
原创 List与ArrayList
ArrayList是以泛型方式实现的,使用时需要实例化;同时ArrayList 实现了RandomAccess 接口、Cloneable接口、Serializable接口 表明ArrayList支持随机访问,可以clone,支持序列化。但是,ArrayList 在单线程下可以使用,在多线程中可以选择Vector,同时ArrayList可以动态扩容。
2024-09-03 14:50:14
589
原创 包装和类练习(1)
因为数组是有序的所以重复的元素都在一起,只需要前面的值与后面的值相比较就好了,如果不同键j向前移动,进行计数最后得到数组没有重复数字的长度。这里使用双指针法来实现,如果不是要找的val值就把值赋值给left,这样就可以排除val来计算新数组的长度。B. long和double都占了64位(64bit)的存储空间。C.默认的整数数据类型是int,默认的浮点数据类型是。,可以用包装类替代基本(简单)数据类型。Boolean就是它的包装类。声明的变量中也具有静态方法,A.基本(简单)数据类型。
2024-09-03 12:04:34
331
原创 包装和类练习 Stack的使用
A错误,如果是链栈,一般需要进行头插或者头删操作,而顺序栈一般进行尾插和尾删操作,链表的操作比顺序表复杂,,每次入栈相当于链表中头插一个节点,A.插入操作更加方便。B.删除操作更加方便。C.入栈时不需要扩容。
2024-09-01 16:56:45
323
原创 平衡二叉树(AVLTree)
平衡二叉树,又称AVL树,用于解决二叉排序树高度不确定的情况,如果二叉排序树的子树间的高度相差太大,就会让二叉排序树操作的时间复杂度升级为O(n),为了避免这一情况,为最坏的情况做准备,就出现了,使树的高度尽可能的小,其本质还是一棵二叉搜索树。
2024-08-21 15:42:12
1572
1
原创 数据库约束练习(2)
5.现在有员工表、部门表和薪资表。7.已知T1和T2的字段定义完全相同,T1有5条不同数据,T2有5条不同数据,其中T1有2条数据存在表T2中,使用UNION语句查询这些数据,要求重复数据不出现。查询要求的是每个部门的信息,所以要按照部门进行分组,部门和员工为1:m,员工与薪水为1:m,查询要求有部门,有薪水,所以必须关联3张表查询。说明:查询要求的信息有部门,有人数,人数只能从员工表中获取,所以关联表为部门表/员工表。解析:关联查询没有任何条件时,是返回笛卡尔积的结果,行数为乘积,列数为两张表的列相加。
2024-08-20 10:48:07
618
原创 数据库约束练习(1)
解析:按照题目和答案中相同的部分可以知道,class字段是一个字符串,score字段是一个数值型,查询字段有class,和一个聚合函数score字段的平均值,表达的意思是,查询班级信息,以及该班级的所有分数的平均值。至少被订购过两次,说明同一个productid的产品,至少有两条数据,可以先按照productid分组,这样结果就是同一个产品的数据,再分组后过滤数据大于1行的,使用group by...having操作,进行分组后过滤。B先过滤,按照字符串比较(自然序列比较)之后的数据集,再进行分组。
2024-08-17 16:18:55
528
原创 数据库基础增删改练习
4.查询book图书表中,作者author列不为空,或者满足条件:价格price在50元以上且出版日期publish_date在2019年之后的图书信息。2.查询article文章表中,发表日期create_date在2019年1月1日上午10点30分至2019年11月10日下午4点2分的文章。3.查询article文章表中,文章标题title为空,或者满足发表日期create_date在2019年1月1日之后。1. ID在1至200或300至500,且账号accout列不为空。
2024-08-17 15:01:36
295
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人