自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菜籽爱编程

一个又菜又爱编程的小孩子

  • 博客(66)
  • 收藏
  • 关注

原创 入门Go语言,这一篇就Go了(10w+字小结)

Go 语言入门教程

2022-04-27 22:24:58 1231

原创 手把手教你重装操作系统

一般情况下,我重装系统喜欢用原始方法安装,那就是制作系统 U 盘的方法。选择并下载操作系统镜像首先,我们肯定要找到适合自己的一款操作系统,当然,前提是符合硬件要求。下面是我一般选择的操作系统下载网站: MSDN 。前两年这个网站改版了,更加适合小白。网站上面基本都有适合你的操作系统版本,链接在下面,要的自行保存。旧版网站地址:https://msdn.itellyou.cn/?lang=zh-cn新版网站地址:https://next.itellyou.cn下载制作系统 U 盘工具在网站上面

2022-04-02 10:13:26 630

原创 操作系统实验Lab 2:system calls(MIT 6.S081 FALL 2020)

实验要求实验前须知阅读 xv6 文档的第 2 章和第 4 章的 4.3 节和 4.4 节以及相关源文件:系统调用的用户空间代码在 user/user.h 和 user/usys.pl 中。内核空间代码在 kernel/syscall.h 和 kernel/syscall.c 中。与进程相关的代码在 kernel/proc.h 和 kernel/proc.c 中。使用下面的命令切换到 syscall 分支。$ git fetch$ git checkout syscall$ make c

2021-11-08 21:55:13 7815 12

原创 xv6 系统启动代码分析(MIT 6.S081 FALL 2020)

当 risc-v 计算机上电时,它自身初始化,并运行一个引导加载器(存储在 ROM 中)。引导加载器装载 xv6 的内核到内存的 0x8000000 开始的存储空间中。然后在 machine mode 下, CPU 从 kernel/entry.s 的 _entry 处开始执行指令。xv6 启动时页设备是禁用的,所以虚拟内存地址直接映射到物理内存地址。不从 0x0 开始是因为 0 ~ 0x80000000 之间包含 IO 设备。下面是 kernel/entry.S 的源码清单 # qemu -kerne

2021-11-05 13:21:00 1639

原创 图解地址解析协议ARP

我们知道,网络层使用的是 IP 地址,而在实际网络的链路上传送数据帧时,最终还是必须使用链路层的 MAC 地址。所以,在链路上传送数据帧时只知道 IP 地址是不够的,我们还需要知道主机在网络中的有效 MAC 地址,那么有没有什么办法可以把 IP 地址转换为物理地址呢?那就要用 地址解析协议(ARP) [RFC0826] 来解决这个问题了。地址解析协议(Address Resolution Protocol, ARP) 是一个通用的协议,从这个意义上来看,它被设计为支持多种地址之间的映射。也就是说 ARP

2021-10-24 10:08:22 530

原创 操作系统实验Lab 1:Xv6 and Unix utilities(MIT 6.S081 FALL 2020)

Lab 1 Xv6 and Unix utilities实验要求链接Boot xv6 (easy)实验目的切换到 xv6-labs-2020 代码的 util 分支,并利用 QEMU 模拟器启动 xv6 系统。实验步骤使用下面的命令克隆 xv6-labs-2020 代码到本地。git clone git://g.csail.mit.edu/xv6-labs-2020使用下面的命令进入 xv6-labs-2020 代码目录。cd xv6-labs-2020使用下面的命令切换到 util

2021-10-04 11:01:16 12421 9

原创 图解IP地址表示

