编程
文章平均质量分 58
Schuyler Hu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
链表中的节点每k个一组翻转
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。双指针确定反转区间,然后反转链表,返回新的头结点,原来的头结点经过反转后就变成了尾节点。每次递归调用,将 k 个节点反转,并返回反转过的新的头结点。...原创 2022-06-09 21:06:54 · 678 阅读 · 0 评论 -
链表内指定区间反转
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。原创 2022-06-09 18:10:27 · 623 阅读 · 1 评论 -
合并K个已排序的链表
由于代码形参是直接给了一个数组,因此可以把每个节点都当成一个链表,然后通过每两个节点合并,构成新的链表,再与下一个节点合并,就可以实现整体K个链表的合并。但是这种方法会超时,无法ac。因此采用从中间将数组一分为二,直到分成一个个单独节点。最后将单独节点连接起来,得到合并后的K个链表。...原创 2022-06-09 13:34:46 · 392 阅读 · 0 评论 -
Linux 内存管理
Linux 内存管理为什么需要内存管理设想一下,CPU 要是直接操作内存的物理地址,那么想要在内存中同时运行两个程序是不可能的,因为第一个程序在一个地址写入一个新值会覆盖第二个程序相同地址上的数据。操作系统为了解决这个问题,避免了两个程序都对绝对物理地址的引用。操作系统为每个进程分配了独立一套虚拟地址,至于虚拟地址是怎么映射到物理地址,对于进程来说是透明的。程序要访问虚拟地址时,由操作系统转换成不同的物理地址,不同进程运行时,写入的是不同的物理地址,这样就不会冲突了。如何管理内存针对虚拟地址空间原创 2022-05-04 14:26:03 · 1535 阅读 · 2 评论 -
C++万字总结(中篇)
文章目录菜狗程序员 C++ 万字总结,从入门到入土(中篇)STLvectorstringliststackqueue二叉搜索树AVL 树菜狗程序员 C++ 万字总结,从入门到入土(中篇)STLvector模拟实现#include <iostream>namespace Schuyler{ // 因为 vector 容器可以存放任意类型,所以要用模板 template <class T> class vector { public: // 用迭代器包装任意原创 2022-04-06 13:13:21 · 1130 阅读 · 0 评论 -
C++ 万字总结(下篇)
文章目录菜狗程序员 C++ 万字总结,从入门到入土(下篇)特殊类设计一个类,该类只能在堆上创建对象设计一个类,该类只能在栈上创建对象设计一个类,该类不能被拷贝设计一个类,该类不能被继承单例模式C++ 11{}列表初始化decltype右值引用移动构造万能引用新的类功能可变参数模板lambda 表达式emplace_back线程库智能指针菜狗程序员 C++ 万字总结,从入门到入土(下篇)特殊类设计一个类,该类只能在堆上创建对象class HeapOnly{public: static He原创 2022-03-13 15:49:15 · 2114 阅读 · 0 评论 -
C++ 万字总结(上篇)
文章目录菜狗程序员 C++ 万字总结,从入门到入土(上篇)C++ 语法namespace缺省参数函数重载引用内联函数auto范围 fornullptrC++ 类与对象类的定义this 指针默认(缺省)成员函数const友元初始化列表static 成员C++ 11 成员初始化内部类内存管理虚拟内存分布C/C++ 内存管理模板C++ IO 流继承多态菜狗程序员 C++ 万字总结,从入门到入土(上篇)C++ 语法namespacenamespace 用来解决 C 语言命名缺陷问题,通过使用 namespa原创 2022-03-05 21:48:00 · 717 阅读 · 0 评论 -
【稳住,can win】Python模块
模块与包每个包必须包含一个__init__,然后再包含其他模块,模块可以是一个文件,其中包含类或函数。如上图就有三个包,每个包各自还包含了两个模块。总结:模块就是一组代码集合。模块的使用模块可以使用关键字import。当我们在代码中使用import导入模块时,就相当于定义了一个变量指向该模块。...原创 2021-11-04 20:11:48 · 167 阅读 · 0 评论 -
【稳住,can win】Python朴素文件操作
朴素的文件操作写# 在Linux编/解码为 utf-8with open(r"tt.txt", "w", encoding="utf-8") as f: # 把一个字符串写入文件中 f.write("淦") f.write("fuck") # 把字符串列表写入文件中,不添加换行 f.writelines(["fuck ", "you ", "baby "]) f.writelines(["love\n", "and\n", "hate\n"])读原创 2021-11-03 22:58:01 · 134 阅读 · 0 评论 -
【稳住,can win】Python异常
异常定义异常处理代码示例异常定义程序中发生了不和预期的状况。异常处理异常处理就是程序出现问题时,仍然可以按照正确的顺序执行代码。和其他面向对象一样,Python也是使用类似于 try...catch的代码来处理异常。在Python中 try代码块包含可能发生异常的代码,except用来捕获异常,如果try代码块中发生异常,则程序立马跳转到except中执行代码,不管try代码块有没有执行玩。捕获异常时,可以多次捕获,捕获的异常范围从小到大,以便确定具体的异常。除了上述这种捕获方式外,Pyt.原创 2021-11-02 22:34:30 · 146 阅读 · 0 评论 -
【稳住,can win】Python 实现工厂模式和单例模式
工厂模式工厂模式用来实现调用者和创建者的分离。利用工厂类可以来实现对象的创建的管理。单例模式单例模式就是确保一个类只有一个对象,并且提供一个访问该对象的全局访问点。代码实现代码运行结果显示,StarFactory工厂类,可以根据传入的不同国家,创建出不同国家的对象。同时,两次创建工厂类,只创建出一个工厂类对象。...原创 2021-11-01 22:49:11 · 334 阅读 · 0 评论 -
【稳住,can win】Python的类对象
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-10-31 10:19:30 · 134 阅读 · 0 评论 -
【穩住,can win】Python的函數對象
函數對象全局變量和局部變量函數傳參函數對象如下運行結果所示,當我們定義一個函數時,就相當於創建了一個對象,這個對象叫函數對象,它有自己的ID。全局變量和局部變量當全局變量和局部變量重名時,要想在函數內部使用全局對象需要先聲明。後面的代碼對重名的變量進行操作時,使用的就都是全局變量。否則,在函數內使用的都是局部變量。函數傳參在Python中,所有賦值操作都是引用。也就是賦值號的左值是右值的別名。用可變對象進行傳參時,“寫操作”直接作用在原對象本身。對不可變對象,則會發生寫時拷貝。可.原创 2021-10-30 20:50:50 · 132 阅读 · 0 评论 -
【稳住,can carry】Python中的zip函数
定义使用定义zip() 函数就是将多个可迭代对象压缩成一个 zip 对象,可迭代对象包括列表、元组、字典、集合、字符串以及 range() 区间构成的列表。这里的压缩就是将传入 zip 的对象对应位置的元素重新组合,生成新的元组。使用...原创 2021-10-29 14:45:45 · 172 阅读 · 0 评论 -
【稳住,can carry】初识Python字典和集合
字典字典就是key-value键值对的集合。字典创建# 通过创建d = {}# 通过 dict() 创建d = dict(name="Schuyler",age=18)d = dict([("name","Schuyler"),("age",18)])# 通过 zip 创建k = ["name","age"]v = ["Schuyler",18]d = dict(zip(k,v))字典操作# 字典遍历p1 = {"name":"Jack", "age":38}p2原创 2021-10-28 15:59:16 · 167 阅读 · 0 评论 -
【戒焦戒躁,can win】Linux--inode
查看文件属性认识磁盘磁盘基本构成线性存储inode 和 data block 管理磁盘文件的创建磁盘文件的删除目录和 inode目录的创建软硬链接关于独立的理解问题产生提出解释查看文件属性文件属性(inode) 和 文件数据(data) 均在磁盘文件包含内容和属性,上面查看结果只列出了文件内容的大小,实际上,即使创建出一个空文件,空文件本身内容大小为0,但文件属性的大小也要占据一定的空间。文件属性信息也叫做元信息。inode 就是保存着这些信息,而文件内容保存在磁盘中(inode 也是存储在.原创 2021-10-28 15:04:52 · 740 阅读 · 0 评论 -
【戒焦戒躁,can win】Linux--IO缓冲区
fopen干了啥缓冲区缓冲策略父子进程与缓冲区的关联系统调用:文件重定向进一步理解:Linux 一切皆文件fopen干了啥书接上文,下面这些代码都是系统函数调用,不能即用C库函数,又用系统函数。举个例子。fopen 打开文件返回的是FILE*类型,不能直接将其传入到write。因为 write接收的文件描述符是int类型。事实上,FILE*类型内部封装了一个文件描述符,文件描述符就是文件描述符指针数组的下标,通过该文件描述符就可以找到对应文件,从而进行读写。更改数组的指向,就可以实现重定向。其中,.原创 2021-10-28 08:10:51 · 173 阅读 · 0 评论 -
【戒焦戒躁,can win】Linux--IO文件描述符
回忆 C 语言文件操作fopen当前工作目录fputsfgets由 C 文件操作引出的问题系统级别IO打开文件系统级别文件管理文件构成文件与进程关联write底层流水线read底层流水线文件描述符的分配规则文件重定向回忆 C 语言文件操作fopen# include <stdio.h>int main(){ // 第一个参数为文件名, 如果没有指定具体路径,就是在当前工作目录打开 // 第二个参数是指定打开文件方式, w表示写方式打开文件 FILE* fp fopen("wha.原创 2021-10-27 16:03:04 · 296 阅读 · 0 评论 -
【稳住,can carry】初识Python序列
序列的创建序列的操作zip操作序列的创建在Python中,变量名可以理解为一个指针,单独一个数字就可以理解为一个对象。所以Python中的序列的创建可以理解为:序列名指向序列,序列中的每个元素名又指向元素构成的对象。如下图所示。序列包括列表、元组、字典、字符串、集合。接下来以List为例,介绍序列的各种操作。序列的操作# 序列创建a = list() # 创建空序列,等同于 a = []# 添加元素a.append() # 类似数组尾插,推测list底层是用数组实现, 若是如此,那么应当.原创 2021-10-27 11:31:07 · 167 阅读 · 0 评论 -
【稳住,can carry】初识Python字符串
字符串创建字符串操作字符串的输入字符串的遍历字符串比较字符串创建在Python中字符串也是对象。如下所示,变量str指向一个字符串对象。str = "This is a sequence of characters"而这个字符串对象是不可变的。字符串操作字符串的输入str = input("please input ... whatever") # input函数中为提示符提示用户输入字符串的遍历for i in range(len(str)): print(str[i]) 若.原创 2021-10-26 21:03:56 · 171 阅读 · 0 评论 -
【稳住,can carry】初识Python对象
Python中的对象对象定义查看对象属性Python中的对象对象定义与笔者以往所学的C/C++不同,Python中无时无刻不在虚拟内存的堆区中产生对象。就以下面这行代码举个例子。a = 1 # 定义一个变量?从以往所学的无论是面向对象还是面向过程的经验,盲猜这条代码的意义是定义一个变量。实际上,这条代码的意思是,在堆上为1这个对象申请一块空间。然后,用就可以将a成是这个对象的别名。类似于下面的C++代码。int& a = new int(1);查看对象属性type() 可以查.原创 2021-10-25 19:49:36 · 173 阅读 · 0 评论 -
【C++ STL】之 vector
vector容器迭代器失效问题模拟实现vector创建vector增push_backinsert删pop_backerase完整代码迭代器失效问题在vector进行插入和删除操作时,可能会引发迭代器失效问题。看下面这一段代码,本意是想删除3,结果倒是30被删除了。这里我们就认为迭代器失效了,pos的意义变了,插入数据之后,pos不再指向3,而是30,导致后续删除时没有达到删除3的目的,反而删除的是30。解决方法:可以在插入之后,再find重新查找元素位置。vector<int> v =原创 2021-08-08 13:03:59 · 167 阅读 · 0 评论 -
Linux 从购买云服务器到 Hello World
Linux from zero to hello world环境安装为什么要购买云服务器登录云服务器操作系统定位LInux 基本指令lspwdcdmkdirrmdirrmmancpmvcatmoreless输入重定向输出重定向追加| 管道时间date日历calfindgrepfile打包zipunzip权限管理添加用户删除用户基础开发工具yum环境安装为什么要购买云服务器首先云服务器环境配置简单,可以提供多人使用,符合实际开发场景,可以作为我们学习环境进行仿真。其次重装方便,学习成本低。原创 2021-08-05 16:11:58 · 191 阅读 · 0 评论 -
C++模板类string那点事儿
C++模板类string那点事儿初识string常用string接口迭代器reserve和resize模拟实现string增删查改增尾插头插/中间插入删查改string相关算法初识stringstring是STL(Standard Template Library)标准模板库提供的一个容器,官方定义如下:可见string只是basic_string的一个模板类。常用string接口接口说明string(const string& str)拷贝构造函数stri原创 2021-07-25 10:42:31 · 417 阅读 · 0 评论 -
C++模板那些事儿
C++模板那些事儿初识模板为什么使用模板函数模板类模板初识模板C++有个概念叫泛型编程,即编写与类型无 ,关的通用代码。模板就是其实现基础。模板分为函数模板和类模板。模板不支持分离编译,也就是声明在.h文件中,定义在.cpp中。为什么使用模板模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构模板最重要的一点就是类型无关,提高了代码复用性模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换只要支持模板语法,模板的代码就是可移植的函数模板template <原创 2021-07-23 22:17:41 · 186 阅读 · 0 评论 -
C++内存分配
C++内存分配那点事儿虚拟内存分段堆栈对比new和delete构造和析构顺序new/delete和malloc/free虚拟内存分段一个程序要运行起来,必然要将数据载入内存。程序不同组成部分会存放到程序虚拟内存的不同区域。如下图所示。其中,栈主要用于函数调用开辟栈帧,栈是向下生长的,即栈帧空间的开辟是先从高地址开始,然后往低地址。堆则相反,向上生长。主要用于动态内存开辟。数据段,也叫做静态区,主要存放static变量和全局变量。代码段,也叫做常量区,主要存放程序编译出的指令。堆栈对比原创 2021-07-23 17:27:59 · 184 阅读 · 0 评论 -
详解C++类与对象(二)
详解C++类与对象(二)初始化列表静态成员友元初始化列表初始化成员列表使用如下,以日期类举例。class Date{public: Date(int year, int month, int day):_year(year),_month(month),_day(day) {}private: int _year; int _month; int _day; }初始化列表调用的时候发生在对象定义时,上述代码构造函数体为空,当然初始化列表也可以和和函数体内初始化混用。需要注意的是原创 2021-07-23 14:03:50 · 162 阅读 · 0 评论 -
手把手教你实现日期类入门C++
手撸日期类首先规定日期由年月日组成,因此日期类有三个成员变量,分别是_year,_month, _day。class Date{private: int _year; int _month; int _day;};在定义一个Date对象时,首先会自动调用构造函数用来初始化对象。需要注意的是,构造函数不写,编译器也会自动生成,但是自动生成的构造函数是不对基本类型成员变量进行初始化,而对于自定义类型的成员变量,会调用自定义类型的构造函数初始化。因此我们需要自己定义一个构造函数,初始化年月日。原创 2021-07-22 21:03:36 · 349 阅读 · 0 评论 -
详解C++类与对象(一)
初识类与对象C语言是面向过程的一门语言,从语法上分析,就是它的数据和函数是分离开的。C++是一门面向对象的语言,它允许程序定义一个类,同时这个类可以既包含数据也包含方法,如下代码所示,C++对C语言的struct进行了升级,使一个结构体内可以定义函数。C++兼容C语言的语法,除了可以用Stack st定义一个对象,还可以用struct Stack st定义。struct Stack{ void Init() { //do something } int data;};int main原创 2021-06-05 13:28:33 · 311 阅读 · 0 评论 -
15分钟快速入门C++拷贝构造函数
拷贝构造函数拷贝构造函数也是属于构造函数,用于初始化对象。与构造函数不同的是,拷贝构造函数的参数只有一个且必须是引用传参,因为使用传值方式会引发无穷递归。如下代码所示,若拷贝构造函数采用传值传参,用date1去初始化date2,会调用Date(Date d),当Date d = date1时,相当于Date d(d1),此时又会调用拷贝构造函数,如此循环导致无穷递归。Date(Date d){ _year = d._year; _month = d._month; _day = d._day;原创 2021-05-26 20:39:53 · 163 阅读 · 0 评论 -
15分钟快速入门C++内联函数、类和对象
内联函数以关键字inline修饰的函数叫内联函数,当内联函数被调用时,没有函数压栈的开销,函数编译生成的指令会在调用的地方展开。在C语言中,为了减少函数调用的开销,提供了宏函数。但是宏函数在预处理阶段已经展开,没法调试;其次,宏函数语法复杂,容易出错;最后宏函数没有类型安全检查。因此,在C++中推荐频繁调用的小函数,定义成inline,会在调用的地方展开,没有栈帧的开销。如果函数指令过多,那么在调用的时候展开指令,会造成编译出来的程序过大。这种情况编译器会忽略inline。类类是定义出一个新的类型原创 2021-05-24 20:36:34 · 182 阅读 · 0 评论 -
15分钟快速入门C++函数重载、extern “C“和引用
函数重载函数名相同,参数不同就叫做函数重载。这里的参数不同,指的是参数类型不同或者参数个数不同。然而C语言是不支持重载的,C++就可以。下面就分析一下原因。函数名修饰首先回顾下编译链接过程。有这3个文件,分别是f.h、f.cpp和main.cpp。在预处理阶段,会发生头文件展开,宏替换、去掉注释和条件编译。最终会生成f.i和main.i。编译阶段会进行语法检查,生成汇编代码,得到f.s和main.s。紧接着就把汇编代码转换成机器码,生成f.o和main.o。最终阶段是链接.o文件,生成可执行文件。/原创 2021-05-24 12:41:26 · 238 阅读 · 0 评论 -
两小时搞定C语言,搞不定来打我
C语言打怪练级攻略函数函数声明函数定义函数调用函数嵌套调用函数链式访问函数递归数组数组定义数组的创建一维数组的创建二维数组的创建数组的初始化一维数组的初始化二维数组的初始化数组的使用一维数组的使用二维数组的使用字符串字符函数字符串函数长度不受限长度受限字符串查找错误报告字符串长度字符串转数字字符串常见操作操作符移位操作符位操作符逻辑操作符表达式求值整型提升操作数类型转换操作符属性分支与循环分支语句循环语句指针野指针指针运算指针+/-整数指针-指针数组指针数组指针定义&数组名与数组名问题数组传参问题一原创 2021-04-02 14:50:57 · 465 阅读 · 0 评论 -
好家伙,文件是这样操作的
文件何其多在linux系统中,万物皆文件。举个例子,对一块设备进行操作,实际上就是对这块设备的设备文件进行读写操作。为此,还专门产生了一个叫文件系统的东西。C语言为我们提供了一系列文件的读写操作函数。文件的打开fopen函数打开文件的同时,返回FILE*文件指针,这个指针指向对应文件的文件信息区。所谓的文件信息区,也就是一个结构体,如下所示。通过文件指针,可以访问文件信息区(结构体)的各种成员变量。struct _iobuf { char *_ptr; int _cnt;原创 2021-03-18 18:42:42 · 181 阅读 · 0 评论 -
好家伙,你管着叫内存分配
好家伙,你管着叫内存分配欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M原创 2021-03-18 18:03:05 · 141 阅读 · 0 评论 -
好家伙,你管这玩意叫结构体
什么是结构体结构体貌似很简单,在C语言中结构体定义如下。结构体类型为struct Student,其中包含国两个成员,字符数组name和整形age。struct Student{ char name[16]; int age;};这时候,若要计算struct Student在内存中所占用的大小,这还不简单,16+4=20字节,就这?结构体内存存储...原创 2021-03-10 13:03:53 · 192 阅读 · 0 评论 -
C库函数的字符串操作
字符串的存储C语言是面向过程的一门语言,不像JAVA,C#等面向对象的编程语言那样有String这种变量类型,在C语言中字符串的存储是通过字符数组实现的。只要保证字符串是以空字符结尾的,任何一维字符数组都可以用来存储字符串。C库函数对字符串操作C语言为了弥补缺少字符串操作的运算,在<string.h>中提供了对字符串操作的函数。下面对其中的一些函数尝试进行模拟实现:char *strstr( const char *string, const char *strCharSet );原创 2021-02-06 18:11:30 · 248 阅读 · 0 评论 -
x86下整数与浮点数的存储
数据的大小端存储数据在内存中存储分为两种模式,大端模式下,高字节低地址,小端模式下低字节高地址。整数存储因为符号数在计算机存储的是补码,整数-2,的补码通过简单计算可以求得-2的绝对值为2,2的原码为0x00 00 00 02,最高位为符号位,正数为0,负数为1,将最高位改为1即-2的原码0x80 00 00 02再计算-2的反码,对原码符号位不动,其它位取反,得0xff ff ff fd将反码加1,得到补码0xff ff ff fe在VS中调试调出内存窗口,可以看到变量i在内存中是按低地原创 2021-02-02 21:39:20 · 543 阅读 · 0 评论 -
简易扫雷小游戏
游戏规则扫描出棋盘中的所有雷即胜利。在本程序中要依次选出棋盘不是雷的位置,若不是雷,则会显示当前位置周围一圈范围内雷的个数,若是雷,则游戏结束。程序设计本次程序实现的简易版的扫雷,和Windows上自带的扫雷有所区别。未实现标记雷的功能;当前程序扫描雷的算法过于笨重,只是逐个判断每个位置是否是雷,最终根据已经判断过的位置个数来决定是否胜利。程序整体流程与三子棋类似,下面分析一下整个程序结构。 int input; char mine[ROW_EXT][ROW_EXT] = { 0原创 2021-01-25 22:06:29 · 311 阅读 · 0 评论 -
简易三子棋小游戏
游戏规则若横、竖或对角线有己方3子即为获胜,有对方3子则为失败,棋盘占满并且己方和对方都无法做到3子连1线则为平局。程序设计程序流程图如下图所示,因为是和电脑下棋,本程序采用较为简单的随机数来决定电脑的落子,所以在程序的开始首先设定随机种子。然后询问用户是否进入游戏,不进入游戏就退出。用户若选择进入游戏。首先初始化棋盘,将棋盘上的落子点全用空格占满。然后玩家和电脑各走一步,判断一次,直到双方分出胜负,程序询问是否再来一盘。否则,双方继续落子。源码https://github.com/Tempe原创 2021-01-24 21:09:55 · 496 阅读 · 5 评论
分享