自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于ArkAnalyzer的HarmonyOS通用API多端安全性分析工具

这个通用API安全性分析工具通过静态代码分析技术,解决了HarmonyOS开发中的多端兼容性问题。基于ArkAnalyzer的深度分析:充分利用华为官方分析框架源代码回溯技术:解决IR中位置信息缺失的问题方法级别精确分析:避免全局分析的误判全面的API覆盖:支持20,848个系统API通过这个工具,开发者可以在编码阶段就发现潜在的兼容性问题,大大提高应用的稳定性和用户体验。项目地址技术栈支持API数量:20,848个分析精度:方法级别 + 行号定位。

2025-10-24 11:21:31 789

原创 错误示例和如何规避

“联想能力集”是为了方便开发,它会展示所有目标设备(如手机+手表)的能力总和。这意味着,你在手机项目中可能会看到并使用仅手表才有的API(比如心率传感器),反之亦然。在没有GPS模块(如仅WLAN的平板)或信号弱的设备上可能会超时或抛出异常。这三个“能力集”是理解和解决 HarmonyOS 跨设备兼容性问题的基石。以下是几个典型的跨设备问题用例,每个都包含“有问题的代码”和“纠错后的代码”。这是最直接、最清晰的方法,用于检查当前设备是否支持某个具体的。: 在没有NFC能力的设备上,

2025-10-21 17:16:27 603

原创 鸿蒙开发的三种能力集以及错误的产生条件

错误场景能力集关系错误如何产生错误发生阶段错误表现安装失败要求能力集支持能力集开发者在中错误地将非必要能力加入应用分发与安装应用市场不可见;手动安装时提示不兼容/安装失败。运行时崩溃联想能力集支持能力集开发者直接调用了某设备专属的 API,且未用canIUse或try-catch做运行时保护应用运行功能静默失败、(如801)、TypeError应用崩溃闪退。你提出的这一点非常敏锐,这是一个完美的问题,直击了这两个场景最容易混淆的地方!从逻辑上讲,你的感觉是完全正确。

2025-10-21 17:13:36 1064

原创 理解mips中的栈帧和$fp

在这个视角下,由调用者(Caller)压入栈的参数,确实是在这个“栈帧”的“之前”(即更高的内存地址处)。把栈中存的main的返回地址和fp地址重写赋值给ra和fp。然后赋值完成之后其实栈中的值也不需要了,sp指向ra值之前的位置即可。而且main函数栈帧中传入参数的位置也不需要了。$fp指针严格来说不是指向当前栈底,而是更低的前一个部分压入第一个参数的位置。当前栈帧中的参数是当前部分的调用函数的参数。确定fp的新位置,就是main函数的栈帧中压入的第一个参数的位置。返回,把sp置为fp的位置。

2025-10-21 10:16:30 174

原创 运行栈例题

核心作用:display 数组提供了一种快速访问所有外层(嵌套)作用域中变量的机制。它存储了当前函数可以访问的所有外层作用域的活动记录的基地址。这条链由程序的词法结构(Lexical Scope),即代码是如何嵌套编写的,所决定,因此也称为静态链 (Static Link)的一种高效实现。结合第二题的例子(在点②处)程序在 REINNER 函数内部。REINNER 的嵌套层次是3。REINNER (层次3) 嵌套在 REEXAMPLEPROC (层次2) 中。

2025-10-20 11:39:33 905

原创 符号表例题

栈式符号表就是管理两个表,一个分程序索引表,一个符号表。分程序索引记录从哪些记录开始就是“下一层”的内容。③标识符IND和J映射到5。④标识符TESTI映射到6。①标识符X和M1映射到1。②标识符NAME映射到3。⑤标识符F和Y映射到8。⑥标识符M2映射到11。

2025-10-20 11:24:28 184

原创 红蓝眼睛谜题

注:文中** = zisha。

2025-10-19 19:51:36 617

原创 python:requests+beautifulSoup

