自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (3)
  • 收藏
  • 关注

原创 检查动态链接库依赖

一般可以使用ldd命令查看应用程序的动态链接库依赖对于其他架构的程序,可以使用readelf命令来查看动态链接库依赖arm-linux-gnueabi-readelf -a mkfs.ext4 | grep "Shared library:"

2022-05-05 22:03:41 1326

原创 ip数据包转发和iptables

Linux内核数据包转发功能和iptables的关系内核数据包转发(路由)功能是内核将从A网卡接收到的目的地址不是自身地址的ip数据包通过B网卡发送出去的功能(即路由器的功能)。使用以下命令即可开启内核对ipv4数据包的路由功能# 如果有sysctl命令sysctl net.ipv4.ip_forward=1# 如果没有sysctl命令echo 1 > /proc/sys/net/ipv4/ip_forward内核将根据路由表将接收到的非自身ip的数据包按照路由表中的规则进行转发,转发

2022-05-02 00:19:37 2419

原创 CMAKE基础示例

cmake简单示例

2021-12-23 09:27:00 925

原创 Linux中c程序命令行参数解析

在Linux中,较为复杂的C程序命令行参数的解析通常使用getopt, getopt_long以及getopt_long_only来进行,如下所示。#include <unistd.h>int getopt(int argc, char *const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt;#include <getopt.

2021-07-28 19:51:43 943

原创 Linux系统多播发送和接收

多播多播(multicast)又称为组播,是一种介于单播(一对一)和广播(一对全部)之间的一种数据发送方式,只有位于一个多播组内的实体能够接收到发送到该多播组的数据包。多播地址范围多播地址总的范围为224.0.0.0~239.255.255.255,每一个地址表示一个多播组,简单的细分范围如下:地址范围说明224.0.0.0~224.0.0.255仅本地同一个子网使用,不可路由224.0.1.0~224.0.1.255公网可以使用的多播地址,可以在公网路由224.

2021-07-27 22:49:59 5112

原创 epoll基本使用

epoll简介epoll是Linux中的一种使用IO多路复用机制,即使用单个线程就可以监听多个文件描述符的读写事件,避免开启大量线程或者执行大量轮询的造成的不必要的性能开销。类似的机制还有select和poll,关于其区别参考。高性能IO模型分析-浅析Select、Poll、Epoll机制(三) - 知乎 (zhihu.com)头文件和API#include <sys/epoll.h>// 创建epoll,通常使用epoll_create即可,epoll_create1可以设置一些

2021-07-27 11:06:18 1266

原创 调用约定和栈布局(更新中)

调用约定和栈布局x86x86平台下常用的有三种调用约定,__cdecl、__stdcall、__fastcall,默认情况下使用__cdecl。__cdecl__cdecl是c/c++使用的默认调用约定。在x86架构下,参数从右到左通过栈传递(右边参数先入栈),由调用者负责清除参数。返回值通过eax寄存器传递。下边是一个简单的c程序使用使用如下命令编译结果。gcc -m32 -O0 -fno-stack-protector -fno-pie callspec_x86.cint add(in

2021-07-20 11:21:13 170 2

原创 879-盈利计划

题目879. 盈利计划 - 力扣(LeetCode) (leetcode-cn.com)思路本题目核心问题为对于特定的minProfit和特定的n,在groups中选择一些工作使其满足要求n和minProfit的限制,选择方案总共有多少种。因此,我们从最后一项工作group[last]开始考虑,对于该工作,有两个可能性:如果选择该工作,则问题转换为对于minProfit = minProfit - profit[last]以及n = n-group[last],在group中前last项中进行选择

2021-06-09 15:50:10 85

原创 160-相交链表

题目160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)思路hash表我们将一个链表中的所有结点加入到一个hash表中,遍历第二个链表检查其中结点是否在hash表中,找到的第一个在hash表中的结点就是两个链表的交叉点。裁剪和比较我们遍历两个链表分别求出其长度,然后计算出长度差h。接着,我们使用两个指针分别指向短链表的头部结点以及长链表的第h个结点。之后,同步一同两个指针,如果指向同一个结点则为两个链表相交的结点。纯双指针使用两个指针a,b分别指向两个链表

2021-06-05 22:52:03 93 2

原创 139-单词拆分

