自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 操作不是原子的与指令重排序

这两个都会引发线程安全问题。

2024-10-20 10:08:52 153

原创 线程安全问题的原因和解决方案

在编写多线程代码时,时常会出现预期结果与实际觉果不相符的情景,其中很大一部分是由于多线程的安全问题引起的,下面就谈谈为什么会产生线程安全问题以及都有哪些解决方案。

2024-10-20 00:32:28 1007

原创 LeetCode1658.将x减到0的最小操作数

题目的要求为要在数组的首、尾找到最少的若干个数,使得这些数的和等于x,若直接从题目条件入手,会发现要一会判断数组首元素,一会又要判断数组最后一个元素,就会非常麻烦,于是我们可以转变题目的意思,即在数组中找到若干个相邻的数使得这些数的和等于数组全部元素的和减去目标值;先用sum1加上right指向的元素,再将right向右移动一位,当sum1>sum - x时,用sum1减去left指向的元素,再将left向右移动,若存在sum1 == sum - x时,更新count的值,之后再次进行循环;

2024-10-18 23:47:43 336

原创 LeetCode1004.最大连续1的个数

由常规解法可知,在第一轮遍历的时候,结果为“1 1 1 0 0”,在下一轮遍历时,从第二个1开始,但由于“1 1 0 0”在第一轮遍历时已经判断为符合条件的数据,就会发生重复判断,因此,可以使用滑动窗口解决问题。让right开始向后移动,当right指向的元素为1时,继续向后移动,当right指向的元素为0时,将count加一;先定义两个指针left和right,均指向第一个元素,再定义一个变量count记录子串中0的个数;1.常规解法(会超时)

2024-10-18 22:15:56 285

原创 LeetCode3.无重复字符的最长子串

在常规解法中可以看到,第一次的子串为abc,第二次的子串为bca,而两个子串有重复的部分,即为bc,那么在第一次判断完成之后,由于下一次进来的a与子串中的a重复,于是就可以将1串中的字符逐个去除直到子串中没有a,在这种条件下,就可以使用滑动窗口来解题。先定义两个指针left和right,两指针均指向第一个字符,再定义一个用来计数的字符数组,范围为0-127;希望读者能够提出建议!

2024-10-16 00:07:20 292

原创 LeetCode209.长度最小的子数组

先让right向右移动,并用sum加上right指向的元素,当sum>=target时,可以求出符合条件的子数组的长度,这时可以让left向右移动,用sum减去left指向的元素,根据单调性,sum会越减越小,当sum<target时,left停止移动,继续上面的操作,当right指向数组外面时,最后的len就是结果。使用该方法的前提是数组中的元素全是大于等于0的,可以使用单调性解题。在上述代码中,使用了flag来判断是否有符合条件的子数组。1.常规解法(会超时)

2024-10-15 22:29:15 386

原创 线程的六种状态

线程状态一共分为NEW, RUNNABLE, TERMINATED, TIMED_WAITTING, WAITTING, BLOCKED.使用join后,main线程(主线程)等待thread线程执行结束后才能执行。可以在线程运行的时候使用sleep(1000)方法是该线程休眠1000ms。在java中,使用getStart方法可以获取到当前线程的状态。线程阻塞(不参与CPU调度,不继续执行),但阻塞时间要是有限的。2)线程随时可以去CPU上执行。线程结束但对象还在。

2024-10-15 00:15:59 155

原创 LeetCode18.四数之和

现保持p1和p2不动,让left与right相向运动,若(long)nums[left] + (long)nums[right] + (long)nums[p1] + (long)nums[p2] == target,则将这个四元组添加到结果中,由于不能出现出重复的四元组,就需要去除与left和right指向元素相同的元素;先定义四个指针p1,p2,left,right,p1指向最后一个数,p2指向倒数第二个数,left指向第一个数,right指向p2前一个数;希望读者指出不足之处!1.常规解法(会超时)

2024-10-12 14:09:04 1027

原创 线程中的join