他的任务是前往指定地点(URL),取回一个“加密包裹”(网页响应),然后安全地带回来。,将一长串无序的字符串,转换成一个结构化的、可以轻松遍历和搜索的Python对象。只是一个解析器,它还需要一个“引擎”来工作。这个包裹(HTML/XML内容),从中找出你需要的具体情报。他的工作是待在总部,等“外勤特工”带回包裹后,他负责。(访问网页、调用API等),并获取服务器的响应。包裹里是什么,只负责。

2025-10-18 14:11:31 370

原创 urllib.request.Request

我们可以将代码拆解为几个关键步骤来理解其工作原理和目的。

2025-10-17 20:26:50 716

原创 python自动化脚本基础2——shuitl

你可以用这些基础工具组合起来完成任何工作,但对于复杂任务(比如盖一座狗屋),你需要自己一步步地测量、切割、钉钉子,非常繁琐。它把很多基础操作打包成了一个强大、智能的功能。),你只需要提供木材和地点就行了。它内部会自动完成所有测量、切割和钉钉子的步骤。当你复制一个文件时,你关心的可能不仅仅是文件的内容,还有它的“身份信息”,也就是。它会自动创建所有必要的目录,并递归地将所有文件(使用。模块,看看为什么在进行文件和目录的复制、移动操作时,它会比。是一个更智能、更可靠的移动工具。递归复制目录的功能。

2025-10-16 00:20:56 879

原创 脚本学习1 os库

一、核心概念chmod 用于修改文件/目录的访问权限。权限系统围绕“谁能做什么”展开。谁 (三类用户):文件的创建者。文件所属的用户组。除以上两者之外的所有用户。做什么 (三种权限):值为4。可以查看文件内容。值为2。可以修改文件内容。值为1。如果文件是程序或脚本,可以运行它。二、权限的表示方法权限由一个三位数字表示,每一位分别是给所有者、组、其他人的权限,通过将读(4)、写(2)、执行(1)的值相加得到。7(所有权限)5(读和执行)6(读和写)4(只读)权限数字字母表示法含义755。

2025-10-16 00:16:57 354

原创 从Java/C到Python:蓝桥杯算法竞赛转型速成指南

凭借你扎实的算法和数据结构功底,只要快速熟悉以上这些Python的工具和“语法糖”,你就能在蓝桥杯的赛场上把更多时间花在思考算法本身,而不是繁琐的代码实现上。从C/Java切换到Python,最大的障碍往往不是语法,而是思维方式。你需要从“面向机器”的严谨思维,转向“面向问题”的简洁思维。如果你的DFS或递归解法可能层次很深,务必在代码开头加上这两句,否则可能因。这是从LeetCode模式转向竞赛模式的首要任务。这是你需要动手练习的重点,它们是解题的直接工具。这些是你的兵器库,必须熟练掌握。

2025-10-14 18:28:15 630

原创 从Java/C到Python:蓝桥杯算法竞赛转型速成指南

如果你是一位身经百战的Java或C++竞赛选手,你一定熟悉严谨的类型声明、繁琐的输入输出(I/O)处理,以及为了一个自定义排序而不得不写的Comparator或struct。对于已经掌握了算法核心思想的你来说,转型Python,就是为你的“屠龙之术”换上一把更锋利、更轻便的“宝刀”。Python在算法竞赛中,尤其是像蓝桥杯这样注重解题思路和实现速度的比赛中,拥有无与伦比的优势。这篇指南将通过三道经典的入门题,带你体验从Java/C思维到“Pythonic”思维的转变,让你快速上手,发挥出你原有的算法实力。

2025-10-14 16:28:26 1140

原创 蓝桥杯python入门

【代码】蓝桥杯python入门(AI生成)

2025-10-14 16:23:20 85

原创 归并排序的三重境界

我们用两个指针分别指向两个有序子数组的开头,比较指针所指元素的大小,将较小的那个放入一个临时的辅助数组,然后移动相应的指针。在学习算法的道路上,我们总会遇到一些“瑞士军刀”般的工具,它们看似简单,却蕴含着解决一类问题的通用思想。解释:数组排序后,某些数字的位置没有改变(例如,2 和 3),而其他数字的位置发生了改变(例如,1 和 5)。函数内部,我们利用左右两个子数组已经分别有序的黄金特性,先完成计数,再完成标准的排序合并。注:以下代码实现了“小和”的逻辑,与你提供的代码逻辑略有不同,但思想一致,都是在。

2025-09-29 18:14:55 853

原创 Java字符串转为字节数组输出对应二进制

所以0xFF是32位的int: 00000000 00000000 00000000 11111111。所以对每个字节遍历的时候,由于开头都是1,所以进行类型转换。自动转为32位int,前面自动补1了。得到int类型的:00000000 00000000 00000000 11100110。本来期望输出:a一个字节,"我"三个字节,m一个字节。点开toBinaryString发现传入参数是int,于是想起Java的符号扩展。十六进制:默认为 int 类型。

2025-09-29 11:02:48 236

原创 编译原理第六章——存储管理

这篇博客深入探讨了程序运行时的内存管理机制,从静态分配到动态分配,再到解决嵌套作用域问题的display机制。文章首先对比了编译时与运行时的差异,介绍了静态存储分配的特点及局限性。随后讲解了动态分配的必要性,以及栈结构如何优雅地支持函数调用。核心部分聚焦于活动记录的构成和display机制的精妙设计,通过案例解析了如何快速访问嵌套变量。最后比较了现代语言中栈与堆的特性,并展望了垃圾收集技术的未来。全文揭示了内存管理背后的智慧与复杂性。

2025-09-25 20:19:43 606

原创 sqzb_alldsd——板子

dp[j] 表示装满容量为 j 的背包,有多少种不同的方案。

2025-09-20 12:34:49 612

原创 关系代数中的除法

摘要:关系代数中的除法运算可理解为"资格审查"过程,用于筛选满足所有条件的个体。以招聘"全能程序员"为例,应聘者必须掌握岗位要求的所有技能才能通过。数学上,除法运算需确保候选个体与除数关系的笛卡尔积完全包含于被除数关系。其核心思想是找出完全覆盖指定条件集的个体,适用于"选修所有必修课的学生"等查询场景。计算步骤为:1) 分组被除数的非公共列;2) 检查每组是否完全包含除数关系;3) 保留符合条件的个体。

