- 博客(172)
- 资源 (2)
- 收藏
- 关注
原创 iOS自定义过渡动画
转场方式首先让我们来了解iOS转场的方式:UINavigationController push/pop UIViewController导航栏的转场UITabBarController 切换Tab的转场present/dismiss 模态的方式转场这是iOS提供的3种基本转场方式,默认的转场方式转场风格有限。例如模态转场中,尽管有modalPresentationStyle和mod...
2020-02-02 21:11:30 3816
原创 黑马点评项目笔记
基于推模式实现关注推送:blog保存到数据库的同时,推送到粉丝的邮件箱,收件箱使用Redis的SortedSet满足时间戳排序,查询收件箱数据时实现分页查询(滚动式分页,数据不断变化,数据的角标也在变化。查询缓存未命中获取互斥锁,查询数据库重建缓存数据,写入缓存,释放锁。版本2的问题:线程1判断锁标识和释放锁之间阻塞,锁TTL超时释放,线程2获取锁执行业务前,线程1阻塞结束后释放锁。版本1的问题:线程1业务阻塞,锁TTL超时释放,线程2获取锁执行业务中,线程1执行完任务释放线程2的锁。
2024-05-09 20:05:22 469
原创 CSAPP - Bomb Lab
该lab还是花了不少时间去阅读汇编代码,在各种跳转中有些眩晕。通过使用gdb调试工具,查看反汇编代码,分析汇编代码和内存分布来找到解题答案。加强了对汇编语言的理解,寄存器的使用,栈空间的使用等。
2023-03-09 15:40:17 513
原创 彻底弄懂二维数组与指针
#include <stdio.h>int main(){ int a[2][3]; /* * &a * int (*)[2][3] * 数组的地址 */ int (*p1)[2][3] = &a; printf("%p\t%p\n", p1, p1+1); /* * a * int (*)[3] * 数组第0行的地址 (a = &a[0]) */ int (*p2)[3] = a; printf("%p\t%p\n", p
2021-10-07 22:55:53 353 1
原创 指针常量与常量指针的小问题
问题阅读以下代码,是否能正常运行?如果能,正常运行输出什么?如果不能,哪里有错误?#include <stdio.h>int main(int argc, char const *argv[]){ char *ptr1 = "hello"; char str1[10] = "world"; *ptr1 = 'w';// 错误 ptr1 = str1;// 正确,可以修改常量指针的指向 *str1 = 'w';// 正确,可以修改指针常量的指向内容 str1 = pt
2021-10-07 19:51:58 253 1
原创 Ubuntu20英文版使用搜狗输入法解决方案
首先访问搜狗输入法Linux下载网站,下载并保存文件到常用位置。添加中文语言支持,安装搜狗输入法,参考搜狗输入法for Linux安装语言检查是否有搜狗拼音。在Input Method Configuration中添加,搜索查找sougoupingyin。尽情使用搜狗输入法。...
2021-09-05 14:11:02 620 1
翻译 Docker技术初探
DockerDocker官方网站Docker是什么Docker是Moby项目的一个子集,基于服务器和云构建、运行和管理容器的软件框架。术语“docker”可以指工具或者Dockerfile文件格式。在过去当你想要运行一个网络应用程序,你需要购买服务器,下载Linux,配置LAMP环境(LAMP是指用来构建Web的服务器套件,由操作系统Linux,网页服务器Apache,数据库管理系统MySQL,编程语言PHP),然后运行你的app。如果你的app非常受欢迎,你需要设置第二个服务器来确保应用程序不
2021-09-04 06:11:50 168
原创 [数据结构]--二叉树的链式表示
#include <iostream>#include <windows.h>using namespace std;typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;// 先序次序输入二叉树中结点的值,创建二叉链表表示的二叉树void createTree(BiTree &T) { char ch; cin >> ch
2021-04-22 20:22:07 339
原创 [数据结构]--模式匹配KMP算法
#include <iostream>#include <cstring>using namespace std;#define MAXLEN 255typedef struct { char ch[MAXLEN+1]; // 0号位置不存储字符 int length;}SString;int n[100];bool initSString(SString &s, char *str) { int len = strlen(str); for (i
2021-04-11 15:36:50 181
原创 [数据结构]--模式匹配BF算法
算法步骤:利用计数指针i和j指向主串S和模式串T中当前正待比较的字符位置,i初始为pos,j初始为1。两个串未比较到串尾,执行循环操作:s.ch[i]和t.ch[i]比较,若相等,则i和j分别指示串中下一个位置,继续比较后续字符。若不等,指针后退重新开始匹配。如果j>t.length,说明模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功,返回和模式t中第一个字符相等在主串中的序号;否则匹配不成功,返回0。#include <iostream>#i
2021-04-11 14:12:22 383
原创 [数据结构]--中缀表达式求值
算术表达式求值算术四则运算遵循以下三条原则先乘除,后加减。从左到右。先括号内,后括号外。在运算的每一步,任意两个相继出现的算符op1和算法op2之间存在优先级关系,以下三种关系:op1 < op2 ,op1 > op2,op1 = op2。算法步骤:初始化操作数栈OPND, 操作符栈OPTR,表达式起始符’#'入OPTR。扫描表达式,读一个字符,直至扫描完毕到’#‘结束字符或者OPTR栈顶元素不为’#'时,循环执行以下操作:若ch不是运算符,压入OPND,读下一个字符c
2021-04-06 11:20:25 2157
原创 [数据结构]--栈在括号匹配中的应用
算法思想为:初始化一个空栈,顺序读入括号序列。若是左括号,作为一个新的更紧急期待括号压入栈中,原栈顶元素期待急迫性下降一级。若是右括号,将栈顶的最急迫期待元素取出,检测是否与之配对。如不是,终止判断,括号序列不匹配。若是非法字符,终止判断,括号字符序列不匹配。算法结束时,若栈为空,括号序列匹配,否则括号序列不匹配。#include <iostream>#include <cstdio>#include <cstring>using namespace
2021-04-06 09:13:05 383
原创 [数据结构]--链队的实现
#include <iostream>using namespace std;typedef struct QNode { int data; struct QNode *next;}QNode, *QueuePtr;typedef struct { QueuePtr front; QueuePtr rear;}LinkQueue;// 初始化bool initQueue(LinkQueue &Q) { Q.front = Q.rear = new QNo
2021-04-05 21:11:02 161
原创 [数据结构]--循环队列的顺序表示
#include <iostream>using namespace std;#define MAXSIZE 5typedef struct { int *base; // 存储空间的基指针 int front; // 头指针 int rear; // 尾指针}SqQueue;// 初始化bool initQueue(SqQueue &Q) { Q.base = new int[MAXSIZE]; if (!Q.base) { return false;
2021-04-05 20:00:42 176
原创 [数据结构]--链栈的实现
#include <iostream>using namespace std;typedef struct StackNode { int data; struct StackNode *next;}StackNode, *LinkStack;// 初始化bool initStack(LinkStack &S) { S = NULL; return true;}// 销毁bool destroyStack(LinkStack &S) { LinkS
2021-04-04 19:48:07 439
原创 [数据结构]--顺序栈的实现
顺序栈的实现:栈底指针始终指向栈底的位置,栈为空时栈顶指针等于栈底指针。栈为满时,栈顶指针-栈底指针=栈容量。栈非空时,栈顶指针永远指向栈顶元素的上一个位置。#include <iostream>using namespace std;#define MAXSIZE 100typedef struct { int *base; // 栈底指针 int *top; // 栈顶指针 int stacksize; // 栈可用最大容量}SqStack;// 初始化bo
2021-04-04 16:23:43 404
原创 [数据结构]--单链表的实现
#include <iostream>using namespace std;typedef struct LNode { int data; struct LNode *next;}LNode, *LinkList;// 构造一个空的单链表Lbool initList(LinkList &L) { L = new LNode; if (!L) { return false; } L->next = NULL; return true;}//
2021-04-02 21:15:45 253
原创 [数据结构]-顺序表的实现
#include <iostream>using namespace std;#define MAXSIZE 100typedef struct { int *elem; int length;}SqList;// 构造一个空的顺序表bool initList(SqList &L) { L.elem = new int[MAXSIZE]; // 为顺序表分配一个大小为MAXSIZE的数组空间 if (!L.elem) { return false; }
2021-04-02 19:42:44 178
原创 [数据结构]算法设计题--栈回文串
问题回文是指从正读反读均相同的字符序列,如“abba”和“abdba"均是回文,但“good”不是回文。试写出一个算法判定给定的字符序列是否回文。(提示:将一半字符入栈)解答/*回文是指从正读反读均相同的字符序列,如“abba”和“abdba"均是回文,但“good”不是回文。试写出一个算法判定给定的字符序列是否回文。(提示:将一半字符入栈)*/#include <iostream>using namespace std;#define MAXSIZE 10000typed
2021-03-27 20:29:25 544
原创 [数据结构]算法设计题--数组双栈
问题将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top等于[-1]时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长,试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法函数。双栈数据结构的定义如下:typedef struct { int top[2], bot[2]; // 栈顶和栈底指针 int *V; // 栈数组 int m; // 栈最大可容纳元素个数}DblStack;解答/*将编号
2021-03-27 20:28:42 2348
原创 SwiftUI实现图片轮播器
实现效果实现一个简单的图片轮播器,在SwiftUI中整合UIKit的UIPageViewController和UIPageControl。Modelstruct Landmark: Identifiable { var id = UUID() var name: String var park: String var imageName: String var image: Image { Image(imageName) }}
2021-03-10 13:15:57 1689 1
原创 [数据结构]算法设计题--划分子集(快速排序思想)
问题已知由n个正整数构成的集合A={ak}(0<=k<n),将其划分为两个不相交的子集A1和A2,元素个数为n1和n2,A1和A2中元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|s1-s2|最大。要求:给出算法的基本设计思想。分析算法的时间复杂度和空间复杂度。解答算法思想将最小的[n/2]个元素放在A1中,其余的元素放在A2中,划分满足要求。不需要对全部元素进行排序,可以仿照快速排序的思想,基于枢轴将n个整数划分为两个子集。然后将划分后的枢轴
2021-03-06 19:09:13 4908
原创 [数据结构]算法设计题--删除数据域相同的结点
问题用单链表保存m个整数,结点的结构为(data,link),且|data|<=n。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其他多余的绝对值相等的结点。例如单链表为head->21->-15->-15->-7->15,删除后为head->21->-15->-7给出算法的基本设计思想说明算法的时间复杂度和空间复杂度解答算法思想题目要求设计一个时间复杂度尽可能高效的算法,
2021-03-05 18:09:38 739
原创 [数据结构]算法设计题--寻找主元素
问题已知一个整数序列A=(a0,a1,…,an-1),其中0<=ai<n(0<=i<n)。若存在ap1=ap2=ap3=apm=x其m>n/2,则称x为A的主元素。例如有A=(0,5,5,3,5,7,5,5),则5位主元素;又如A=(0,5,5,3,5,1,5,7),A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计尽可能高效的算法,找出A的主元素。若存在主元素,则输出主元素;否则输出-1。要求:给出算法的基本设计思想说明设计的算法的时间复杂度和空间复杂
2021-03-05 16:50:18 4866 3
原创 [数据结构]算法设计题--链表后缀共同空间
问题采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可以共享相同的后缀存储空间。例如,“loading”和“being”的存储空间影像如图。设str1和str2分别指向两个单词所在链表的头结点,链表结点结构为(data,next),请设计一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置。要求:给出算法的基本设计思想说明算法的时间复杂度。解答算法思想因为两个链表长度不一定相同,所以从头开始同时遍历到尾结点,并不能保证同时到达。假设一个链表比另
2021-03-02 10:42:38 1376 6
原创 [数据结构]算法设计题--数组循环左移
问题设将n个整数存放到一维数组R中。试设计一个在时间和空间两方面尽可能高效的算,将R中保存的序列循环左移动p个位置,即将R中的数据由(x0,x1,x2,…xn-1)变换为(xp,xp+1,…xn-1,x0,…xp)。要求:给出算法的基本设计思想说明算法的时间复杂度和空间复杂度。解答算法思想先将n个数据原地逆置,得到xn-1, xn-2,…xp, xp-1,…x0。然后再将n-p个数据和后面p个数据分别逆置,得到最终结果。算法分析时间复杂度O(n),空间复杂度O(1)。/*设将n个整数
2021-03-01 16:04:33 1600
原创 [数据结构]算法设计题--查找链表倒数第k个元素
问题已知一个带有表头结点的单链表,结点结构为(data, link),假设该链表只给出了头指针。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。要求:描述算法的基本设计思想。描述算法的详细实现步骤。解答算法思想定义指针p和q,初始化均指向单链表的首元结点。首先将p沿链表移动到第k个结点,而q保持不动,这样当p移动到第k+1个结点时,p和q所指的结点间隔距离k。也就是快慢指针。然后p和q同
2021-03-01 13:48:38 2123
原创 [数据结构]算法设计题--删除连续序列链表元素
问题设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素。解答找到小于等于mink的结点和大于等于maxk的结点,进行连接即可。/*设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素。*/#include <iostream>using namespace std;typedef struct LNode { int data; struct LNode *next;}LNode, *LinkList;void createLis
2021-03-01 12:38:55 506
原创 SwiftUI 2 -- matchedGeometryEffect
简介适用于iOS14和Xcode12的新技术,matchedGeometryEffect是SwiftUI新的效果,可以篡改两个视图的大小和位置。基础SwiftUI已经为我们提供了无需matchedGeometryEffect工具的,篡改视图属性。在下面的例子中我们可以使用轻击矩形来实现大小改变动画。struct ContentView: View { @State private var isExpanded = false var body: some View {
2021-02-22 10:01:41 840
原创 [数据结构]算法设计题--原地翻转链表
题目设计一个算法,将链表中的所有结点链接方向“原地”逆转,及要求仅利用原表的存储空间,话句话说要求空间复杂度为O(1)。解答不能开辟新的空间,只能改变指针的指向。因此,可以考虑逐个摘取结点,利用前插法创建链表的思想,依次插入头结点的后面,先插入的为表尾,最后插入的为表头。利用前插法的元素性质,实现了链表原地翻转。/*设计一个算法,将链表中的所有结点链接方向“原地”逆转,及要求仅利用原表的存储空间,话句话说要求空间复杂度为O(1)。*/#include <iostream>usin
2021-02-20 21:20:30 1362
原创 [数据结构]算法设计题--查找最大数据域
题目设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点,返回该结点的数据域。解答O(n)查找最大数据域,遍历即可。初始时pmax指向链表的首元结点,用pmax依次和后面的结点进行比较,发现较大者更新pmax,从头到尾遍历一遍,pmax->data为链表的最大数据域。/*设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点,返回该结点的数据域。*/#include <iostream>using namespace std;typedef struct
2021-02-20 20:58:15 1476
原创 [数据结构]算法设计题--拆分链表
题目设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表中的结点为A表中值大于零的结点。(链表A中的元素为非零整数,要求B、C表利用A表的结点。)解答链表B使用链表A的头结点,链表C申请一个新的头结点。对链表A进行遍历的同时进行拆解,可以使用前插法或者后插法。/*设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表中的结点为A表中值大于零的结点。(链表A中的元素为非零整
2021-02-20 20:46:22 1929
原创 [数据结构]算法设计题--合并有序链表4
题目已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(A出现而不在B出现的元素所构成的集合),并以同样的形式存储,同时返回集合的元素个数。题解求A和B的交集(A出现而B不出现的元素集合),因为是递增序列。设pa和pb分别指向链表A和链表B的首元结点,我们进行比较:如果pa->data < pb->data。说明pa->data不会在链表B中出现,为交集元素,加入集合,pa指针后移。如果pa->data == pb->dat
2021-02-20 12:26:38 499
原创 [数据结构]算法设计题--合并有序链表3
题目已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放在A链表中。题解取出工作指针pa和pb分别指向链表A和B的首元结点,进行pa和pb比较:(如果数据相等则同时存在,为交集元素。如果比较小于,则不可能为交集元素后移删除。)pa指针的数据等于pb指针的数据。Lc指向pa,pa、pb后移,删除pb。pa指针的数据小于pb指针的数据。pa后移,删除pa。pa指针的数据大于pb指针的数据。pb后移,删除pb。当其中一个指针到达链表尾部,将另一个链表
2021-02-20 08:41:16 320
原创 [数据结构]算法设计题--合并有序链表2
题目要求将两个非递减的有序链表合并成一个非递增的有序链表。要求链表仍使用原来两个链表的存储空间,不另外使用其他的存储空间,表中运行有重复的元素。题解与合并有序链表1类似的思路,通过更改结点的指针域来重新建立元素之间的线性关系,得到新链表。有两个关键点:合并的链表与原链表顺序相反,利用前插法建立链表,形成递减序列。当一个表到达表尾为空时,另一个非空表的剩余元素应该利用前插法依次插入Lc的头结点之后,而不能全部链接在Lc表的最后。/*将两个非递减的有序链表合并成一个非递增的有序链表。要求链表
2021-02-15 21:23:33 858
原创 [数据结构]算法设计题--合并有序链表
题目要求将两个递增的有序顺序表合并成一个递增的有序链表,要求结果链表使用原来的存储空间,不占用额外的存储空间,表中不允许有其他重复的数据。解答假定创建链表输入的数据有序。为了保证新表和原来一样有序,可以利用后插法建立单链表。假定待合并的链表为L1,L2,合并后的新表使用头指针L3(L3的头结点执行L1的头结点),p1和p2是工作指针,指向L1,L2的首元结点,从首元结点开始比较,去较小数据域的指针插在L3头结点的next域后,形成新链表。/*将两个递增的有序顺序表合并成一个递增的有序链表,要求结
2021-02-10 20:01:32 1150
原创 计算机网络知识总结 - 期末复习版
计算机网络概述网络的分层OSI的7层协议:应用层,表示层、会话层、传输层、网络层、数据链路层、物理层。TCP/IP的四层协议:应用层、传输层、网际层IP、网络接口层。五层协议:应用层、传输层、网络层、数据链路层、物理层。为什么要分层网络?独立性高。各层之间相互独立,高层不需要知道低层的服务是如何实现的,只需要通过接口就能获取服务。灵活性好。各层采用最适当的技术实现,若实现技术发生变化,只要这一层的功能和接口没有改变,实现技术的变化不会对上下层的工作产生影响。易于实现和标准化。采用规范的
2021-01-13 06:19:46 1096
原创 CSAPP - Attack Lab深思
Attack Lab介绍对2个有不同安全漏洞的程序进行5次攻击,完成后你将会收货:学会针对缓冲区溢出漏洞进行攻击。学会如何将程序写的更加安全,了解操作系统和编译的特征使程序出现更少的漏洞。对x86-64机器代码的堆栈和参数传递有更深的理解。对x86-64机器指令解码有更深的理解。对gdb工具的熟练使用。实验帮助文档Part I: Code Injection Attacks前三个阶段利用漏洞利用字符串攻击CTarget。Level1阶段1不需要代码注入,相反使用漏洞利用字符串就可
2021-01-02 11:06:40 357 1
原创 CSAPP-Bobm Lab深思
Bobm Lab介绍“二进制炸弹”是作为目标代码文件提供给学生的程序。 运行时,它提示用户输入6个不同的字符串。 如果其中任何一个不正确,炸弹就会“爆炸”,学生必须通过拆卸和逆向工程程序来“消散”自己独特的炸弹,以确定6个字符串应该是什么。该实验室教会学生理解汇编语言,并强迫他们学习如何使用调试器。实验地址README文档实验指导实验步骤使用GDB逆向工程推断6个字符串。设置断点,一步一步调试,找到explode_bomb的跳转命令,结合逻辑和寄存器的值进行判断字符串的值。[外链图片转存失败
2020-12-27 21:17:59 333
原创 CSAPP实验深思录
详情移步GitHub目录项目背景下载实验列表实验环境搭建实验进度开源协议项目背景记录《深入理解计算机系统》的实验记录和学习思考。下载在命令行中运行以下命令。unix> git clone https://github.com/ChinaWxq/CSAPP-Lab.git实验列表Data LabBomb LabAttack LabBuffer LabArchitecture LabCache LabPerformance LabShell LabMal
2020-12-25 21:51:49 326
CustomTransitionAnimation.zip
2020-02-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人