题目139. 单词拆分 - 力扣(LeetCode) (leetcode-cn.com)思路使用动态规划求解该题目。dp[i]记录s[0 : i]是否匹配字典中的单词(即能够通过空格划分为多个字典中单词的组合)。求解dp[i]时,我们假设已经求得所有dp[j], j < i,并尝试从s[0:i]的尾部匹配一个词典中的单词(如下图所示)。匹配的方法为遍历词典中的所有单词(词典中不同长度的单词对于不同的j),尝试找到同s[j + 1 : i]匹配的单词。如果找到这样的单词,并且此时dp[j] =

2021-06-03 22:37:52 98

原创 IndProp章节中pumping lemma的证明

在software foundations–Logic foudations–IndProp中,有一个证明pumping lemma的练习,本文介绍了一种证明方法。辅助引理为了证明pumping lemma,除了software foundations–Logic foudations–IndProp中已经给出的引理外(napp_star, pumping_constant_0_false ),还使用了下边两个新定义的引理。le_plus_bothLemma le_plus_both: foral

2021-06-02 13:05:06 560

原创 477-汉明距离总和

题目477. 汉明距离总和 - 力扣(LeetCode) (leetcode-cn.com)思路最直接的算法是遍历所有的数字组合并将每组数字的汉明距离求和,然而其时间复杂度为O(n2)O(n^2)O(n2),会超时。我们考虑通过分治的方法来求解。首先考虑我们以及计算得到数组nums前k个数组成的区间[0, k-1]的所有数字的汉明距离总和total(0, k - 1),那么[0,k]中所有数字汉明距离的总和total(0, k)就等于total(0, k-1)加上nums[k]同前k个数字的汉明距离

2021-05-28 19:34:26 96

原创 software foundations LF Logic(一)