2025-09-14 23:05:45 729

原创 关系模型的数据结构

关系数据库的核心概念是“关系”,即用统一的二维表结构表示实体及实体间的联系。关系模式的数学表达为R(U,D,dom,F),其中U是属性集合,D是域集合,dom定义属性到域的映射(数据类型),F表示数据依赖关系(如函数依赖)。关键概念包括: 候选码:能唯一标识元组且具有最小性的属性组 主码:从候选码中选定的唯一标识符 主属性:包含在任何候选码中的属性 非主属性:不参与任何候选码的属性 关系模式(Schema)是静态设计蓝图,而关系(Relation)是动态数据实例。实际应用中常用简化表示R(A1,A2,...

2025-09-14 22:40:40 822

原创 数据库范式(Normalization)

1NF:入场券。确保数据是“原子的”(每个单元格一个值)。2NF:消除部分依赖。确保所有非主属性都依赖于整个组合主码,而不是它的一部分。(解决方法:把依赖于部分的属性拆出去)。3NF:消除传递依赖。确保所有非主属性都只依赖于主码,而不是依赖于其他非主属性。(解决方法:把间接依赖的属性拆出去)。学生表老师表课程表和选课表。这就是关系数据库设计的精髓所在。

2025-09-14 22:07:59 897

原创 邮票戳印——拓扑排序应用

摘要: 本文探讨了LeetCode 936题“Stamping The Sequence”的逆向思维解法。通过将正向构造问题转化为逆向解构,采用拓扑排序模型,将每个盖章位置视为任务,建立依赖关系图进行求解。文章详细阐述了算法思路、建模过程及代码实现中的关键点,包括经典的边界错误和反转错误调试经验。最终证明,通过“正难则反”策略和拓扑排序,可以高效解决这类复杂构造问题,同时强调了算法思维和细节处理的重要性。

2025-09-14 20:30:43 895

原创 拓扑排序应用——火星词典

本文探讨了如何通过拓扑排序解决“火星词典”问题。题目要求根据外星单词的顺序推断字母表排序。关键思路是将字母视为图的节点,单词间的顺序关系转化为有向边,构成依赖图。通过Kahn算法进行拓扑排序:统计入度为0的字母作为起点,逐步移除并将其邻接字母入度减1,直到所有字母被排序。代码实现了预处理、建图和排序三步,并检查排序结果是否包含所有字母以判断是否存在环。该问题展示了如何将具体问题抽象为图论模型并应用经典算法求解。

2025-09-14 19:06:17 742

原创 图的构建拓扑排序

把每一行的链表作为一个vector<pair<int,int> >,(没带权直接vector<vector<int>>)一般没必要真的像在C语言中那些建一个指针数组和链表。按照一般数据结构书的讲述,通过一个指针数组可以实现,数组中每个元素代表一个节点,也作为一个链表的头节点,链表中存的是这个节点指向图中哪些节点。每个链表元素中存有这个被指向节点的编号和指向边的权重(如果带权的话)加边函数中,indegree存储每个节点的入度,节点i的入度数量是indegree[i],和后续讲到的拓扑排序有关。

2025-09-14 13:58:08 459

原创 编译器的前端中端和后端

这样的现代编译器架构如此成功的原因。Clang 是 C/C++/Objective-C 的。这种“前-中-后”三段式的设计是现代编译器的基石,其最大的好处是。目标CPU架构(x86, ARM, RISC-V, …编程语言(C++, Swift, Rust, …但前端的工作还没有结束。然后,LLVM 提供了强大的。想象一下,我们要支持。,来完成剩下的工作。

2025-09-14 12:39:20 814

原创 编译原理第二章

文法的核心定义包括非终结符、终结符、产生式和起始符号。推导过程通过替换规则生成句型,最终形成句子和语言。语法树展示句子结构,但二义性会导致多棵树。推导策略分最左和最右推导,与递归文法(左/右递归)无关。语法分析分为自顶向下(LL)和自底向上(LR)两种方法:前者模拟最左推导但无法处理左递归,后者通过规约逆向构造最右推导,核心是寻找句柄进行规范规约。两种方法分别对应不同的推导策略,形成互补关系。

2025-09-14 12:35:22 659

原创 通过语法推导树快速求短语,简单短语和句柄

该摘要描述了如何对句型 R(P+i) 进行规范推导(最右推导)和语法分析。推导序列为 E => RP => R(E) => R(RP) => R(Ri) => R(P+i)。通过语法树分析,找出所有短语:i、P+、P+i、(P+i)、R(P+i);简单短语为 i 和 P+;句柄是最左简单短语 P+。

2025-09-13 20:10:05 1041

原创 编译原理-文法压缩练习

摘要:文法化简需分两步消除无用规则。首先识别并删除不能推导出终结符串的"不活动"符号(如例题中的B、E),然后删除从起始符号无法到达的"不可达"符号(如A)。通过迭代构建活动符号集和可达符号集,最终将原始文法G[S]化简为仅含S→CD、C→Cc|c、D→Dd|d的简洁形式。该流程是标准化的机械操作,适用于所有文法化简场景。

2025-09-13 19:38:28 487 1

原创 PTA算法简析

它能跟踪对象实例如何通过变量赋值、参数传递、字段存储和函数返回在程序中“流动”。当遇到if/else或循环等控制流分支时,它会分析所有可能路径,然后在路径汇合点合并结果(指向集)。这保证了不会遗漏任何可能性。在遇到它无法精确分析的情况时(如数组索引、复杂的反射调用等),它会做出保守的假设(例如,把整个数组看成一个整体),这会牺牲精度,但能保证结果的“稳健性”(即结果集一定包含了所有真实运行时的可能调用)。所以,PTA 的强大之处在于,即使代码逻辑错综复杂,它也能给出一个。

2025-09-13 12:55:37 1019

原创 ArkAnalyzer源码初步分析I——分析ts项目流程

鸿蒙程序分析框架ArkAnalyzer(方舟分析器)源码地址入门文档。

2025-09-13 12:48:54 816

原创 关键调用路径分析

关键调用路径:buildSceneFromProjectDir->genArkFile->buildMethodBody->buildBody->build。本篇服务于ArkAnalyzer源码初步分析I。

2025-09-13 12:47:05 231

原创 子数组最大累加和dp问题I(保姆级!)

之前写的博客都是站在已经解出题目的角度,有些分析过程很短,而且比较晦涩。这篇站在做题者的角度,一步一步分析,一步一步讲解。

2025-09-11 23:47:05 794

原创 C++的const_cast

因为my_value变量本身在main函数中被定义时是int,不是const int。它存储在可读写的内存区域。processData函数只是通过一个const指针“看待”它,限制了在该函数内的直接修改。我们使用const_cast只是“恢复”了它本来的可写属性。在保证调用之后不会修改值时,可以使用const_cast,满足规则1。

2025-09-04 18:38:23 292

原创 C++ const以及相关关键字

这意味着程序可能会崩溃,也可能看起来正常工作,或者产生无法预料的结果。

2025-09-04 18:28:48 682

原创 滑动窗口模型,对难题的简单递进型思考

种类问题(4)+求出字符种类数量大于等于某个字符串的全部子集(3)就是4,3的结合,经过这么久的分析,也没啥特别的public://求出所有区间和等于s的子串数量i ++){a1[i] = 0;a2[i] = 0;return 0;// 左指针int i2 = 0;++j) {//以j为结尾,区间和为n的最大与最小长度(考虑0)*/cnt1 ++;cnt2 ++;cnt1 --;i1++;

2025-09-04 13:42:26 578

原创 1.Linux:命令提示符,history和常用快捷键

符号用户类型权限超级用户 (root)最高权限,无所不能,操作需谨慎普通用户有限权限,更安全,适合日常使用所以,当你的朋友发给你一张 Linux 终端的截图时,你只需要看一眼最后的符号是还是,就能立刻知道他是不是以root身份在操作。你想做什么?使用什么方法?怎么操作?运行刚刚才用过的命令上下翻页按键盘的↑键运行很久以前用过,但记得其中几个词的命令关键字搜索(最推荐)按Ctrl-r,然后输入关键字想看看最近输入的所有命令列表完整列表输入history命令。

2025-09-03 23:33:02 1231

原创 移动语义:从C++到rust

在 Rust 中,移动是默认的。当你把一个变量赋值给另一个变量时,把它想象成递交一个物理物品,所有权被转移,原来的持有者就不能再用了。只有简单的、可被轻易复制的类型(实现了Copy)才会执行拷贝。数字、布尔值就是这类。StringVec这些管理着堆内存的复杂类型,默认都是移动。编译器是你的守护神。它会严格检查所有权规则,任何在移动后还试图使用旧变量的行为,都会在编译阶段被彻底拒绝。这种设计哲学上的根本不同,使得 Rust 代码从源头上就避免了大量 C++ 中常见的内存管理错误。

2025-09-02 17:03:05 925

原创 C++ nocept

noexcept是什么?一个函数永不抛出异常的承诺。为什么要用在移动操作上?因为移动操作会“掏空”源对象,如果中途抛异常,会导致对象状态损坏,数据丢失。不加noexcept会怎样?在需要“强异常安全保证”的场合(如扩容),编译器和标准库会因为害怕风险而拒绝调用你的移动函数,转而使用更慢但更安全的拷贝函数。移动构造函数和移动赋值运算符总是应该标记为noexcept,除非你真的在里面做了可能抛出异常的操作(但通常一个设计良好的移动操作只是转移指针和基本类型,这些是不会抛异常的)。

2025-09-02 16:49:25 746

原创 C++拷贝语义和移动语义,左值引用与右值引用

const。

2025-09-02 16:37:03 740

原创 Trie树(静态数组实现)

这是 C++ 的语法要求。static成员变量必须在类外进行定义和初始化。这里将所有数组初始化为 0,并将节点计数器cnt初始化为1。这意味着节点编号从 1 开始,我们通常把节点 1 当作字典树的根节点(root)。0在这里被用作一个特殊值,表示“空”或“不存在的节点”。

2025-08-31 17:35:09 728

空空如也

空空如也

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

TA关注的人

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