- 博客(22)
- 收藏
- 关注
原创 有限状态机
随后,它顺序地读取字符串中的每一个字符,并根据当前状态和读入的字符,按照某个事先约定好的「转移规则」,从当前状态转移到下一个状态;根据题意,「初始状态」应当为状态 1,而「接受状态」的集合则为状态 3、状态 4、状态 6、状态 9 以及状态 10。换言之,字符串的末尾要么是空格,要么是数字,要么是小数点,但前提是小数点的前面有数字。其中,一个状态可能既是「初始状态」,也是「接受状态」。自动机驱动的编程,可以被看做一种暴力枚举方法的延伸:它穷尽了在任何一种情况下,对应任何的输入,需要做的事情。
2024-05-09 14:14:53
489
原创 HTTP协议及HTTPS
摘要算法用来实现完整性,能够为数据生成独一无二的「指纹」,用于校验数据的完整性,解决了篡改的风险。客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,说明数据是完整的。服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。
2024-04-29 21:25:55
616
原创 华为实习笔试0410
第2到n+1行表示云服务的计费日志,共4列,第1列表示时间戳(是一个数字字符串,长度为10) 、第2列表示客户标识(是一个字符串,长度为1-16),第3列表示计费因子 (是一个字符串,长度为1-16,计费因子查不到时认为计费因子单价是0),第四列表示计费时长时长(范围为0-100,当计费时长不在范围内要认为是计费日志有问题,当成计费为0处理),这4个字段使用迈号分隔。每个客户的话单总费用,共2列,第1列表示客户名,第2列表示话单费用,2列用逗号分割,输出按客户标识字典序升序排序。对输入的字符串进行拆分;
2024-04-11 23:18:18
2457
原创 多线程的竞争协作和互斥同步
接着,轮到生产者执行 P(emptyBuffers),表示减少 1 个空槽,如果当前没有其他生产者线程在临界区执行代码,那么该生产者线程就可以把数据放到缓冲区,放完后,执行 V(fullBuffers) ,信号量 fullBuffers 从 -1 变成 0,表明有「消费者」线程正在阻塞等待数据,于是阻塞等待的消费者线程会被唤醒。,当多线程相互竞争操作共享变量时,由于运气不好,即在执行过程中发生了上下文切换,我们得到了错误的结果,事实上,每次运行都可能得到不同的结果,因此输出的结果存在。
2024-04-11 20:07:37
935
原创 计算二进制中1的个数
如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。输入一个整数,输出该数32位二进制表示中1的个数。
2024-04-09 14:42:48
275
原创 C++17 string_view
C++ 中的 string 类型在堆上存放自己的字符串数据,所以当你处理 string 类型的时候,很容易就会产生(堆)内存分配。在实际应用中,字符串操作会很频繁,频繁的内存分配会拖慢程序的运行速度。实际上在不同的编译器中结果似乎是不同的,在gcc中打出如上代码后并没有获得一样的结果,在gcc中PrintName函数中的引用并没有向堆申请内存,而vc编译器却向堆申请了内存。这是因为:gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。
2024-04-09 14:38:18
412
原创 操作系统-进程和线程
线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程都有独立一套的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程的优缺点?一个进程中可以同时存在多个线程;各个线程之间可以并发执行;各个线程之间可以共享地址空间和文件等资源;当进程中的一个线程奔溃时,会导致其所属进程的所有线程奔溃。举个例子,对于游戏的用户设计,则不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。为什么进程中的一个线程崩溃之后所有线程都会崩溃?
2024-03-26 23:05:48
887
原创 操作系统-操作系统结构
Windows和Linux是我们比较熟悉的两个操作系统,其中Windows系统不开源,在商业上取得了较大成就,而Linux系统开源,服务器所使用的的操作系统基本是Linux,任何人都可以下载Linux并增加自己的改动和功能。这两个系统各有特点,操作系统的核心是内核,可以从内核角度对它们进行比较。首先,我们要知道什么是内核。我们都知道,计算机是由各种外部硬件设备组成的,比如内存,CPU,硬盘等,如果我们使用的,系统性能也会受到很大的影响。那么,我们知道了内核的基本概念之后我们来了解内核是怎样工作的?
2024-03-25 21:09:08
908
1
原创 操作系统-硬件结构和内存管理
操作系统---图解系统(小林coding)_图解操作系统-优快云博客20 张图揭开「内存管理」的迷雾,瞬间豁然开朗_20张图揭开内存-优快云博客
2024-03-24 22:09:10
1893
1
原创 2024.3.20华为实习笔试题 安排座位
一列具有 m 个座位的火车,从起点到终点共停靠 n 个站点,站点编号从0到n-1。发车前有x名乘客预定了座位,因为预定数量可能超出座位数,为了保证效率最大化,请计算如何分配才能是座位利用率最大,并输出最大的座位利用数。说明:座位利用数定义为每个座位被使用的站数。例如有两个座位,第一个座位从第 0到 10 站有人坐(表示从0站上车,10站下车,第10站不占座,所以利用率是10-0=10),第二个座位从第1到9站有人坐,则座位利用率为(10-0)+(9-1)=18。
2024-03-21 23:08:25
593
2
原创 求二叉树深度 和 二叉树高度
求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)求深度适合用前序遍历,而求高度适合用后序遍历。
2023-12-12 14:55:07
59
原创 priority_queue(优先级队列)
在C++中,priority_queue是一个容器适配器,它提供了常数时间的最大元素查找。它通常实现为堆。堆是一种数据结构,其中最大(或最小)元素始终位于顶部。priority_queue是一个模板类,定义在头文件中。它有三个模板参数:元素类型、容器类型和比较函数类型(可选)。默认情况下,它使用std::vector作为其底层容器。
2023-12-05 11:29:29
95
1
原创 滑动窗口问题
在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。只不过这种解法更像是一个窗口的移动,所以叫做滑。
2023-11-21 14:45:17
78
原创 vector容器删除元素
要移除目标元素,就没有库函数可以使用,那就需要对其他元素进行处理,进行覆盖和前移,比较暴力的思路是发现目标元素后,将后面的所有元素都前移覆盖原来的元素,这种方法需要两个for循环,时间复杂度为。,通过有两个指针和一个for循环将所有元素分为两个部分,,由于pop_back删除的是最后一个元素,所以先。如果从数组的角度理解,因为数组存储的内容。的角度思考,我们可以通过一次遍历。使用快慢指针删除所有目标元素。,这里不详细讲这种写法。(2) 使用快慢指针。
2023-11-21 12:35:17
712
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人