0%

1.链表

1.1 静态链表(数组模拟)

1.1.1 单链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
const int N = 100010;
int e[N], ne[N], idx, head = -1;

void add_head(int v)
{
e[idx] = v, ne[idx] = head, head = idx++;
}

void add(int k, int v)
{
e[idx] = v, ne[idx] = ne[k], ne[k] = idx++;
}

void remove(int k)
{
if(~k) ne[k] = ne[ne[k]];
else head = ne[head];
}

int main()
{
int m;
cin >> m;
while(m --)
{
int k, v;
char c;
cin >> c;
switch(c)
{
case 'H':
cin >> v;
add_head(v);
break;
// 题中对于k的计数从1开始,但是存储下标从0开始,因此需要k - 1
case 'I':
cin >> k >> v;
add(k - 1, v);
break;
case 'D':
cin >> k;
remove(k - 1);
}
}
for(int i = head; ~i; i = ne[i])
cout << e[i] << " ";
return 0;
}

注1:为了逻辑清晰代码简洁,无论是静态链表还是动态链表都最好加上头节点,但是仅在数组模拟单链表时没有头节点,因为算法题中使用单链表时一般仅使用在头插入新节点,不涉及其他操作,所以没有必要加入头节点

阅读全文 »

1.快速排序

时间复杂度:$O(nlogn)$

1
2
3
4
5
6
7
8
9
10
11
12
void quick_sort(int l, int r)
{
if(l >= r) return;
int x = a[l + r >> 1], i = l - 1, j = r + 1;
while(i < j)
{
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
quick_sort(l, j), quick_sort(j + 1, r);
}

1.1 选择第K大的数字(quick_select)

时间复杂度:$O(n)$

阅读全文 »

1.学会看芯片手册

1.1 GPIO的通用操作方法

参考stm32的GPIO引脚的使用过程:

  1. 使能GPIOx时钟
  2. 设置GPIOx引脚的工作模式(输入、输出、复用、重定向
  3. 读取/设置GOPIOx引脚的电平

一般的,芯片GPIO引脚使能的操作如下:

阅读全文 »

1. 编写驱动程序的框架

1.1 APP 打开的文件在内核中如何表示

APP 打开文件时,可以得到一个整数,这个整数被称为文件句柄。对于 APP 的每一个文件句柄,在内核里面都有一个struct file结构体与之对应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct file {
union {
struct llist_node fu_llist;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path;
struct inode *f_inode; /* cached value */
const struct file_operations *f_op;
/*
* Protects f_ep_links, f_flags.
* Must not be taken from IRQ context.
*/
spinlock_t f_lock;
atomic_long_t f_count;
unsigned int f_flags;
fmode_t f_mode;
struct mutex f_pos_lock;
loff_t f_pos;
struct fown_struct f_owner;
const struct cred *f_cred;
struct file_ra_state f_ra;

在APP中调用open函数打开文件时,传入的flags、mode等参数会记录在内核相应的struct file成员f_flags\f_mode中;读写文件的偏移地址也会保存在struct file结构体的f_pos成员中。

阅读全文 »

来自星辰大海的好奇之旅——在宇宙的尽头里烤棉花糖吧

Snipaste_2024-02-15_10-27-30

​ 28万亿年之前,一个挪麦家族的宇宙飞船突然接收到了一个遥远而古老的信号,他们惊讶的发现这个信号比这个宇宙还要古老,怀着巨大的好奇心毫不犹豫地启动飞船,跃迁到了这个信号所在的星系。

​ 在跃迁的终点,他们非常不幸的碰到了极小的概率;飞船跃迁的坐标处刚好是黑棘星的部分实体,这将宇宙飞船完全损坏,他们不得不选择发射紧急逃生舱离开不适宜生存的黑棘星。三艘逃生舱中的两艘幸运地穿过了黑棘星复杂的藤蔓结构和巨大安康鱼的追捕,分别在碎空星和灰烬双星成功降落。

Snipaste_2024-02-15_10-48-06

阅读全文 »

1.TTY体系的发展

参考:

Linux 终端(TTY)

解密 TTY 设备

1.1 终端机

从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。电传打字机(teletype)可以被看作是这类设备的统称,因此终端也被简称为 TTY(teletype 的缩写):

image-20231006145708741

阅读全文 »

1. 线程的标识 pthread_t

对于每一个进程都有唯一PID号与之对应,而对于线程而言,也有类似的tid号,即一个pthread_t类型的变量。线程号是表示线程的唯一标识,但是对于线程号而言,其仅仅在其所属的进程上下文中才有意义。

获取当前线程的线程号:

1
2
#include <pthread.h> 
pthread_t pthread_self(void);

2. 线程的创建

阅读全文 »

1. 电阻屏和电容屏定位原理

1.1 电阻屏

image-20230922200403814

  • 根据分压原理,计算电阻值。假设材料长度和电阻成线性关系,则可以计算出相对距离
  • 电阻屏分为上下两层薄膜,一层通电时,另一层在按压时作为探针获取分压值,从而进行计算
  • 电阻屏和LCD使用之前,需要进行五点校准二者的相对位置

1.1.1 电阻屏数据

阅读全文 »