- 博客(42)
- 资源 (3)
- 收藏
- 关注
原创 对单链表的排序(LeetCode-148)
1、题目描述 给定一个单链表,对这个单链表进行排序,要求时间复杂度O(nlogn),空间复杂度O(1)。2、解题思路 由于排序的要求是时间复杂度为O(NlogN),因此只能选择快速排序、归并排序、堆排序。如果待排序的序列是数组保存,那么快排空间复杂度最坏为O(N),平均为O(logN),归并排序空间复杂度为O(N),堆排序的空间复杂度为O(1)。如果待排序的序列是链表保存,...
2019-04-27 11:47:05 5989 1
原创 二叉树两个节点的最小公共祖先节点(LeetCode-236)
1、题目描述 给定一棵二叉树和二叉树中的两个节点,找出这两个节点的公共祖先节点。例如: 给定两个节点p = 5, q = 4,那么p和q的最小的公共祖先节点为5。2、解题思路 可以分别使用两个数组来保存从根节点到给定的两个节点的路径值,然后再从路径中找出最后一个相...
2019-04-27 11:04:07 2059
原创 二叉树的最大路径和(LeetCode-124)
1、题目描述 输入一棵二叉树,求这课二叉树所有路径中最大的路径和。比如输入二叉树为:[-10,9,20,null,null,15,7],输出:42。 2、解题思路 我们知道,给定一个数组,求这个数组的连续子数组的最大和是比较容易的。而这道题目是将二叉树与连续子数组的最大和糅合在一起。因此我们需要在递归中求出二叉树路径的连续子数组的最大和。因此,在二叉树的递...
2019-04-20 20:44:39 1152
原创 数组中和为s的所有数字序列(LeetCode-39)
1、题目描述 输出一个数组和一个目标值,数组中不包含重复元素,找出数组中所有的元素序列,这些元素的和为目标值,元素序列可重复。比如说输入数组:[2,3,5],输入目标值:8,那么输出为:[ [2,2,2,2], [2,3,3], [3,5] ]2、解题思路 这个题目有点复杂,即使用暴力解也不一定马上想到思路。由于序列中的元素可以重复使用,给这道题目增加了难度。一种可行...
2019-04-20 13:46:25 2272
原创 二叉树中和为某一个值的路径(剑指offer-34)
1、题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2、解题思路 可以使用一个栈来保存二叉树的路径,使用先序遍历的方式遍历二叉树。当遍历到一个节点时,将这个节点压入栈中。接着判断这个节点是否是叶子节点,如果是,计算栈中所有节点的值是否为目标整数,接着返回父节点,将叶...
2019-04-18 19:58:49 206
原创 二叉搜索树和双向链表(剑指offer-36)
1、题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2、解题思路 一棵二叉搜索树,按照中序遍历为一个有序序列。我们可以按照中序遍历的思想,当我们遍历根节点时,先将左子树转换成一个有序链表,然后再将右子树转换成一个有序链表,接着用根节点将左子树和右子树串联起来。这是一个递归的过程,递归函数需要求出左子...
2019-04-18 19:48:26 175
原创 函数指针和函数对象比较
1、谓词 什么谓词,其实就是一个判断式,说白了就是一个返回bool值的函数或者仿函数。(这里说明了谓词可以有2种形式)几元就是函数有几个参数。(1)一元谓词函数举例如下:判断给出的string对象的长度是否小于6bool GT6(const string &s){return s.size() >= 6;}判断给出的int是否在3到8之间boo...
2019-04-17 11:48:42 1912 1
原创 C++中的四种强制类型转换
1、dynamic cast2、const_cast3、static_cast4、reinterpret_cast5、static_cast和reinterpret_cast的区别6、关于算术提升的一些坑1、dynamic cast dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其它类型的引用或指针。与dynamic_cast一起使用...
2019-04-16 22:52:02 498
原创 CGI介绍
1、什么是CGI2、CGI和Webserver的区别2、CGI的标准输入和标准输出3、CGI的环境变量4、CGI程序数据处理的一般工作流程5、CGI中From表单数据的分析和解码1、什么是CGI CGI即通用网关接口(Common Gateway Interface),是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交...
2019-04-16 21:01:01 2412
原创 Linux常用命令(四)
上一篇:Linux常用命令(三) grep、sed、awk是linux操作文本的三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。1、文本搜索工具grep(参考)(1)grep语法(2...
2019-04-16 11:47:22 400
原创 C/C++中容易造成缓冲区溢出的函数
1、strcpy():字符串复制2、strcat():字符串连接3、gets():从输入流读取字符串到缓冲区4、sprintf():打印字符串到缓冲区5、vsprintf():打印字符串到缓冲区6、scanf系列:从输入流读取格式化字符7、strdup():字符串复制1、strcpy():字符串复制原型:char *strcpy(char *dest, const ...
2019-04-15 22:24:00 8034
原创 STL容器之string、stack、queue、bitset
上一篇:STL容器之set、map、unordered_set、unordered_map1、字符串string2、栈stack3、队列queue4、bit集bitset1、字符串string=、assign() 赋予新值 swap() 交换两个string的内容 +=、append()、push_back() 添加字符。 str...
2019-04-14 19:35:51 556
原创 STL容器之set、map、unordered_set、unordered_map
上一篇:STL容器之vector、list1、有序集合set2、有序字典map3、无序集合unordered_set和无序字典unordered_map下一篇:STL容器之string、stack、queue、bitset1、有序集合set set通常是由平衡二叉树实现出来(通常用红黑树实现),在二叉树中,每个节点都有一个父节点和两个子节点,左子树的所有元素都比自己...
2019-04-14 19:31:35 622
原创 STL容器之vector、list
上一篇:STL容器简介1、动态数组vector2、双向链表list下一篇:STL容器之set、map、unordered_set、unordered_map1、动态数组vectorvector将其元素放在一个动态数组中管理,它允许随机访问,在vector尾部附加或者移除元素都很快,但是在vector中间或起始段安插元素比较费时,因为作用点之后的每个元素都必须移动到另一位置。 ...
2019-04-14 13:33:10 321
原创 整数序列中最长的连续序列个数(LeetCode-128)
1、题目描述 求一个整数序列中最长的连续子序列个数,比如输入:[100, 4, 200, 1, 3, 2],输出:42、解题思路(1)先排序,从有序序列中找连续子序列,时间复杂度为O(nlogn),代码如下: int longestConsecutive(vector<int>& nums) { if(nums.size()==0)...
2019-04-13 22:51:42 1259
原创 求无重复元素集合的所有子集(LeetCode-78)
1、题目描述 给定一个没有重复字符的字符串序列,求这个序列的所有子集。比如输入:123,输出为:1、2、3、12、13、23、123、NULL,总共有2^3 = 8个子集。2、解题思路 如果这个字符串长度为n,则使用一个n位的二进制来映射子集。首先初始化这个二进制数为0。接着遍历二进制的所有bit 位,对应为0,则这个子集不包含对应的元素,如果对应为1,则包含对应的元素,然...
2019-04-13 21:34:27 1882
原创 auto_ptr的两种实现方式
1、旧版auto_ptr的实现方式 最开始auto_ptr的成员变量主要有T* _ptr 和 bool _owner,主要实现原理是在构造对象时赋予其管理空间的所有权,在拷贝或赋值中转移空间的所有权,在析构函数中当_owner为true(拥有所有权)时来释放所有权。template <class T>class my_auto_ptr{private: T* _p...
2019-04-13 15:13:26 582
转载 判断一个数是不是素数
1、题目描述 一个数如果是素数,那么这个数只有两个约数,一个是1,另一个是其本身,如果一个数除了其本身和1之外还有其它约数,那么这个数就不是素数。2、解题思路(1)暴力破解 我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。bool isPrime(int n){ if (n <= 3) { ...
2019-04-12 15:24:47 3647
原创 字符串的最长回文子串
1、题目描述 给出一个字符串,找出一个字符串的最长回文子串,比如输入:babad,输出:bab或aba,输入:dbbd,输出::bb2、解题思路(1)暴力求解 找出该字符串的每个子串,时间复杂度为O(n^2),判断这个字符串是否为回文子串的时间复杂度为O(n),总的时间复杂度为O(n^3),C++代码如下:#include<iostream>#inc...
2019-04-12 11:51:06 437
原创 TCP的Nagle算法和粘包问题
1、糊涂窗口综合征(SWS)2、Nagle算法3、粘包问题1、糊涂窗口综合征(SWS)(1)什么是糊涂窗口综合症(Silly Window Syndrome) 当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小。极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP...
2019-04-09 23:04:30 2387 1
转载 红黑树的插入和删除
本文转载于:https://blog.csdn.net/v_JULY_v/article/details/61056301、红黑树介绍(1)二叉查找树 二叉查找树,也称有序二叉树(orderedbinarytree),或已排序二叉树(sortedbinarytree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点...
2019-04-09 10:43:31 693
转载 位图(Bitmap)的C++实现
本文转载于:https://blog.csdn.net/MBuger/article/details/616285721、位图(Bitmap)简介 位图是一种非常常见的结构,它使用每个二进制位来存放一个值的状态,正因为这个性质,它经常被用在数据压缩或者是索引等方面。 有这样一道题:给40亿个不重复的无符号整数,没有经过排序,然后再给一个树,如何快速判断这个数是否在40亿个数...
2019-04-08 20:32:45 2476
原创 海量数据处理的算法题目
题目1:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 解题思路:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每个url求取has(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a...
2019-04-08 20:22:07 299
原创 字典树及其C++实现
1、什么是Trie树(参考) Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。字典树3个基本性质:...
2019-04-08 16:56:56 5252
原创 设计模式——单例模式和工厂模式
本文转载于:https://www.jianshu.com/p/c579d9ba80be1、单例模式 确保某一个对象只有一个实例,而且自行实例化并向整个程序提供这个实例。单例模式为什么能保证只有一个实例存在,原因是在于它的构造函数是私有的,你不能去new它,该单例类里面已经实例化好了一个了,并且是static的,并提供一个获取该实例的方法。客户端只能通过该方法获取这个已经实例化好了...
2019-04-08 10:43:10 521
原创 C++继承与组合的区别
1、继承与组合2、继承和组合的使用场景3、继承和组合的区别4、继承和组合的优缺点(1)继承的优缺点(2)组合的优缺点1、继承与组合 C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一...
2019-04-08 10:11:17 3130 2
原创 C++ 智能指针
1、什么是智能指针2、智能指针的实现3、几种常见的智能指针(1)auto_ptr(2)unique_ptr(3)shared_ptr(4)weak_ptr1、什么是智能指针 几乎每一个有分量的程序都需要“在相同时间的多处地点处理或使用对象”的能力。为此,我们必须在程序的多个地点指向(refer to)同一对象。虽然C++语言提供引用(reference)和指...
2019-04-07 11:52:02 254
原创 C++中二进制、字符串、十六进制、十进制之间的转换
1、十进制和二进制相互转换2、字符串和二进制相互转换3、字符串和十进制相互转换4、十进制和十六进制相互转换5、二进制和十六进制1、十进制和二进制相互转换(1)十进制转二进制int a = 10;bitset<10> bit(a);cout << bit << endl;输出:0000001010(2)二进制转十进制...
2019-04-06 21:33:10 47714 6
原创 最少的硬币组合出1到m之间的任意值(贪婪算法)
1、题目描述 本题是2019腾讯实习生笔试编程题第一题,也是NOIP2016 模拟赛的原题。题目是这样的:有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,希望带尽量少的硬币,但是要能组合出 1 到 m 之间的任意值。2、解题思路 首先判断有无解,如果最小面额硬币大于1则无解,因为搭配不出1。如果有1则有解,因为所有面额都可以由1堆积出来。 接下来思考一个问题...
2019-04-06 16:32:59 1264
原创 硬币找零问题(动态规划)
1、题目表述 给定需要找零的面值money和可以使用的硬币种类(这里假设每种硬币的数量有无限多种),求出用这些硬币找零所需要的最小硬币数。比如money = 7,硬币种类为[1,2,5],那么需要找零1个面值2的硬币和1个5的硬币,总的硬币数为2个。2、解题思路 使用动态规划求解:我们用d(i)=j来表示凑够i元最少需要j个硬币。于是我们已经得到了d(0) = 0, 表示凑够...
2019-04-06 14:01:32 6314
转载 C++类对象的内存结构
本文全文转载于:https://blog.csdn.net/fenxinzi557/article/details/51995911(1) 无虚函数继承(2)有一个虚函数继承(3)全部虚函数都继承(4)多重继承(6)菱形继承(7)单一虚继承(8)菱形虚继承(最重要)结论: 在VS中查看类对象的内存布局的方法:右击源文件——>属性—...
2019-04-05 17:34:08 4675 1
原创 C++的继承与多态
1、继承的三种方式:public、private、protected2、继承中的构造函数和复制控制成员(1)派生类的构造函数(2)复制控制和继承3、虚函数和多态(1)virtual和虚函数(2)派生类到基类的转换(3)纯虚函数(4)虚函数可以是私有的吗?4、构造函数和析构函数和虚函数关系(1)构造函数可以为虚函数吗?(2...
2019-04-05 11:52:36 214
原创 链表中环的入口节点(剑指offer-23)
1、题目描述 给定一个带环的链表,找出链表中环的入口节点。2、解题思路(1)求出环中节点的总数 使用两个指针,一个快指针fast和一个慢指针slow,向前移动时,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针和慢指针相等时,它们两此一次在环中相遇。接着,按照以上策略继续向前移动,同时用两个计数器分别统计快指针fast和慢指针slow的前进步数,当两个指针再次相...
2019-04-04 22:16:21 124
原创 数组的逆序对(剑指offer-51)
1、题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数组组成一个逆序对。输入一个数组,求出这个数组的逆序对总数。比如输出数组:{7,5,6,4},那么一共存在5个逆序对,则输出为5。2、解题思路(1)暴力解法: 每扫描到一个数字,就比较该数字和后面数字的大小,如果后面的数字比它小,则组成一个逆序对。这种解法的时间复杂度为O(n^2)。代码如下:...
2019-04-04 20:50:40 138
原创 把数组排成最小的数(剑指offer-45)
1、题目表述 输入一个正整数数组,把数组里所有的数拼接为一个数,打印出能拼接出的所有数字中最小的一个。比如输入:{3,32,321},输出:321323.2、解题思路: 这道题其实是希望我们能找到一个排序规则,数组根据这个排序规则排列后能排成一个最小的数。要确定排序规则,就要比较两个数字,也就是给出两个数字m、n,我们需要确定一个规则判断m和n哪个应该排在前面,而不是仅仅比...
2019-04-03 22:43:53 177
原创 求字符串的全排列(剑指offer-38)
1、题目描述 输入一个字符串,输出这个字符串的所有排列组合。比如输入:abc,输出:abc acb bac bca cba cab。2、解题思路 我们可以把一个字符串看成由两部分组成,第一部分是它的第一个字符串,第二部分是后面的字符串。我们求整个字符串的排列可以看成两步。第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二部固定第一个字符,求后面...
2019-04-03 21:58:26 360
原创 cin输入不定长的字符串
正常情况下,cin遇到空格结束读取,写个小例子:int main(){ string a; cin>>a; cout<<a<<endl;}输入:hello world输出:hello 如何读取带空格的字符串呢,通常由三种方式如下:1、cin.get(array_name, Arsize):#i...
2019-04-02 22:27:15 2555
原创 内存泄露检查工具valgrind
本文全文转载于:https://blog.csdn.net/kesalin/article/details/2593958 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Va...
2019-04-02 17:42:41 391
原创 C语言中的字符串处理函数
1、strcpy():复制字符串2、strncpy():复制n个字符串3、strcat():连接字符串4、strncat():连接n个字符串5、strcmp():字符串比大小6、strlen():字符串长度7、strset():字符串重置9、memset():内存重置10、memcpy():内存复制(不安全)11、memmove():内存复制(安全)12、...
2019-04-02 17:15:38 3302
原创 Linux常用命令(三)
上一篇:Linux常用命令(二):1、查看系统信息2、磁盘管理工具(参考)(1)df:列出文件系统的整体磁盘使用量(2)du:检查磁盘空间使用量,与df命令不同的是,du命令是对文件和目录磁盘使用的空间的查看(3)fdisk:用于磁盘分区(4)mkfs:格式化(5)fsck:磁盘检查(6)mount:磁盘挂载(7)unmount:磁盘...
2019-04-02 11:24:19 301
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人