main线程被阻塞,thread1与thread2先运行,由于thread1先于thread2结束,则thread2结束后“thread1.join()”是无效语句,mian接着运行。会使main线程阻塞,thread1与thread2同时运行,由于thread1运行时间短,则thread1会先结束,结束后thread2与main同时运行。会使mian线程阻塞,thread1与thread2同时运行,thread1结束后,thread2依然在运行,thread2结束后main才会运行。

2024-10-11 23:51:05 152

原创 LeetCode15.三数之和

去重:若使用contains判断三元组是否重复,代码就会超时,这时我们就要在nums[left] + nums[right] + nums[p] == 0时,将与left和right指向的数的相同的数去掉,由于这个数组是有序的,那么相同的数就会聚集在一起,只需要使用while循环去重即可;定义三个指针left,right,p,先将p固定在最后一个数,left在第一个数的位置,right在倒数第二个数的位置,接下来在每一轮循环中,保持p不动,只要移动left和right即可。希望大家积极指出不足之处。

2024-10-10 23:37:23 634

原创 Thread类的基本用法

注意,在使用lambda表达式时,若要使用外面的变量(main中的局部变量但不在lambda中的变量),则该变量不能被修改,因为使用时会触发变量捕获,由于lambda是回调函数,执行时机是很久之后(操作系统真正创建出线程后才会执行),有可能main先执行完,导致该变量在使用前就被销毁,于是该变量不能被修改。在上述代码中,都使用了Thread来创建线程thread,再使用start()方法来启动线程,虽然thread.run()也能使程序运行,但本质上并没有创建出一个新的线程,只是普通的方法调用。

2024-10-10 21:47:58 386

原创 进程,线程的区别与联系

只有第一个线程创建时(即和进程一起创建的时候)才申请资源,后续的线程创建都不申请资源;只有所有的线程都销毁(即进程销毁)才真正释放资源,运行过程中销毁某个线程也不会释放资源;进程内的线程会共享进程的内存资源、硬盘资源、网络带宽等;进程即运行起来的程序,由PCB构成,其中有若干属性。线程相当于一个要执行的任务,或是运行的一段代码指令。一个线程出现异常,若处理不当,就会带走整个进程。创建或销毁进程开销大,尤其是频繁的创建销毁;进程之间涉及到的资源时独立的,相对稳定;进程创建和销毁都需要申请资源;

2024-10-08 21:57:14 219

原创 LeetCode.179查找总价格为目标值的两个商品

判断left和right指向元素的和与目标值的大小关系,若和大于目标值,以right为基准,left右边的值均大于left指向的值,根据单调性,left右边的值与right相加的和均大于目标值,就需要让right向左移动一位;若和小于目标值,以left为基准,right左边的值与left的和均小于目标值,就需要让left向右移动一位。为了方便,我们可以先将数组从小到大排序,再定义指针left和right,left指向首元素,right指向末元素。1.常规解法(会超时)希望读者能指点一二!

2024-10-05 15:23:02 180

原创 LeetCode.611有效三角形的个数

保持p不动,判断left和right指向的元素之和与p的大小关系,若和大于p指向的元素,那么对于left、right、p指向的元素构成的三元组是能构成三角形的,同时,以right为基准,left到right之间的元素均大于left指向的元素,由单调性可知,left到right之间的元素与right相加的和也一定大于p指向的元素,那么count就要加上right - left,再将right向左移动一位;当right

2024-10-05 14:28:21 452

原创 LeetCode11.盛水最多的容器

定义两个指针left和right,left指向数组首元素。right指向数组最后一个元素,先求出left和right之间能盛多少水,再比较left和right指向的值,若left指向的值小于right指向的值,根据木桶效应(一个水桶能盛的最多的水取决于最短的那根木板)那么right左边的值由于木板长度不会变大(最大就是left指向的值),而且由于单调性,left与right之间的距离也会缩短,就导致之后盛的水一定没有当前left位置盛的水多,那么就应该向又移动left,以改变木板的最短长度;

2024-10-03 14:12:26 391

