- 博客(69)
- 收藏
- 关注
原创 Leetcode144:二叉树前序遍历,morris遍历法
今天做了二叉树的前序遍历,题目要求是用迭代来做不用递归,因为迭代的效率比递归要高而且这也是很多公司面试题的一个要求。第一遍解题用的是栈来模仿递归代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nul
2020-10-27 16:25:23
346
原创 C++vector模拟实现
这段代码依靠_start,_finish和_capicity三个指针来维护vector的线性空间#include<iostream>#include<assert.h>using namespace std;template<typename T>class Myvector{public: typedef T Vtype; typedef Vtype* iterator; typedef const Vtype* Constiterator;
2020-09-22 22:27:59
388
1
原创 LeetCode:判断回文链表(空间O(1))
请判断一个链表是否为回文链表。进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?示例 1:输入:1->2输出:false示例 2:输入:1->2->2->1输出:true思路: 这题要做到空间O(1),时间O(n)的话只能先将链表从中间断开,再将后半部分的链表翻转与前面一个链表作比较.方法:找到中间节点可以用快慢指针,翻转的话用三个指针去改变指向就行.注意:为了不改变原来链表的结构,在判断完之后要把链表
2020-09-16 11:34:25
287
原创 C++中文文档下载
百度云链接:https://pan.baidu.com/s/1rtBmNxiRwm7LQXc5rRTiDQ提取码:2lnx
2020-09-12 10:59:53
654
1
原创 利用unique_ptr写一个链表(理解智能指针的自动释放功能)
#include<iostream>#include<string>#include<memory>using namespace std;//独有指针版的链表,带头结点template<typename T>struct Node{public: T data; //利用独有指针定义指向下一个节点的指针 unique_ptr<Node<T>>next; ~Node() { cout <<
2020-09-12 10:14:21
884
原创 C++浅谈深浅拷贝的区别
浅拷贝和深拷贝的区别在于浅拷贝只是将对象的值复制给另外一个对象,如果这时候他们有一个在堆区开辟空间的变量,那么这个堆区地址也会共享深拷贝是在赋值时是给变量重新开辟一个新的内存空间,这时候,对象之间的地址不共享核心在于堆区空间的开辟。虽然这个知识点看着很简单,但是还是建议大家画一下图和写一下代码,毕竟学习就像逆水行舟,你不进步,那就只能退不。刚开始复习这个考点,有不对的地方还希望大佬们斧正。浅拷贝:深拷贝:实验代码:#include<iostream>using namespa
2020-09-10 09:19:21
172
原创 Linux基础:UDP通信讲解和实现案例
UDP网络通信:实现案例:https://blog.youkuaiyun.com/qq_43038236/article/details/108351271UDP是无连接的通信协议,准备好地址之后可以直接发送或接收数据。ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);功能:发送数据sockfd:发送者的socket描述符
2020-09-01 21:39:47
391
1
原创 Linux基础:UDP通信简单实现案例
效果图服务器端#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<arpa/inet.h>//服务端int main(int argc,const ch
2020-09-01 21:38:27
310
原创 Linux基础:IO复用select和expoll讲解
多路复用:select和expoll实现案例:https://blog.youkuaiyun.com/qq_43038236/article/details/108350851由于为了实现服务器的并发(同时服务多个客户端),需要为每个客户端创建一个进程来为它服务,但创建进程、销毁进程非常浪费时间与资源,这个问题有两种解决方案:1、多路复用:一个进程监控所有的客户端fd+服务端fd。2、多线程:为每个客户端创建一个线程进行服务。由于有些读写函数需要以阻塞状态调用,同时可能有多个文件描述需要同时读写,多路复用就是
2020-09-01 21:23:14
535
原创 Linux基础:select和expoll服务器简单实现案例
SELECT效果图#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<sys/select.h>//服务器int main(int argc,const
2020-09-01 21:17:22
359
原创 Linux网络编程:SOCKET通信讲解和案例
一、套接字SOCKET通信案例:https://blog.youkuaiyun.com/qq_43038236/article/details/108350394基本特点:socket是一种接口技术,被抽象成一个文件操作,可以让进程之间通信,也可以让不同计算机的进程通信(网络)。函数1、int socket(int domain, int type, int protocol);功能:创建套接字domain:AF_UNIX/AF_LOCAL 本地通信,进程间通信AF_INET 基于IPv4地址通信AF
2020-09-01 20:58:12
394
原创 Linux网络编程案例:SOCKET本地通信和网络通信
本地进程通信效果图:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/un.h>#include<sys/socket.h>#define Backlog 5//服务器int main(int argc,const char** argv)
2020-09-01 20:52:49
525
原创 Linux基础:进程讲解,fork()函数的使用
进程基本概念:1、进程与程序程序就是存储在磁盘上的可执行文件,程序被加载到内存中开始运行叫进程。一个程序可以被多次加载生成多个进程,进程就是处于活动状态的计算机程序。2、进程的分类进程一般分为三种类型:交互进程、批处理进程、守护进程。守护进程一般都处于活跃状态,运行在后台,由于系统在开机时通过启动脚本自动创建的。3、查看进程简单形式:ps 显示当前用户有控制终端的进程信息。列表形式:ps -auxw 显示进程详细信息 a 所有用户的有控制终端的进程 x 无终端
2020-08-25 21:01:52
402
1
原创 Linux基础:基本信号函数的使用signal等
基本概念1、中断当程序接收消息后中止当前正在执行的程序,转而执行其它任务,等其它任务执行完成后再返回,这种执行模式叫中断,分为硬件中断和软件中断。2、信号是一种软件中断,由操作系统发出,程序接收后会执行相应的操作。3、常见信号kill -l 显示所有信号SIGINT Ctrl+c 终止SIGQUIT Ctrl+\ 终止+coreSIGFPE 除0 终止+coreSIGSEGV 非常内存访问 终止+coreSIGKILL 终止信号 终止
2020-08-25 20:52:19
539
原创 Linux基础:文件与目录相关函数:sync,stat,truncate,closedir,readdir等
文件同步:1、在写入数据时内存与磁盘之间也有一个缓冲区,这种机制降低了磁盘读写次数,提高了读写的效率。2、但这种机制带来的后果就是磁盘中的数据与实写入的数据不匹配,系统提供了一个函数可以让缓冲区中的数据立即写入到磁盘。void sync(void);功能:把缓冲区中的数据同步到磁盘注意:并不等到数据同步完成后才返回,而是把缓冲区的数据加入到写入队列。int fsync(int fd);功能:把指定文件的内容从缓冲区同步到磁盘注意:会等到完全定稿磁盘才返回int fdatasync
2020-08-25 20:40:30
259
原创 Linux基础:模拟ls -l命令的实现(环境ubutun)
#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <time.h>#include <pwd.h>#include <grp.h>void file_type(mode_t mode
2020-08-25 20:21:07
193
原创 Linux基础:文件系统相关接口open,read,creat,write ,dup,dup2的使用
系统调用:系统调用就是操作系统提供的一些功能供程序员们调用,这些调用已经被封装成了C函数的形式,但是它们不是标准C的一部分。一般应用程序运行在用户态(使用的是0~3G的内存),系统调用工作在内存态(使用的是3~4G的内存)。常用的标准库函数大部分时间运行在用户态,底层偶尔也会调用系统调用进入内核态。系统调用的代码是内核的一部分,其外部接口以函数定义共享库中(linux-gate.so,ld-linux.so),这些接口的实现利用软中断进入内核态执行真正的系统调用。time a.out 测试
2020-08-25 20:18:27
676
原创 动态规划:分割整数(leetcode343)
题目:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。递归思路:先是从子问题去看,如果我们从1开始,求出1的最大解,然后用1的最大解求2的最大解,循环下去就能求出n的最大解。例如分解3,从1开始,因
2020-08-23 20:55:08
259
原创 Linux基础:内存管理
一、内存管理用户层 STL 自动分配/释放内存 调用C++ C++ new/delete 调用C C malloc/free 调用POSIX POSIX brk/sbrk 调用Linux Linux mmap/munmap 调用内核 系统层 kernal kmalloc/vmalloc 调用驱动 driver get_free_page 驱动获得空闲的页
2020-08-21 19:56:08
172
原创 Linux基础:静态库和共享库
库:概念: 库文件就是目标文件的集合,可以被其它代码调用,把代码封装成库文件后方便使用、方便管理、安全性高、保密性强。静态库就是目标文件的集合,调用静态库就是把静态库中的二进制指令拷贝到可执行文件中。优点:运行速度比共享库快。缺点:可执行文件相对较大,当静态库修改后,可执行文件要重新编译。共享库:就是没入口的可以执行文件,调用共享库就是记录共享中二进制指针的位置即可。当执行可执行文件时共享库会被一起加载到内存,可执行文件中可以跳转到共享库中执行。优点:可执行文件相对较小,当共享库修改后,可执行文
2020-08-21 19:53:02
217
原创 Linux基础:GNU编译工具
GNU编译工具:多样化支持各种编程语言,支持各种操作系统。gcc -v 查看版信息构建过程:预处理:gcc -E code.c -o code.i编译:gcc -S code.i -> code.s汇编:gcc -c code.s -> code.o链接:gcc a.o b.o c.o … a.out文件类型:.h 头文件.h.gch 头文件的编译结果,会被优先使用.i 预处理文件.c 源文件.s 汇编文件.o 目标文件.a 静态库文件.so 共享库文件编译参
2020-08-20 22:17:01
391
1
原创 leetcode快乐刷题:汉诺塔问题
class Solution {public: void hanot(int n,vector<int>&A,vector<int>&B,vector<int>&C) { if(1==n) { C.push_back(A.back()); A.pop_back(); return; } hanot(n-1,A,C,B); C.push_back(A.back(
2020-08-19 08:51:06
184
原创 C语言版树结构复习
树结构简介:在将树结构之前我们要清楚了解数据结构的物理结构和逻辑结构这两个概念点,物理结构和存储结构。物理结构表示的形式是数据项或者数据元素在内存中的存储的形式。它分为两种:顺序存储和链式存储。这两种的区别在于顺序存储需要的是在内存中一块连续的内存空间让他使用。例如0x00000001->0x000000010;这区间必须是连续不断的。链式存储相反与顺序存储,它的每一个数据项也叫节点的地址在内存中可以连续也可以分散,他的地址分布是不可控的。例如第一个节点的地址是0x00000001,那么第二个
2020-08-16 21:54:56
397
1
原创 有序二叉树的实现(C语言版)
#include<stdio.h>#include<stdlib.h>#include<stdbool.h>//有序树的节点结构体//包含:数据域是节点自己的值,指针域:保存左孩子与右孩子的地址typedef struct TreeNode{ int data; struct TreeNode *left; struct TreeNode *right;}TreeNode;//为一个新的树的节点分配空间和初始化,返回一个结构体指针TreeNod
2020-08-16 21:53:30
370
原创 根据层序遍历和中序遍历构建二叉树(C++递归版)
题目描述给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列输入描述:输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开输出描述:依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开示例1输入3 5 4 2 6 7 12 5 3 6 4 7 1输出2 6 13 5 2 4 6 7 12 5 6 1 7 4 3#include&l
2020-08-15 16:25:37
2496
原创 寻找下一个节点(中序遍历递归)
题目描述请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : v
2020-08-15 14:47:41
284
原创 输出单层节点(双队列)
题目描述对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(
2020-08-15 12:46:00
165
原创 二叉平衡树检查(思路清晰)
题目描述实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。思路总结:原本一开始我以为二叉平衡树作为有序树的进化版也要检查二叉树是否有序的,结果看了一眼别人写的发现都只判断左右子树的高度是否满足平衡就行了。后来才知道默认的都是有序的二叉树(0-0);/*struct TreeNode { int val; struct TreeNode *l
2020-08-14 20:19:34
178
原创 重建二叉树(递归版,思路和注释清晰)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod
2020-08-14 19:37:18
223
原创 LeetCode快乐刷题:计数二进制子串
题目:给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。示例 1 :输入: "00110011"输出: 6解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。示例 2 :输入: "1010
2020-08-10 21:55:13
170
原创 Leetcode快乐刷题:字符串相加
题目:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-strings著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处
2020-08-03 16:52:36
139
原创 Leetcode快乐刷题:快乐的数
题目编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1来源:力扣(LeetCode)
2020-08-03 11:28:45
140
原创 C/C++复习---函数:
对于函数的定义:函数是具有某一功能的一段代码,是C语言管理代码的单位,把代码分装成函数,技能方便C语言的调用,也能使代码更简洁.函数分类标准库函数系统函数第三方库函数自定义函数一、常用的标准库函数注意:C语言标准为委员会为C语言以函数形式提供的一些基础功能,被封装在libc.so库中,使用时需要包含头文件(stdlib.h),用 函数名(参数)即可以调用。 int isalnum(int c); 功能:当以是数字、字母字符返回真 return true
2020-08-03 09:43:29
129
原创 leetcode快乐刷题:两数之和
题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权
2020-08-01 16:52:08
103
1
原创 leetcode:旅行的终点
题目:给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。题目数据保证线路图会形成一条不存在循环的线路,因此只会有一个旅行终点站。示例 1:输入:paths = [[“London”,“New York”],[“New York”,“Lima”],[“Lima”,“Sao Paulo”]]输出:“S
2020-08-01 11:06:15
326
原创 leetcode:找出数据中的幸运数
方法一:数组法,数组作为下标计算出现的频率,之后遍历一次根据条件就能找到最大的幸运数class Solution {public: int findLucky(vector<int>& arr) { int max=-1; int num[1000]={-1}; for(int i=0;i<arr.size();i++) num[arr[i]]++; for(int j=0;j&l
2020-08-01 10:42:33
374
原创 华为机试之坐标移动
题目描述开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。输入:合法坐标为A(或者D或者W或者S) + 数字(两位以内)坐标之间以;分隔。非法坐标点需要进行丢弃。如AA10; A1A; %; YAD; 等。下面是一个简单的例子 如:A10;S20;W10;D30;X;A1A;B10A11;;A10;处理过程:起点(0,0)A10 = (-10,0
2020-07-31 20:14:36
276
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人