- 博客(97)
- 收藏
- 关注
原创 C++面试
1、静态函数和虚函数的区别?答:静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定,虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。2、用过static吗,能说下static吗?答:C/C++共有:1)修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。2)修饰局部变量时,表明该变量的值不会因为函数终止而丢失。3)修饰函数时,表明该函数只在同一文件中调用。C++独有:1)修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象
2021-11-04 16:49:49
372
原创 字符串分割(LeedCode)
题目描述:给定一个只包含小写字母的字符串,我们通过如下规则分割它:1.一个片段中包含的字符不允许出现在其他片段内。2.分割的片段数应尽可能的多。请实现一个函数,输出分割的片段。例如:输入aabbbacceddefgkifk 输出为 aabbba cc edde fgkifk具体实现如下:#include <iostream>#include <string>...
2019-09-22 20:01:50
474
3
原创 进程间的通信方式——共享内存
共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。1.共享内存共享内存是进程间通信中最简单的方式之一。共享内存允许两个或者多个进程访问同一块内存,就如同malloc()函数向不同进程返回了指向一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其他进程都会察觉到这个更改。共...
2019-09-21 18:58:16
1204
原创 TCP的粘包问题以及解决方法
TCP的黏包问题主要分为以下三种情况:第一种情况:如上图中的第一根bar所示,服务端一共读到两个数据包,每个数据包都是完成的,并没有发生粘包的问题,这种情况比较好处理,服务器只需要简单的从网络缓冲区去读就好了,每次服务端读取到的消息都是完成的,并不会出现数据不正确的情况。第二种情况:服务端仅收到一个数据包,这个数据包包含客户端发出的两条消息的完整信息,这个时候基于第一种情况的逻辑实现的服务端...
2019-09-19 10:14:37
1576
原创 排序算法
//// main.cpp// sort//// Created by hsl on 2019/8/18.// Copyright © 2019 hsl. All rights reserved.//#include <iostream>#include <vector>using namespace std;//堆排序//时间复杂度//最...
2019-08-19 12:04:27
138
原创 面试题一
1.C++的多态C++的多态分为静态多态和动态多态。静态多态:静态多态通过重载和模版技术实现,是在编译的时候确定的。动态多态:动态多态通过虚函数和继承的关系实现,执行动态绑定,在运行的时候确定。动态多态的几个必要条件:(1)虚函数,(2)一个基类的指针或引用指向派生类的对象。基类指针在调用成员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地址在每个对象的首地址。查找该虚函数...
2019-08-18 12:11:57
166
原创 三次握手和四次挥手
什么是三次握手?刚开始客户端处于Closed的状态,服务器处于listen状态。然后:第一次握手:客户端给服务器端发一个SYN报文,并指明客户端的初始化序列号ISN©,此时客户端处于SYN_send状态。第二次握手:服务器收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(S)。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户...
2019-07-23 18:13:49
115
原创 红黑树的性质以及模拟实现
1.红黑树的性质1)每个结点不是红色就是黑色2) 根节点是黑色的3) 如果一个节点是红色的,则它的两个孩子结点是黑色的4) 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点5) 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)全黑为最短路径2.红黑树的模拟实现#include <iostream>using namespac...
2019-07-14 16:33:36
127
原创 模拟实现搜索二叉树
模拟实现搜索二叉树# include <iostream>using namespace std;template <class T>struct BSTNode{ //左右子树构成空 BSTNode(const T& val = T()) :_data(val) , _pLeft(nullptr) , _pRight(nullptr) {}...
2019-05-26 22:21:31
173
原创 匿名管道和命名管道
匿名管道功能:创建一条无名管道原型:int pipe(int fd[2]);参数:fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端返回值:成功返回0,失败返回错误代码管道的读写规则当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为E...
2019-05-21 16:40:14
645
原创 智能指针的使用和模拟实现
1.智能指针的使用和模拟实现1.1RALLRALL:是一种利用对象生命周期来控制程序资源的简单技术在对象构造的时候获取资源,接着控制对资源的访问之在对象生命周期期间内始终保持有效,最后在对象析构的时候释放资源,这样做的好处有两个1.不需要显示的释放内存2.采用这种方式,对象所需的资源在生命周期内始终有效举个例子(抛出异常无法释放内存)template<class T>c...
2019-05-16 21:38:18
227
原创 题目:分行从上到下打印二叉树
题目:分行从上到下打印二叉树从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。思路:为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前层还没有打印的节点数;另一个变量表示下一层节点的数目。代码实现如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; Bi...
2019-05-13 14:31:42
188
原创 内存分配和管理
内存分配和管理malloc、calloc、realloc、alloca1.malloc:申请指定字节数的内存。申请到的内存中的初始值不确定。2.calloc: 为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存每一位(bit)都初始化为0。3.realloc:更改以前分配的内存长度(增加或减小),当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值不确...
2019-05-11 18:06:55
258
原创 什么是僵尸进程?僵尸进程的危害?怎样避免?
什么是僵尸进程(ZOMBIE)?当子进程(child process)先于父进程(parent process)退出,但是父进程没有调用wait/waitpid回收子进程的资源,则子进程变成僵尸进程。但是如果该进程的**父进程已经结束,那该进程就不会变成僵尸进程,**因为每个进程结束的时候,系统会扫描所有运行中的进程,看看有没有哪个进程是刚结束的进程的子进程,如果有就由Init来接管他,成为他...
2019-05-09 20:14:00
4176
原创 合并两个有序数组(LeetCode)
题目给定两个有序整数数组nums1 和 nums2,将nums2 合并到 nums1中,使得nums1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n ...
2019-05-03 21:02:35
224
原创 Linux下的进度条程序
在Linux环境下写一个会变颜色的进度条程序:Linux环境下有三种缓冲方式:1.无缓冲 2.行缓冲间 3.全缓冲 C语言中采用的是行缓冲。\r是回车回到行首,而不会到达下一行,如果继续输出,则会造成覆盖,所以进度条选择用\r输出。fflush(stdout)是清空缓冲,强制把结果输出到屏幕上。#include <stdio.h>#include <unistd.h&...
2019-05-03 14:10:36
207
原创 Linux权限管理
Linux下有两种用户:超级用户(root)、普通用户超级用户:在Linux上做任何事情普通用户:在Linux上做有限的事情超级用户的命令提示符是#,普通用户命令提示符是$Linux权限管理su切换用户任何一个文件具有的权限,针对不同的用户是不一样的,第一组 rwx表示的是文件的拥有者的权限第二组 rwx表示的是和文件拥有者同组的用户的权限第三组 rwx表示的是...
2019-04-26 12:45:33
108
原创 C++多态
一.什么是多态 按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。二.多态的定义与实现1.定义的构成条件1)调用函数的对象必须是指针或者引用。2)被调用的函数必须是虚函数,且完成了虚函数的重写。非多态看类型 多态看对象什么是虚函数?答:在类的...
2019-04-24 20:29:41
222
原创 Linux的基本操作指令
一. 目录操作命令1.列目录内容(ls)1)功能和用法ls(list)的功能是列指定目录的内容,并将输出按某种方式排序。若不指定目录,则默认为当前目录。 ls [options][files]参数说明ls的部分命令参数如下表:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls ...
2019-04-23 19:48:20
290
原创 C++继承
一.基本概念:1.一个类可以继承另一个类,继承的类称为派生类(子类)、被继承的类称之为基类(父类)。2.子类继承了父类所有成员,除了构造函数和赋值运算符重载。3.子类继承父类后,子类的成员分为两部分(1)继承之父类的部分base part(2)子类自己扩展的部分 appendent part4.子类继承父类后,子类依然不能访问父类的私有成员,子类只能通过继承之父类的公有成员来访问父类的私有...
2019-04-18 13:26:02
237
原创 二叉树的镜像(OJ)
题目:二叉树的镜像题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。示例:二叉树的镜像定义:源二叉树8/ 6 10/ \ / 5 7 9 11镜像二叉树8/ 10 6/ \ / 11 9 7 5思路:首先将二叉树的左右子树互换位置,并将每个结点的左右子树互换位置。swap(root->left,root->right...
2019-04-13 23:44:46
111
原创 二叉树的层平均值(OJ)
题目:二叉树的层平均值要求:给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例:输入:3/ 9 20/ 15 7输出: [3, 14.5, 11]解释:第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11]。思路:首先将二叉树每层的总和sum算出来,并将每层的结点个数size算出来,然后计算sum/size...
2019-04-13 23:37:23
222
原创 C++用队列实现栈(OJ)
题目:用队列实现栈题目描述:使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空测试用例:输入:[“MyStack”,“push”,“push”,“top”,“pop”,“empty”] [[],[1],[2],[],[],[]]输出:[null,null,null,2,2,...
2019-04-11 11:43:05
675
原创 C++优先队列(priority_queue)
优先队列介绍:1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。3.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持...
2019-04-11 10:43:28
284
原创 N叉树的层序遍历(OJ)
题目:N叉树的层序遍历题目描述:给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。例子:给定一个三叉树返回其层序遍历:[[1],[3,2,4],[5,6]]我的思路如下:用一个队列,并用一个标志性的字符将二叉树每一层的结点分开(比如nullptr),然后一层一层插入到vector中,如果遇到nullptr,则重新插入nullptr代码实现如下:/*...
2019-04-10 13:57:21
666
原创 用栈、递归实现二叉树的前序、中序、后序遍历(C++)
题目一:二叉树的前序遍历给定一个二叉树,返回它的前序遍历示例:输入: [1,null,2,3]12/3输出: [1,2,3]代码实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *r...
2019-04-06 12:48:52
2089
1
原创 OJ无重复字符的最长子串(C++实现)
题目:无重复字符的最长子串代码实现如下:class Solution {public: int lengthOfLongestSubstring(string s) { int maxlen = 0; string str(""); if(s.size() == 1){ return 1; } ...
2019-04-05 23:58:03
350
原创 OJ逆波兰表达式求值(C++实现)
题目:逆波兰表达式求值说明:1.整数除法只保留整数部分。2.给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。伪代码实现://中缀表达式:运算符在中间 eg:2+3-1//后缀表达式:运算符在操作数的尾部 eg:2 3+1-//1.操作数入栈//2.遇到操作符,从栈中取出操作符需要的操作数,取出的操作数的位置应该为//从右向左,进...
2019-04-05 21:56:12
753
原创 list与vector的对比
verctor底层结构:动态顺序表,一段连续空间随机访问:支持随机访问,访问某个元素效率O(1)插入和删除:任意位置插入和删除效率低,需要搬移元素,时间复杂 度为O(N),插入时有可能需要增容,增容:开辟新空 间,拷贝元素,释放旧空间,导致效率更低空间利用率:底层为连续空间,不容易造成内存碎片,空间利用率 高,缓存利用率高迭代器:原生态指针迭代器失效:在插入元素时,要给所有的迭代器重新...
2019-04-03 20:59:17
302
原创 list的模拟实现(C++)
#include <iostream>#include <assert.h>using namespace std;template <class T>//双向链表struct ListNode{ ListNode(const T& val = T()) :_next(nullptr) ,_prev(nullptr) ,_val(va...
2019-04-03 20:41:48
210
原创 前序后序遍历构建二叉树(OJ)
题目:根据前序遍历后序遍历构建二叉树。示例:输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]输出:[1,2,3,4,5,6,7]代码实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *lef...
2019-04-02 15:38:57
711
原创 两个字符串相乘
先附上一张算法图图片解释:123*456首先拿出1和456相乘,保存到数组1、 2、 3 的位置,然后拿出2和456相乘2 、 3 、 4的位置,依次类推,直到第一个字符串遍历完;然后将他们相加,依次存到数组中图解代码实现如下:int j = 0; int resIndex = 0; for (int i = 0; i<len1; ++i){ for (j = 0...
2019-03-28 20:37:52
1478
原创 实现两个字符串相加减(0-9)
实现两个数字(0-9)字符相加减,首先要申请一个大容量的字符串S,然后将两个字符串最后一位依次相加,如果小于9,直接保存到S中如果大于9,则减10保存,并进位1最后如果进位为1,则给S+‘1’,然后逆转实现代码如下: #include <iostream>#include <string>using namespace std;class Solution ...
2019-03-27 23:26:18
3699
原创 vector的使用方法
//vector<vector> arr(2, vector(5));//创建2行5列的二维数组,初值值为0//1. vector在C++标准模板库中的部分内容,它是一个多功能的,//能够操作多种数据结构和算法的模板类和函数库。//2. 编程语言方面:vector是C++标准模板库中的部分内容,//中文偶尔译作“容器”,但并不准确。它是一个多功能的,//能够操作多种数据结构和...
2019-03-26 16:58:02
1804
原创 string类的实现(C++)
#pragma once#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <assert.h>using namespace std;class String{public: typedef char* iterator; typedef const char* const_iterator...
2019-03-25 21:11:26
510
原创 String类的写法
String类的传统写法:#include <iostream>#include <assert.h>class String{ String(const char* str = ""){ if (nullptr == str){ assert(false); return; } _str = new char[strlen(str) + 1...
2019-03-24 20:33:03
984
原创 C++函数模板
1、函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。格式:template<typename T1, typename T2,…,typename Tn>template <typename T>void Swap(T& left,T& right){ T temp = left...
2019-03-19 20:10:47
91
原创 单例模式(C++实现)
1、单例模式单例模式:保证一个类只有一个对象实例,并提供一个访问该对象实例的全局访问点。单例模式有两种实现方法:懒汉模式和饿汉模式。2、饿汉模式就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。优点:简单。缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。在访问的线程比较多时,采用饿汉模式,可以实现更好的性能,这里是以空间换时间。饿汉模式线程是安全的,因...
2019-03-18 17:58:26
403
原创 C/C++的内存分布
1、C/C++的内存分布说明:(1)栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。(2)内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共 享内存,做进程间通信。(3)堆用于程序运行时动态内存分配,堆是可以上增长的。(4)数据段–存储全局数据和静态数据。(5)代码段–可执行的代码/只读常量。2、c++内存管理方式C中可...
2019-03-16 22:24:10
201
原创 数据结构-归并排序(C语言)
归并排序是一个对数据比较大的一种比较快的算法,采用的是分治算法。归并排序的原理1、先将数据分开排序,然后再将数据合并起来。采用一分二,二分四,四分八…的操作2、合并排序好的序列方法:两个序列中的数相互比较,将较小的数先插入新的序列中。合并方法的实现函数:void Merge(int array[], int left, int mid, int right, int *extra...
2019-03-14 22:38:06
926
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人