原创 LeetCode202.快乐数

将每一个数的每一位的平方的和求出后放到一个顺序表中,每一次都判断该数时候存在于顺序表中,若存在,则判断是否为1,若为1,则是快乐数,返回true;根据鸽巢原理,当一个数求其每一位的平方的和时,总会出现循环,即每一位平方的和均为其本身,这又两种情况,一是和为1,接下来怎么求都是1;二是和为其他数,但每一位的平方的和均为其本身。学过链表的同学应该都对这张图不陌生,和判断链表是否有环一样,都有一个循环,这是我们就可以根据快慢指针来判断是否有环,若两指针相遇,即有环,反之则无环。

2024-10-03 13:01:37 353

原创 LeetCode1089.复写零

由于队列有先进先出的特性,若使用队列存储数组元素则能维持数组元素顺序。

2024-10-02 00:07:02 467

原创 LeetCode283移动零

【代码】LeetCode283移动零。

2024-10-01 21:54:05 326

原创 操作系统,进程,PCB

3.内存描述符表,由于进程在运行过程中,需要和硬盘去交互,而硬盘上的数据,就是以文件形式组织的,每次打开一个文件,就会把文件信息保存到文件描述符表中,表中的每一个项,就对应着一个打开的文件,由于进程运行,执行指令,都是靠CPU的,因而进程也需要消耗CPU资源,即进程是操作系统中资源分配的基本单位;6.进程的上下文,一个进程执行一会,失去CPU,过一段时间后沿着上一次执行的状态继续往下执行,而不是从头执行,进程状态,进程的优先级,进程的上下文,进程的进账信息统称为进程调度。1.pid,进程标识符;

2024-09-28 16:50:45 342

原创 Java中栈遍历

方法三中第一段代码要先将栈中的数据个数求出来,再在for循环中使用len,不然在pop的过程中,栈中的元素个数会变少,使for循环提前结束,导致数据无法全部遍历到。方法一和方法二输出的数据顺序不是数据在栈中存储的顺序,而是遍历了集合中的元素;

2024-09-18 20:43:55 228

原创 二维数组与clear

代码结果却是 [ [1,1,1], [1,1,1] ],这是这是因为虽然list中存储的是list1的引用,但只有程序结束后才会回收list1的空间,所以list中可以一直存储list1中的数据,直到程序结束。

2024-09-11 22:21:53 171

原创 栈,队列与null

上面两组代码的运行结果均为3,这就说明,当向栈或队列放入null时,null相当于一个元素,只不过这个元素是一个空元素。null通常认为是空的意思,当向栈或队列中放入null时,相当于什么都没放吗?

2024-09-09 13:42:42 103

原创 ArrayList遍历

【代码】ArrayList遍历。

2024-08-31 13:58:00 270

原创 subList方法注意事项

List<E> subList(int fromIndex, int toIndex),fromIndex为开始下标,toIndex为结束下标,遵循左开右闭原则,list下标从0开始。介绍:subList用途是截取部分list;表示截取list中下标0到4的部分;

2024-08-31 13:41:19 168

原创 聚合函数与order by联系

要注意的是,由于第二个select返回的是一个新表,我们要对这个新表重名命名才能使用,否则会报错。常用的聚合函数有count(),sum(),avg(),max(),min()当我们要求倒数三名英语成绩的总和时,我们可以使用sum()与order by。1.在查找数据时,要先确定在哪张表中查找,即先执行from;3.执行select将查找结果加入到结果集中;4.最后执行 order by 对结果进行排列。2.再过滤符合条件的数据,即执行where;

2024-08-30 23:05:26 459

原创 Java可变个数形参的方法

方式1即调用方法1,但方式2会有异议,即是调用方法1还是方法2或是方法3,因为若调用方法1,即代表“1,2,3,4”放入nums数组中,正确;若调用方法3,即代表形参a为1,形参b为2,将“3,4”放入数组nums中,似乎都能说得过去,这是JVM就无法准确判断出应调用哪个方法,就会报错,因而在具体运用时,通常只会写通用的方法,保证程序正常运行。Add方法中,int ... nums 即为传入的多个形参,其中nums为一个数组,用来存储传入的形参,其遍历方式与普通的数组相同;