IPv4 地址我们常见的 IP 地址类型都是 IPv4 地址。例如常见的 192.168.0.1 就是 IPv4 地址,像上面这种 IPv4 地址表示法我们称之为 点分四组表示法 (又称为 点分十进制表示法 )。实际上真正的 IPv4 地址是由二进制组成的,上面这种表示法只是为了方便我们的记忆。IPv4 地址长度为 32位 ,即 32 位由 0 和 1 组成的二进制数字。因此,IPv4 地址空间支持2322^{32}232(4  294  967  2964 \; 294 \; 967 \; 296429

2021-09-17 16:58:04 1456

原创 用 Minecraft 学会逻辑门

用 Minecraft 学会逻辑门逻辑门是数字系统的主要结构部分,也是学习计算机组成原理必须知道的基础知识。今天我们就用我的世界(Minecraft)Java版来讲一讲逻辑门电路,所需材料就是相应数量的红石、红石比较器、红石中继器、红石火把、红石块、拉杆(当开关使用)和红石灯(便于看清输入和输出信号)。逻辑门是一个硬件模块,当满足输入逻辑要求时,该模块会生成二进制 0 或 1 的信号。每个门都有一个不同的图形符号。接下来我们使用 Minecraft(Java版)讲讲如何构造七个基本逻辑门,它们分别是:与门

2021-09-07 16:59:53 1150

原创 操作系统实验Lab 0:实验环境搭建(MIT 6.S081 FALL 2020)

MIT 6.S081 Operating System Engineering (FALL 2020) 课程实验采用的是 xv6 系统。xv6 是在ANSI C中针对多处理器x86系统的Unix第六版的现代重新实现。配套资源链接MIT 6.S081 Operating System Engineering FALL 2020 视频链接MIT 6.S081 Operating System Engineering FALL 2020 视频中文字幕翻译链接MIT 6.S081 Operating Sy

2021-08-11 17:28:14 3901 2

原创 使用Python处理Excel表格

安装 openpyxl 模块在 Python 中没有自带的处理 Excel 表格的模块,所以我们在 Windows上使用 pip install --user openpyxl 命令安装第三方模块 openpyxl 。读取 Excel 表格使用 openpyxl.load_workbook() 函数,传入路径和文件名,返回 workbook 数据类型的值。 workbook 的 sheetnames 属性,获取 Excel 文档所有表名的列表。每个表都是由一个 Worksheet 对象,使用中括号

2021-08-09 17:12:12 684

原创 使用Python操作压缩文件

我们经常使用压缩程序对文件进行压缩打包,在 Python 中也提供了相应的 zipfile 模块方便我们对 ZIP 压缩文件进行操作。读取 ZIP 压缩文件读取 ZIP 压缩文件必须先创建 ZipFile 对象,通过调用 zipfile.ZipFile() 函数,传入 ZIP 文件名字符串就能获取到此 ZipFile 对象, ZipFile 对象与 File 对象类似,使用后需要调用 close() 函数关闭 ZIP 文件。使用 ZipFile 对象的 namelist() 方法可以返回 ZIP 文件中

2021-08-09 17:10:41 937

原创 使用Python组织文件

在 Python 中, shutil 模块提供了一系列对文件和文件集合的高级操作。特别是提供了一些支持文件拷贝和删除的函数。下面介绍一些组织文件常用操作。复制文件使用 shutil.copy(src, dst) 可以把 src 路径下的指定文件复制到 dst 路径下,如果 dst 为路径,则复制后的文件名和原文件一致。如果 dst 为路径加上文件名,则复制后的文件名为当前指定的文件名。最后该函数会返回文件的路径字符串。注意:即便是高级文件拷贝函数也无法拷贝所有的文件元数据。例如在 Windows 操作

2021-08-09 17:09:44 112

原创 Python 文件路径

获取主目录提到文件路径问题,不得不先提一下不同操作系统上文件夹之间的分隔符。在 Windows 操作系统上,路径的写法采用的是 \ 反斜杠。而在 macOS 和 Linux 操作系统上,路径的写法采用的是 / 正斜杠。作为一门跨平台的语言, Python 必须处理上述路径表示的不同。好在使用 pathlib 模块的 Path() 函数处理路径问题很简单。下面的例子演示了在 Windows 系统下获取主目录的例子。>>> from pathlib import Path>>

2021-08-09 17:08:41 8918

原创 最全的 PyInputPlus 模块方法总结

安装第三方模块在 Windows 和 macOS 中,pip 会随着 Python 自动安装。可以通过命令行窗口输入 pip 检查是否已经安装。但在 Linux 中,必须由你单独安装。在 Ubuntu Linux 或 Debian Linux 上使用 sudo apt-get install python3-pip 安装,在 Fedora Linux 上使用 sudo yum install python3-pip 安装。使用 pip install --user MODULE 安装相应的第三方模块。输

2021-08-03 16:17:10 2054 2

原创 Python正则表达式

在登录某些网站时,需要填写邮箱等相关信息,在邮箱格式填错时,页面总能第一时间检出并告知用户邮箱格式有误,那么程序员是使用什么方法实现这种检测的呢?一般会使用正则表达式。正则表达式定义了字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。Python 也提供了对正则表达式操作的支持, Python 通过标准库中的 re 模块来支持正则表达式操作。查找第一次出现的匹配文本首先,通过一个例子来看看如何在 Python 中使用正则表达式查找文本

2021-08-02 16:15:05 119

原创 Python入门(13)——文件和异常

在开发中经常要对数据进行持久化操作,实现数据持久化最直接的方式就是将数据保存到文件中。在 Python 中实现文件的读写操作非常简单,通过 Python 内置的函数,就可以获得操作文件的对象,从而对文件进行读写操作。读取文件首先,我们通过一个例子来看看如何使用Python内置的 open() 函数读取文件。在项目目录下创建一个文件,文件内容为字母表,文件名为 alphabet.txt 。alphabet.txt内容abcdefghijklmnopq rstuvw xyzif __name_

2021-07-30 16:24:28 128

原创 Python入门(12)——类

在Python中,一切都是对象,对象是类的实例,类是对象的蓝图和模板。类是一个抽象的概念,对象是一个类具体的实例。每个对象都有属性和行为,它们都是独一无二的,而且对象一定属于某个类。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个类。例如:学生都有学号、姓名等信息(属性),并且都有学习、吃饭等行为,我们就可以把所有学生抽象成一个学生类,而一个具体的学生就是一个对象。定义类使用class定义类,在类中定义的函数称为方法,下面的例子演示了如何定义一个学生类以

2021-07-29 17:30:01 192

原创 Python入门(11)——函数

函数是带名字的代码块,用于完成特定的任务,当在程序中多次执行同一任务时,无需反复编写重复的代码块,只需调用执行该任务的函数即可。函数的声明在Python中使用def关键字来声明函数,每个函数都有一个的函数名,我们通过函数名调用函数。在函数名后面的圆括号中可以放置传递给函数的参数,当然函数也可以没有参数,没有参数的函数叫做无参函数。函数内容以:开始,并且函数体要缩进。在函数执行完成后可以通过return关键字来返回一个值给调用方,没有return语句相当于返回None。有关函数的说明写在声明函数的下方,称

2021-07-28 16:31:53 265

原创 Python入门(10)——集合

集合的创建集合是由不重复元素组成的无序容器。创建集合用{}大括号或set()函数。注意,创建空集合只能用set(),不能用{},{}创建的是空字典。下面的例子演示了如何创建一个集合以及创建空集合。>>> numbers = {0, 1, 2, 3, 4, 5} # 用大括号创建集合>>> print(numbers){0, 1, 2, 3, 4, 5}>>> type(numbers)<class 'set'>>&

2021-07-27 16:16:11 363

原创 Python入门(9)——元组与字典

元组元组的定义不可修改的列表称为元组。元组定义与列表定义的区别在于列表使用[]标识,而元组使用()标识。严格地说,元组是由逗号,标识的,圆括号只是让元组看起来更整洁。下面的例子演示了元组如何定义。>>> tuple1 = ('a', 'b', 'c')>>> print(tuple1)('a', 'b', 'c')>>> type(tuple1)<class 'tuple'>>>> tuple2 = 'a

2021-07-26 16:34:14 304

原创 最全的Python海龟绘图总结

命令及功能说明表功能简称命令参数说明功能说明前进forward(distance)fd(distance)distance:整数或浮点数使海龟沿着当前指向的方向前进 distance 指定的距离后退back(distance)bk(distance)backward(distance)distance:整数或浮点数使海龟后退 distance 指定的距离,但是不改变海龟的原来的朝向右转right(angle)rt(angle)angle:整数或浮点数使

2021-07-23 17:42:11 3446 5

原创 Python入门(8)——列表

列表的定义列表是由一系列按特定顺序排列的元素组成。列表可以包含不同类型的元素。列表内元素的值可以重复。列表通常用单词名称的复数表示。列表用方括号[]表示,元素用,隔开。>>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> print(numbers)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> type(numbers)<class 'list'>>&g

2021-07-22 13:41:54 946 1

原创 Python入门(7)——分支语句与循环语句

Python代码块首先说明一下Python代码块的问题。Python有着严格的代码缩进要求,对于有C++、Java等编程经验的人来说,区分代码块是以花括号{}形式进行划分的。但对于Python来说,Python区分代码块是以缩进形式进行划分的,即属于同一个代码块的代码有着相同的缩进,所以,在Python中,千万不要随意添加空格,一般我们使用Tab制表符进行缩进,每次缩进为一个制表符长度,即4个空格。代码块有以下规则:缩进增加时,代码块开始代码块可以包含其他代码块缩进减少为零,或与外面包围代码块对

2021-07-21 23:32:06 432 2

原创 Python入门(6)——Python中的注释

单行注释Python中单行注释以#号开头,在#号后面跟的内容会被python解释器忽略,不执行当前行#号后面的语句。例如下面的代码执行后会打印出HelloWorld。print("Hello");print("World")而下面的代码执行后只会打印Hello。print("Hello")#;print("World")当然,上面的例子只是为了说明#号后面的代码不被执行,写注释主要目的还是应该阐述代码要做什么以及如何做。多行注释多行注释也可以使用#号,只不过要在注释的每行前都加上#号

2021-07-20 14:37:09 339

原创 Python入门(5)——操作字符串的一些方法

操作字符串的一些方法修改字符串大小写title():把字符串中每个单词首字母改为大写。upper():把字符串中所有字符改为大写。lower():把字符串中所有字符改为小写。>>> 'the introduction to python'.title()'The Introduction To Python'>>> 'abc'.upper()'ABC'>>> 'ABC'.lower()'abc'在字符串中使用变量字符串变量 =

2021-07-20 14:34:43 146 1

原创 Python入门(4)——Python的基本运算符

数学运算符(优先级从高到低)操作符操作例子结果**指数2 ** 416%取余数/取模15 % 21//整除/商数取整数15 // 43/除法15 / 43.75*乘法3 * 618+加法1 + 23-减法2 - 11在运算中,只要有操作数为浮点数,python默认得到的总是浮点数。将任意两个数相除时,结果总是浮点数。在写很大的数时,可以使用下划线将其中的数字分组,但打印此数时,python不会打

2021-07-20 14:33:08 237

原创 Python入门(3)——常见的几种基本数据类型

Python常见的几种基本数据类型Python是弱类型语言,相对于强类型语言,它不需要声明变量的类型。在Python中一切都是对象。可以使用id()函数查看此对象的id。Python中的数据类型很多,而且也允许我们自定义新的数据类型(这一点以后会讲到),我们先介绍几种常用的基本数据类型。可以使用type()函数查看变量类型。1. 整数型(int)Python中可以处理任意大小的整数,支持二进制(如0b100)、八进制(如0o100)、十进制(100)和十六进制(0x100)的表示法。例如:-1,0,

2021-07-20 14:30:55 303

原创 Python入门(2)——变量和常量

变量变量名格式要求变量名只能由字母、数字和下划线(_)组成。变量名必须是字母表中的字母或下划线(_)开头。变量名对大小写敏感。变量名中不能包含空格。不能将python关键字作为变量名。查看python关键字如何查看python关键字有哪些呢?我们有两种查看方式。第一种方式,可以使用python标准库提供的keyword模块,将当前python版本的所有关键字列出。在python中使用以下两条语句,即可查询。>>> import keyword>>&gt

2021-07-20 14:28:42 215

原创 Python入门(1)——搭建环境

Life is short,you need Python.–Bruce Eckel“人生苦短,我用Python”Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计。因其简单易学,如今备受追捧。第一个Python程序用python写出一个在屏幕上显示“Hello Python!”的程序,你只需要编写一行Python代码就可以搞定:print("Hello Python!")在Linux系统中搭建Python编程环境(以Ubuntu为例).

2021-07-19 17:31:14 146

原创 912.排序数组(中等)

LeetCode 912.排序数组题目链接题目描述:给你一个整数数组 nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1 <= nums.length <= 50000-50000 <= nums[i] <= 50000题目分析:假设有以下数组需要排序,我们采用归并排序解法。首先将数组分割成两个

2021-07-19 16:59:39 49

原创 初试鸿蒙——构建第一个鸿蒙应用

2021年6月2日晚,华为正式发布HarmonyOS 2及多款搭载HarmonyOS 2的新产品。这也意味着“搭载HarmonyOS(鸿蒙)的手机”已经变成面向市场的正式产品。6月9日,“HarmonyOS Sans”公开上线,可以免费商用。那么,鸿蒙系统究竟是什么呢?鸿蒙系统(HarmonyOS)定位鸿蒙系统(HarmonyOS)是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,鸿蒙系统(HarmonyOS)提出了基于同一套系

2021-06-11 03:19:05 1490

原创 6分钟彻底搞定冒泡排序

冒泡排序原理冒泡排序(Bubble Sort),重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。冒泡排序思路比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个(即已经排好的元素)。重复上面的步骤,直到没有任何一对数字需

2021-06-02 10:03:51 149

原创 75.颜色分类(中等)

LeetCode 75.颜色分类题目链接题目描述:给定一个包含红色、白色和蓝色,一共 n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1和 2分别表示红色、白色和蓝色。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nums = [0]输出:[0]示例 4:输入:nums =

2021-05-31 11:23:07 68

原创 451.根据字符出现频率排序(中等)

LeetCode 451.根据字符出现频率排序题目链接题目描述:给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:“tree”输出:“eert”解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。示例 2:输入:“cccaaa”输出:“cccaaa”解释:'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。

2021-05-28 13:49:27 84

原创 347.前K个高频元素(中等)

LeetCode 347.前K个高频元素题目链接题目描述:给你一个整数数组 nums和一个整数 k,请你返回其中出现频率前 k高的元素。你可以按 任意顺序返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:1 <= nums.length <= 10510^{5}105k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换

2021-05-28 08:55:47 73

原创 4分钟学会桶排序

桶排序算法思想桶排序思想就是把区间划分为n个大小相同的子区间,这样的子区间称为桶。然后将区间的每个元素按区间范围分到各个桶中去。每一个桶再分个排序,然后按照次序把每个桶中的元素依次取出来,就能把区间排完序。桶排序的时间复杂度和空间复杂度都是O(n),桶排序是一种稳定的排序算法。但是桶排序的性能并非是绝对稳定的,因为如果元素分布不均衡,比如说创建了100个桶,大多数元素都集中在了第1个桶,这样桶排序的时间复杂度就会退化为O(n logn),而且还浪费了空间。一个例子带你了解桶排序假设有一个序列,我们对此

2021-05-27 22:59:21 175

原创 215.数组中的第K个最大元素(中等)

LeetCode 215.数组中的第K个最大元素题目链接题目描述:在未排序的数组中找到第 k个最大的元素。请注意,你需要找的是数组排序后的第 k个最大的元素,而不是第 k个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k总是有效的,且 1 ≤ k ≤ 数组的长度。题目分析:这道题最快的解题思路就是直接把数组排序,返回倒数第k个元素即可。当然我

2021-05-26 09:20:28 41

原创 5分钟搞定快速选择算法

快速选择思想快速选择思想源于快速排序,但我们只进行部分快速排序,只要找到我们要的位置上的元素,排序就不再进行下去。快速选择的方法跟快速排序基本一致,差别在于我们有给定要找的元素位置,在排序基准值时,把基准值的位置和我们要找的位置进行比较。如果我们要找小于基准值位置的元素,便缩小至左子区间继续查找;如果我们要找大于基准值位置的元素,便缩小至右子区间继续查找。一个例子让你掌握快速选择我们给定一个数组,假设要找排完序后数组的第3个位置上元素的值。我们定义临时变量temp存放基准值,定义左标志位定位至数组第一

2021-05-26 08:43:49 1424

原创 1分钟掌握快速排序

快速排序思想最开始找出一个基准值,通过一趟排序将待排序的序列分割成独立的两个部分,前面的这一部分元素都比基准值小,后面这一部分的元素都比基准值大。然后分别再对两个部分的序列进行排序,以达到整个序列有序。一个例子让你完全掌握快速排序我们给定一个无序数组。定义临时变量temp存放基准值,定义左标志位定位至数组第一个元素,定义右标志位定位至数组最后一个元素。我们假定左标志位为基准值。首先我们把左标志位的元素值5放入临时变量temp中。然后比较基准值5与右标志位元素值8。右标志位的值大于基准值,满足排

2021-05-25 01:20:01 83

原创 二分查找总结

二分查找二分查找也常被称为二分法或者折半查找(Binary Search),每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n)O(n)O(n) 的数组,二分查找的时间复杂度为 O(logn)O(log n)O(logn)。二分查找也可以看作双指针的一种特殊情况。双指针类型指针通常是一步一步移动的,而在二分查找里指针每次移动半个区间长度。通常题目给定顺序存储结构我们可以联想到二分查找。下面给出了二分查找的算法框架,需要注意的部分就在于左右边界的初始定

2021-05-20 00:50:25 49

空空如也

空空如也

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

TA关注的人

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