使用Theorem, Lemma和Example定义的命题(目标)在coq中拥有一个相同的类型Prop, 即命题(目标)本身也是一种变量,其类型为Prop. 因此可以用于执行各种运算,详见[Programming with Propositions](#Programming with Propositions)注意完整的定理包含了命题Prop以及其证明过程(当然通常说的定理仅指命题部分),因此定理本身的类型并不是Prop(即使用Check检查Theorem,Lemma以及Example并不会得到P.

2021-05-28 00:41:22 559

原创 software foundations LF Tactics

更多内容见 https://github.com/january147/software_foundations_notes原始章节参考 software foundations LF TaticsTaticsapplyapply将某个假设或者定理应用于目标,如果目标同该假设或者定理完全一致(等式两端的内容也不能交换),则直接完成目标的证明;如果假设或者定理是->类型,并且目标匹配假设或者定理中->的右端,则尝试将目标转换为假设或者定理中->的左端。例如下边这个定理的证明.

2021-05-26 15:05:57 624

原创 software foundations LF Poly

Polymorphism(多态)某一些类型,比如list, 其内部存储的元素的类型通常并不影响list本身支持的一些操作(例如添加元素、删除元素、获取长度、获取某个元素等),因此list的定义不应该和其内存存储的元素完全绑定(即不应该针对每种类型的元素都分别定义一个存储其元素的list类型以及对应的行为)。list应该作为一种比普通类型更高阶的类型,从而使得list可以用于存储多种不同的类型,并且针对list的操作应该可以应用到存储不同的类型数据的list中,这样list的操作就体现出了多态性(Polym

2021-05-25 16:20:14 214

原创 software foundations LF Lists

更多内容见 https://github.com/january147/software_foundations_notespair和多元素匹配(a, b)作为一个pair表示一个变量,在match的匹配列表左端,多个由逗号分隔但没有在括号里的变量表示匹配多个变量(* Can't match on a pair with multiple patterns: *)Definition bad_fst (p : natprod) : nat :=(* match仅匹配一个变量p *)match.

2021-05-24 15:20:01 117

原创 software foundations LF Induction

更多内容见 https://github.com/january147/software_foundations_notes software foundations LF Induction导入经过编译的模块From LF Require Export Basics.LF表示项目目录,Basics是导入的模块名称(对应Basics.vo文件)First create a file named _CoqProject containing the following line (if.

2021-05-23 15:36:43 242

原创 1707-与数组中元素的最大异或值

题目1707. 与数组中元素的最大异或值 - 力扣(LeetCode) (leetcode-cn.com)思路该题目要求某个数字同数组中的数字异或的最大值,因此使用前缀树最为高效。如下题目也是使用前缀树来实现快速求解两个数最大异或值的,关于前缀树的构建和求解异或值最大的数的过程可以参考此博客。421-数组中两个数的最大异或值_j5856004的博客-CSDN博客如果不考虑本题目中查询请求中的最大数字限制,我们只需要将原数组的所有数加入到前缀树中,再使用上述题目中使用的搜索与n异或结果最大的

2021-05-23 15:08:33 146

原创 software foundations LF Basics

更多内容见 https://github.com/january147/software_foundations_notesCoqCoq’s native functional programming language, called Gallina.注释(* 注释内容 * )分隔符Coq使用.(英文句号)来分隔表达式。显示类型使用Check关键字来检查一个表达式的类型Check true.定义类型enumerated typesInductive day : Type .

2021-05-22 22:52:08 267

原创 tkinter学习笔记1

tkinter是python自带的标准GUI库,通常无需额外安装,如果没有自带可以通过以下命令来安装pip install tkinter为pip指定--user可以无需root权限仅为当前用户安装tkinter是对tcl/tk的一种python封装Tkinter 8.5 reference: a GUI for Python (gitee.io)Tcl Developer Site引入tkinter库import tkinter创建根窗口root = tkinter.

2021-05-22 00:17:11 243 1

原创 1738. 找出第 K 大的异或坐标值

题目1738. 找出第 K 大的异或坐标值 - 力扣(LeetCode) (leetcode-cn.com)思路第一步求矩阵所有坐标(a,b)的值,根据异或运算的性质,有(a,b) = (a - 1, b) ^ (a, b - 1) ^ (a - 1, b - 1) ^ matrix[a][b](a,b)表示第a行,第b列如图所示,(a,b)坐标对应了绿色(左上角3x3)的矩阵中所有元素的异或结果,(a-1,b)对应了蓝色(左上角2x3)的矩阵中所有元素异或的结果,(a,b-1)对应了

2021-05-19 20:17:29 147 1

原创 1442-形成两个异或相等数组的三元组数目

题目1442. 形成两个异或相等数组的三元组数目 - 力扣(LeetCode) (leetcode-cn.com)思路首先,本题存在区间求和问题,因此需要求出前缀数组prefix,使得prefix[i] == arr[0] ^ arr[1] ^ ... ^ arr[i]。第二,观察可知,要满足a == b,即满足a ^ b == 0,即arr[i] ^ ... ^ arr[k] == 0。根据前缀数组求区间的方法,即有prefix[k] ^ prefix[i-1] == 0,即prefix[k]

2021-05-18 23:34:03 93

原创 421-数组中两个数的最大异或值

题目421. 数组中两个数的最大异或值 - 力扣(LeetCode) (leetcode-cn.com)思路使用二重循环遍历所有可能的组合可以解决该问题,不过时间复杂度过大,会导致运行超时。为了优化运行速度,对于一个数n, 我们需要尽可能快的找到另一个数m,使得在所有和n组合的数中,n^m的结果最大。根据异或运算的性质,为了使得计算结果尽可能地大,我们需要保证高比特位有尽可能多地1,因此,从最高比特位开始(本题目中为第30位(从0开始)),对于n中为0的比特位,我们需要尽可能的找该比特位为1的

2021-05-16 22:57:05 335

原创 12-整数转罗马数字

题目12. 整数转罗马数字 - 力扣(LeetCode) (leetcode-cn.com)思路对于千位以上的部分,每个M表示1千;千位以下,百位以上的部分,CM表示900,D表示500,CD表示400,C表示100;百位以下,十位以上的部分, XC表示90,L表示50,XL表示40,X表示10;十位以下的部分, IX表示9,V表示5,IV表示4,I表示1。可以看到,数字会优先使用最大的表示单位进行表示,不足够使用大单位表示的数字才使用小单位表示(即100不会用100个最小的单位I来进行表

2021-05-15 20:09:26 63

原创 1269-停在原地的方案数

题目1269. 停在原地的方案数 - 力扣(LeetCode) (leetcode-cn.com)思路我们从最后一步开始考虑,最后一步需要到达0, 则上一步必定到达1或者0,更一般地说如果第s步到达了p,那么第s-1步必须到达p - 1或者p或者p + 1。所以,如果我们能够分别知道第s - 1步到达p, p - 1和p + 1的方案数量,那么第s步到达p的方案数量就是第s - 1步到达p, p - 1和p + 1的方案数量的总和。根据上述分析,我们需要从第0步开始,求出第s (0 <=

2021-05-13 16:29:20 116

原创 1310-数组异或查询

题目1310. 子数组异或查询 - 力扣(LeetCode) (leetcode-cn.com)思路根据异或运算的特点(x ^ x = 0),一个数组中任何一个区间内元素的异或结果可以通过整个数组的前缀元素异或结果求得,即有xor(a, b) = xor(0, a-1) ^ xor(0, b-1)根据该特点,我们只需要遍历原数组,求出所有的前缀元素异或结果并保存在一个数组中即可实现在O(1)O(1)O(1)的时间内求出任意区间的异或值。代码class Solution {public:

2021-05-12 10:21:12 107

原创 1734-解码异或后的排列

题目1734. 解码异或后的排列 - 力扣(LeetCode) (leetcode-cn.com)思路该题目初看同1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)类似,实际上,1720中直接给出了原数组的第一个数,因此很简单,而本题的难点就在于如何求出原数组的第一个数。根据题目描述,我们可以知道原数组是从1到n的正整数的排列,即原数组所有元素的异或结果为1 ^ 2 ... ^ n(异或运算满足交换律)。另外,异或运算的特点x ^ x = 0,如果我们

2021-05-12 10:19:57 113

原创 1482-制作 m 束花所需的最少天数

题目1482. 制作 m 束花所需的最少天数 - 力扣(LeetCode) (leetcode-cn.com)思路首先我们需要检查总的花朵数量是否足够制作花束,如果不够则直接返回-1。在花朵够的情况下,最大的等待天数max_day是所有花的开放的天数(max(bloomDay)),最少等待的天数min_day是第一朵花开放的天数(min(bloomDay))。然后我们需要确定在第d天时(d∈[min_day,maxday]d \in [min\_day, max_day]d∈[min_day,m

2021-05-09 12:58:57 119

原创 1723-完成所有工作的最短时间

题目1723. 完成所有工作的最短时间 - 力扣(LeetCode) (leetcode-cn.com)思路为了求得最短的工作时间,我们需要给每个工人分配适当的任务。我们从最后一个工人开始考虑,该工人共计有2n2^n2n种工作分配方案(nnn为工作数量),从不分配任何任务到分配所有任务。当我们确定该工人的一种分配方案后,就需要给剩余的工人分配剩余的任务,显然,给剩余的工人分配剩余的任务是给所有工人分配所有任务的一个相同类型的子问题,我们可以考虑使用动态来解决。根据上述分析,我们需要解决的问题为在

2021-05-09 00:04:42 921

原创 gcc内联汇编

基本格式asm asm-qualifiers ( AssemblerTemplate : OutputOperands [ : InputOperands [ : Clobbers ] ])对于ARMCC,使用__asm而不是asmARM Compiler User Guide Version 6.6asm-qualfiersasm-qualifiers说明volat

2021-05-07 21:10:59 316

原创 1720-解码异或后的数组

题目1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)思路本题很简单,根据异或运算的基本性质,a ^ a = 0,则有a ^ b ^ b = a。对于新数组encode和原数组origin,有encode[i] = origin[i] ^ origin[i+1], 因此encode[i] ^ origin[i] = origin[i + 1]。代码class Solution {public: vector<int> decod

2021-05-07 00:55:24 74

原创 740-删除并获得点数

题目740. 删除并获得点数 - 力扣(LeetCode) (leetcode-cn.com)思路为了获取最多的点数,对于数组nums中的数字n,只存在所有的数字n均被记为点数(选择了数字n)和所有的数字n均没有被记为点数的情况(选择了数字n+1或者n-1使得所有n均被删除),即不存在只选择部分数字n的情况。根据上述分析,本题目可以转化为从存在一些各不相同的数字,每个数字对应一个分数,当选择了数字n就不能选择数字n+1和n-1,求所有可能选择方案得到的分数中的最大分数。设最大的数字为n, 我们

2021-05-06 00:04:14 85

原创 1473-粉刷房子 III

题目1473. 粉刷房子 III - 力扣(LeetCode) (leetcode-cn.com)思路解决这类搜索问题最重要的部分是考虑如何将问题切分成类似的规模更小的问题, 对于本题, 存在三个决定问题规模的量: 房子数目、颜色数目和街区数目。如何控制这些量来实现减小问题规模并同时使得大规模的问题能够利用小规模问题的结果呢?我们需要从最大规模的问题开始考虑,考虑最大规模的问题需要依赖哪些小问题的答案来解决。最大规模的问题需要涂m个房子, 我们考虑第m个房子的涂色方案(暂不考虑已经涂色的情况),

2021-05-04 22:15:56 153

原创 7-整数反转

题目7. 整数反转 - 力扣(LeetCode) (leetcode-cn.com)思路基本流程如下:#mermaid-svg-E9KKBGlWuqlQ5tZQ .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-E9KKBGlWuqlQ5tZQ .label text{fill:#333}#mermai

2021-05-03 10:19:40 51

原创 554-砖墙

题目554. 砖墙 - 力扣(LeetCode) (leetcode-cn.com)思路什么是空隙?首先需要理解一个隐含的条件,即空隙是不占宽度的,即宽度为1和2的中间存在空隙的两堵墙和宽度为3的一堵墙的总宽度是相同的,墙的边缘就算作一个空隙。比如下面这个例子中,第一行的0,1,3都是墙的边缘,均算作一个空隙,第二行0,3是墙的边缘算作空隙。pos 0 1 2 3 | 1 | 2 | | 3 |墙位置和空隙的位置要计算某条线穿过的墙的数量,我们需

2021-05-02 10:48:47 64

原创 690-员工的重要性

题目690. 员工的重要性 - 力扣(LeetCode) (leetcode-cn.com)思路该题目中员工的层级关系组织成了一棵树,然而实际存储过程并没有按照树数据结构存储(只存储了id,没有存储数据结点)。为了实现快速通过id访问数据结点,我们首先需要将员工数据存储到hash表中。之后就需要以一个员工为根节点遍历员工层级树,将遍历过程中的所有结点相加,可以使用DFS或者BFS,下边的代码使用了BFS。代码/*// Definition for Employee.class Emplo

2021-05-01 23:28:06 86

原创 137-只出现一次的数

题目137. 只出现一次的数字 II - 力扣(LeetCode) (leetcode-cn.com)思路我们知道对于异或运算,0⊗a=a0 \otimes a = a0⊗a=a并且a⊗a=0a \otimes a = 0a⊗a=0, 如果存在某种运算⊕\oplus⊕,使得0⊕a=a0 \oplus a = a0⊕a=a并且a⊕a⊕a=0a \oplus a \oplus a = 0a⊕a⊕a=0,那么我们只需要将所有数字使用该运算执行一次即可得到仅出现一次的数字。我们知道异或运算能够实现0⊗a

2021-05-01 23:06:23 59

原创 ARM64虚拟内存

名词解释转换粒度(translation granule) 执行物理页和虚拟页之间转换的最小粒度(物理页大小)内存页(Page) 内存页一般指转换粒度内存块(block) 内存块一般指多个连续的内存页组成的一块内存,当然把一个内存页也称为内存块也是可以的页表项目前64位架构的MMU通常使用4级页表(level 0,1,2,3),支持最大48位有效地址。页表项可以指向下一级页表(table descriptor)或者指向内存块/页(block descriptor, 下图中page descript

2021-04-29 16:32:20 1760

原创 403-青蛙过河

题目403. 青蛙过河 - 力扣(LeetCode) (leetcode-cn.com)思路一个问题:利用青蛙能否到达第j个石子(j<i)的信息, 我们怎么判断青蛙是否能够到第i个石子呢?第i个石子和第j个石子之间的距离为gap = stones[i] - stones[j],因此,如果青蛙能够到达第j个石子,并且到达第j个石子时的跳跃长度为jump,在jump + 1 == gap || jump == gap || jump - 1 == gap时青蛙可以从第i个石子到第j个石子,而其

2021-04-29 12:30:27 170

原创 633-平方数之和

题目633. 平方数之和 - 力扣(LeetCode) (leetcode-cn.com)思路题目需要尝试搜索两个数,使其之和为c, 首先我们需要确定搜索范围。要满足a2+b2=ca^2 + b ^2 = ca2+b2=c,则必有0≤a≤c, 0≤b≤c,0 \le a \le \sqrt{c},\ 0 \le b\le \sqrt{c},0≤a≤c​, 0≤b≤c​,因此,搜索范围限制在[0,c][0,\sqrt{c}][0,c​]。我们设正确结果位于[a,b][a

2021-04-28 21:17:39 67

smcroute-gnueabihf

使用arm-linux-gnueabihf工具链编译的静态链接的可执行文件smcroute,用于实现Linux的静态组播路由

2021-10-06

iptables-1.8.7-arm-gnueabihf.tar.gz

32位ARM嵌入式Linux使用的iptables可执行文件

2021-09-21

qemu_kernel_debug.zip

使用qemu调试Linux内核的教程PPT以及相关文件

2021-07-06

空空如也

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

TA关注的人

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