2024-06-20 01:33:49 133

原创 Java方法的重载

当我们要调用Add方法时,JVM虚拟机会根据传入的参数个数、参数类型来判断应具体调用哪一种Add方法,如Add(2,3)即调用Add(int x, int y)、Add(2,3,4)即调用Add(int x, int y, int z)、Add(2,2.4)即调用Add(int x,double y)。参数列表不同,即要求参数个数不同、参数类型不同、参数顺序不同。

2024-06-19 00:57:29 138

原创 Java变量

在Java中,数据类型分为基本数据类型和引用数据类型,基本数据类型有:int、short、long、double、float、boolean、char、byte;int、short、long、byte -> 0,float、double -> 0.0,char -> 空格,boolean -> false,若为引用数据类型,则默认数据类型为null;成员变量(属性):有,若在声明时没有显示地赋值,则会给变量赋默认的初始值,(3)变量必须先定义,再赋值(有的会自动赋值,有的需手动赋值),后使用。

2024-06-18 00:40:09 332

原创 Java异常

对于现有的异常类,可能有时候并不能准确表达出我们想要的异常,这是我们就可以自定义异常类供我们使用。定义方式:该异常类继承于现有的异常体系,通常继承于RunTimeException 或 Exception;提供几个重载的构造器;具体代码。

2024-06-07 05:03:49 684

原创 Java多态

多态

2024-05-26 00:26:51 259

原创 Java代码块

代码块

2024-05-25 23:25:52 203 1

原创 初阶扫雷游戏

以上即为初阶扫雷的代码,对于该游戏,还有许多可拓展的地方,如:如果排查位置不是雷,周围也没有雷,可以展开周围的一片、是否可以标记雷等,读者可以继续思考,完善代码。在扫雷游戏中难度分为初阶,中阶和高阶,对于初阶扫雷,其为9*9的棋盘,其中有10个雷,若玩家踩到其中一个雷,即游戏失败。可是还有一个问题,玩家不能看到该棋盘,不然信息就泄露了,所以在设计棋盘时,设计两个棋盘,一个供我们自己调试(MeSee),另一个供玩家看(YouSee)第二个代码为搜索周围有几个雷,将雷的个数传到第一个函数中;

2024-01-23 15:10:49 450 1

原创 C语言分支语句

表达式必须为整形表达式,若结果为字符型,则会转化为对应的ASCII码,相同的,case后的值也必须整型常量表达式,若为字符则用 ' ' 括起来,case与其后的值之间必须要有一个空格,default可有可无,它的存在可以使语句更为完整与严谨,default可以在switch语句的各个地方,不影响程序的运行。当判断条件1为假时,程序自动跳转至判断语句2,若判断语句2为真时,进入 else if 执行语句2,且语句2执行完后直接跳出 if else 结构,不执行语句3;一、if else语句。

2023-12-06 02:31:07 564 1

原创 判断两个整数的最大公约数与最小公倍数

在这里定义了两个判断对象num1与num2,同时又定义了两个变量max与min,并对num1与num2的大小进行判断,大的赋给max,小的赋给min;在这里我们使用for循环进行判断,判断完成后用break跳出循环.

2023-11-30 02:07:36 499

原创 初识C语言中的strlen与sizeof

计算较复杂字符时,须对字符进行划分,如 "c:\test\bit\113.c" ,对其划分的结果如下:'c' ':' '\t' 'e' 's' 't' '\b' 'i' 't' '\113' '.' 'c' ,所以该字符为12个字节。如"abc"即为一个字符串,它由'a','b','c','\0'四个字符构成,而'\0'是"abc"结束的标志,及使用strlen计算"abc"的长度时,当遇到'\0'时,计算停止。有'\0','\t'等,转义字符均算为一个字符。

2023-11-22 01:57:08 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除