摘要: 把数字转化为二进制表示后,对每一位的0或者1进行运算,比如与、或、异或、左移、右移等; 左移n位:丢弃最左边的n位,右边补n个0; 右移n位:丢弃最右边的n位,左边补符号位(无符号则补n个0,有符号则补n个1); 二进制中1的个数(剑指offer 面试题10) 题目:请实现一个函数,输入一个整数,输 阅读全文
posted @ 2019-09-02 22:15 博1990 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 递归:代码简洁,但是效率低(每次函数调用都有时间和空间的开销); 循环:和递归相反; 斐波那契数列(剑指offer 面试题9) 题目:写入一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义:f(n) = f(n-1) + f(n-2),初始值f(0)=0且f(1)=1 阅读全文
posted @ 2019-09-02 21:39 博1990 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 查找:顺序查找、二分查找、哈希表查找、二叉排序树查找; 排序:冒泡、插入、归并、快排; 快排中的Partition函数 对公司所有员工的年龄排序 计数排序 二维数组的查找(剑指offer 面试题3) 详情见“数组”专栏:查找; 旋转数组的最小数组(剑指offer 面试题8) 详情见“数组”专栏:查找 阅读全文
posted @ 2019-09-02 21:10 博1990 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 未完待续~ 阅读全文
posted @ 2019-09-01 13:14 博1990 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 根节点没有父节点,其他每个结点只有一个父节点; 叶节点没有子节点,其他每个结点都有一个或多个子节点; 二叉树:每个结点最多只能有两个子结点。遍历方式有三种:前序(根-左-右)、中序(左-根-右)、后序(左-右-根); 二叉排序树:对于每个结点,左子树所有结点 < 根结点,根结点 < 右子树所有结点; 阅读全文
posted @ 2019-09-01 13:13 博1990 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 先进先出,只能在队尾插入,队首删除 应用领域:两个队列实现栈、树的BFS(宽度优先遍历); 用两个队列实现一个栈(剑指offer 面试题7习题) 题目:用两个队列实现一个栈。栈的声明如下:请实现它的两个函数push和pop,分别完成在入栈和出栈的功能; 解题思路: 一个非空队列和一个空队列; (1) 阅读全文
posted @ 2019-09-01 13:07 博1990 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 栈只能在顶端插入或删除元素,它的特点是先进后出。 应用领域:操作系统会为每个线程创建一个栈用来存储函数调用时的各个函数的参数、返回值及临时变量。 用两个栈实现队列(剑指offer 面试题7) 题目:用两个栈实现一个队列。队列的声明如下:请实现它的两个函数push和pop,分别完成入队和出队的功能; 阅读全文
posted @ 2019-09-01 13:06 博1990 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 由指针把若干个结点连接成链状结构。它是一种动态结构,因为在创建链表时无须知道链表长度。 插入一个结点时只需要为新结点分配内存,然后调整指针的指向即可。 如果链表的头指针会有更改,那么参数应该设为指向指针的指针,即ListNode **pHead。 优点:空间效率高,因为是每添加一个结点才分配一次内存 阅读全文
posted @ 2019-09-01 13:05 博1990 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 字符串是有若干字符组成的序列,C/C++中每个字符串都以'\0'作为结尾,这样就很容易找到字符串的最后尾部,但是需要一个额外字符的开销,容易造成越界; 常量字符串是在一块单独的只读的内存区域,其内容不可更改; 替换空格(剑指offer 面试题4) 题目:请实现一个函数,把字符串中的每个空格替换成“% 阅读全文
posted @ 2019-09-01 12:43 博1990 阅读(372) 评论(0) 推荐(1) 编辑
摘要: 连续内存且顺序存储,在创建数组时必须指定容量大小; 优点:时间效率高,即查找效率高O(1),而且可以实现简单的哈希表; 缺点:空间效率低,即使只存储一个数据也要为所有数据分配空间,而且插入和删除效率低O(n); 二维数组的查找(剑指offer 面试题3) 题目:在一个二维数组中,每一行都按照从左到右 阅读全文
posted @ 2019-09-01 12:31 博1990 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 链接:https://blog.csdn.net/changexhao/article/details/78321295(https://www.cnblogs.com/wrjvszq/p/4257164.html) 一、Linux体系架构 Linux内核只是Linux操作系统的一部分,对下它管理系 阅读全文
posted @ 2019-08-29 12:04 博1990 阅读(889) 评论(0) 推荐(0) 编辑
摘要: 一、静态库和共享库的区别 静态库在编译的时候被加载,而共享库在执行之后才被加载 加载静态库编译所生成的可执行文件比使用共享库的方式要大 静态库以.a为后缀,共享库以.so为后缀 二、静态库的制作 gcc -c add.c sub.c(编写源文件,gcc -c命令生成对应的目标文件add.o和sub. 阅读全文
posted @ 2019-08-29 10:45 博1990 阅读(465) 评论(0) 推荐(0) 编辑
摘要: 一、libusb常用数据结构 libusb_device *list:设备列表 libusb_device_handle *handle:设备句柄 struct libusb_device_descriptor desc:设备描述符 struct libusb_config_descriptor c 阅读全文
posted @ 2019-08-28 16:22 博1990 阅读(1876) 评论(0) 推荐(0) 编辑
摘要: 链接:https://blog.csdn.net/zqixiao_09/article/details/50984074 一、USB设备由3个功能模块组成,USB总线接口、USB逻辑设备和功能单元: USB总线接口:USB设备中的串行接口引擎SIE USB逻辑设备:被USB系统软件看作是一个端点的集 阅读全文
posted @ 2019-08-28 15:29 博1990 阅读(1295) 评论(0) 推荐(0) 编辑
摘要: 一、Ubuntu下需要安装软件的三种方法(链接:https://www.cnblogs.com/xwdreamer/p/3623454.html),如下: 1 apt-get直接安装 sudo apt-get install xxx sudo apt-get remove xxx sudo apt- 阅读全文
posted @ 2019-08-28 11:59 博1990 阅读(449) 评论(0) 推荐(0) 编辑
摘要: gcc、make、cmake的区别和联系: (1)gcc是GNU Compiler Collection编译器,可以编译多种编程语言,比如C/C++等;当包含多个源文件时需要用gcc命令逐个去编译,工作量较大且比较混乱; (2)make工具可以看成一个只能的批处理工具,它本身并没有编译和链接的功能, 阅读全文
posted @ 2019-08-27 17:25 博1990 阅读(3754) 评论(0) 推荐(0) 编辑
摘要: 1 交互式脚本:变量内容由用户决定 2 随日期变化:利用日期创建文件 3 数值运算:简单的加减乘除 4 test命令 5 判断符号[] 1 #!/bin/bash 2 3 read -p "Please input y/n: " yn 4 5 if [ "$yn" == "Y" ] || [ "$y 阅读全文
posted @ 2019-08-27 16:40 博1990 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 进程间通信(IPC)就是指不同进程之间传播和交换数据,每个进程各自有不同的用户地址空间(虚拟地址空间),任何一个进程的全局变量在另一个进程中都看不到,所以进程间要交换数据必须能通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷贝到内核缓冲区,进程B再把数据从内核缓冲区拷贝到自己的用户空间,内 阅读全文
posted @ 2019-08-23 17:52 博1990 阅读(540) 评论(0) 推荐(0) 编辑
摘要: 一、共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快。 二、内存映射mmap 1 前言:先介绍一下普通的读写文件的原理,进程调用read/write系统调用后会陷入内核,内核开始读写文件,假设内核 阅读全文
posted @ 2019-08-21 14:58 博1990 阅读(2186) 评论(0) 推荐(1) 编辑
摘要: I/O多路复用:单个线程可以同时处理多个I/O; 一、select:成功则返回已准备好的文件描述符个数,超时则返回0,出错则返回-1; (1)头文件包含:#include <sys/select.h>、<unistd.h>、<sys/time.h>; (2)select返回后集合fdset中只有事件 阅读全文
posted @ 2019-08-20 22:06 博1990 阅读(445) 评论(0) 推荐(0) 编辑
摘要: Linux的进程处理函数需包含头文件:#include <unistd.h> 一、进程函数 1 进程创建 pid_d fork(void); 2 进程终止:只有exit才会先清理I/O再进入内核,所以输出缓冲中的所有数据都会被写入到文件中,等同于return 0; void exit(int sta 阅读全文
posted @ 2019-08-20 20:31 博1990 阅读(443) 评论(0) 推荐(0) 编辑
摘要: Linux的线程处理函数需包含头文件:#include <pthread.h> 一、线程函数:成功则返回0,出错则返回错误编号 1 线程创建 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_r 阅读全文
posted @ 2019-08-20 17:22 博1990 阅读(1606) 评论(0) 推荐(0) 编辑
摘要: Linux下的大部分文件/目录处理函数都需包含头文件:#include <sys/stat.h>,少部分需包含<unistd.h>或<stdio.h> 01 文件类型: S_ISREG(st_mode) 普通文件 S_ISDIR(st_mode) 目录 S_ISCHR(st_mode) 字符设备 S 阅读全文
posted @ 2019-08-20 15:31 博1990 阅读(973) 评论(0) 推荐(0) 编辑
摘要: 一、C语言标准库中字符处理函数许包含头文件 <string.h>,常用字符串吹函数列表如下: 1 计算字符串长度 size_t strlen(const char *str); //不包含结束符'\0' 2 字符串拷贝 char *strcpy(char *dest, const char *src 阅读全文
posted @ 2019-08-20 11:23 博1990 阅读(691) 评论(0) 推荐(0) 编辑
摘要: 一、文件头: sizeof(Elf32_Ehdr)=52 e_type: 类型 可重定位文件.o、可执行文件、共享目标文件.so e_ehsize: 文件头大小 52 e_machine: CPU平台属性,如Intel_x86; e_entry: 入口虚拟地址,但是可重定位文件没有; e_shoff 阅读全文
posted @ 2019-08-20 00:37 博1990 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 一、应用层 1 DNS:域名系统(Domain Name System),将互联网上的主机名字即域名转换为IP地址,端口号53,解析过程如下: 如果主机和本地的缓存里面没有对应的IP地址则: 主机 >本地域名服务器: 本地 >根 本地 >顶级 本地 >权限 本地域名服务器 >主机; 2 FTP:文件 阅读全文
posted @ 2019-08-20 00:19 博1990 阅读(375) 评论(0) 推荐(0) 编辑
摘要: 一、进程、线程管理 1 基本概念 进程是资源分配的基本单位,是正在执行程序的实例,是动态的,而程序是静态的,同一个程序跑两次则是两个进程; 线程是CPU独立调度的基本单位,共享整个地址空间、全局变量、打开的文件描述符;私有数据:堆栈、寄存器、程序计数器; 并行:同一时刻有多个进程在运行,比如多核处理 阅读全文
posted @ 2019-08-19 23:15 博1990 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 一、在Linux的文件系统调用中,所有函数都是根据文件描述符fd来访问文件的,如下: 1 文件描述符的创建和关闭 int open(const char *path, int oflag,...); //成功则返回文件描述符fd,出错则返回-1 int create(const char *path 阅读全文
posted @ 2019-08-19 21:20 博1990 阅读(671) 评论(0) 推荐(0) 编辑
摘要: 转载:https://blog.csdn.net/zhangshk_/article/details/82911093 01 术语: 稳定:假设排序前a在b前面且a=b,那么排序后a仍然在b前面,即排序过程中不会出现跳跃式交换数据,只能相邻的才交换数据; 不稳定:和上面相反; 内排序:比较排序,即所 阅读全文
posted @ 2019-08-19 19:23 博1990 阅读(319) 评论(0) 推荐(0) 编辑