- 博客(102)
- 收藏
- 关注
原创 链表是否存在环
链表环的问题有两种,一种是判断是否存在环,另一种是在有的基础上返回入环的第一个节点。简单思路: 1、遍历链表,如果遇到空,那么肯定无环。 2、在遍历的过程中,每个节点都加入到哈希表中,加入前判断是否存在,如果存在的话那么就有环,而且第一个判断存在的节点就是入环的第一个节点。 总结:这个比较简单,既可以做到第一种问题,也可以做到第二种问题。但是用到了额外空间。下面说一下另一个思路,...
2018-07-04 16:49:57
338
转载 http协议
HTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于19...
2018-07-03 19:41:22
209
原创 并查集
作用: 合并两个集合,查询两个元素是否在同一个集合中。代表元:一个结合中的某个元素,此元素可以代表这个集合。大概实现: 把集合想象成一棵树,集合中的代表元是根节点,根节点的父亲是自身,根节点有孩子,孙子...,而且我们还有一个变量维护了当前树的节点个数,而且这个值只有根节点有权访问。形象原理: 之前学习的时候查看别人博客,觉得有一段解释非常形象,在这里借用一下。 (原博文地...
2018-07-03 12:12:41
319
原创 Trie
Trie树的三个基本性质,很简单,网上随便一篇博客都可以查出来,罗列如下: 1、根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3、每个节点的所有子节点包含的字符都不相同。 应用的场景就是查询字符串,字符串的前缀,词频统计等等。优点是查询的效率非常高,缺点是利...
2018-06-29 16:05:34
741
原创 排序
数据结构中最基础的排序,也是面试当中最常问的排序。本篇博客中阐述5中排序。冒泡排序,选择排序,插入排序,归并排序和快速排序。 冒泡排序: 未排序部分在前。排序部分在后,增长方向是从后向前。 外层循环确定未排序部分右边界,内层循环负责从未排序部分挑选出最终冒泡值放置到正确位置。func bubbleSort(src []int) { num := len(...
2018-06-27 13:38:54
127
原创 二叉堆
结构: 完全二叉树分类 大根堆:以任意节点作为根节点的树中的最大值就是根节点 小跟堆:以任意节点作为根节点的树中的最小值就是根节点基本操作 heapInsert:向上调整 heapIfy:向下调整 heapPop:删除并返回堆顶元素实现原理 因为是一颗完全二叉树,所以采用数组实现。如果一个节点位置索引为i,父节点为:(i-1) / 2,左孩子:2*i +1...
2018-06-27 10:37:39
163
原创 gdb-05篇
函数调用栈的查看 查看函数调用的顺序 backtrace 切换到栈编号为N的栈帧 frame N 查看当前函数调用的栈帧 info frameinfo的相关操作 查看当前寄存器的值 info registers 查看当前函数参数 info args 查看当前局部变量 info l...
2018-06-19 20:00:07
164
原创 gdb-04篇
查看任意内存区域中的数据 x /Nuf expression参数说明 N-需要打印的单元数 u-每个单元的大小 f-数据显示格式具体参数 u的详细参数 b,h,w,g分别代表单双四八字节 f的详细参数 t,o,d,u,x分别代表二进制,八进制,有符号,无符号十进制和十六进制 c,f分别代表字符和浮点数 ...
2018-06-19 19:51:56
175
原创 gdb-03篇
启动程序,运行程序,恢复程序 start,run,continue查看变量值,设置变量值 print varName,set var varName=value执行一行代码,连续执行n行代码 next,next n执行进入函数,强制从当前函数返回,运行至当前函数返回 step,return [value],finish执行到目标行,跳转到目标行 until lineN...
2018-06-15 16:01:33
153
原创 gdb-02篇
断点的类型 软件断点:是根据软件的非法指令异常实现的 硬件断点:数量有限,和硬件的特性相关 数据断点:本质上是硬件断点实现的硬件断点个数查询 show can-use-hw-watchpoints临时断点 断点只生效一次,一次使用过后,断点自动删除条件断点 满足设置情况的断点断点设置 根据函数名设置断点 break funcName [if ...
2018-06-15 15:50:07
361
原创 gdb-01篇
启动方式 直接启动 gdb gdb test.out gdb test.out core 动态链接 gdb test.out pid载入目标程序 file test.out链接到指定进程 attach pid //链接成功的一瞬间,进程停止执行,等价于动态链接设置命令行参数 set args arg1 ar...
2018-06-15 14:58:43
151
转载 unicode与utf-8
这篇文章是在知乎上看到的,这里作为转载方便自己查阅。 原作者: 邱昊宇 简单来说: Unicode 是「字符集」 UTF-8 是「编码规则」 其中: 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point) ...
2018-06-14 22:47:10
190
原创 进程环境-C程序存储空间布局
这里都是unix环境高级编程书上的,所以描述的是Linux C内存分布,Window下具体分布要自己试验或查阅其他博客。 虚拟内存是4GB,0-3GB是用户态,3-4GB是内核态。内核态是不允许用户访问的。 从低地址往高地址一次时代码段,初始化数据段,未初始化数据段,堆,不明确的(好多博客说法不一,我也没有试验过),栈以及命令行参数和环境变量。命令行参数和环境变量是在内...
2018-05-26 23:20:47
244
原创 进程环境-命令行参数
上一篇博客说了启动例程会获取命令行参数和环境变量,然后传递给main函数并调用。现在看一下main的命令行参数和环境表。 命令行参数: 因为ISO C和POSIX标准都要求argv[argc]是一个空指针,所以我们main中可以通过空指针判断结束遍历。 argc,就是我们平常说的命令行参数传递的个数。argv,就是命令参数作...
2018-05-25 13:06:03
527
原创 进程环境-C程序的启动和终止
360面试回来了,结果是好的,面上了。技术面让我在校多补补多进程和多线程,所以开始看Unix环境高级编程,所以这里的都是看书的一个大致总结,很多都是书上的内容。 一:main如何被调用 1.内核执行C程序 2.调用启动例程,从内核获取命令行参数和环境变量 3.调用main 其实main之前的操作时很复杂的,栈和BSS的初始化,库...
2018-05-25 12:29:16
799
原创 仅用递归和栈操作逆序一个栈
题目: 一个栈依次压入1,2,3,4,5,那么栈顶到栈底依次是5,4,3,2,1。逆序后,栈顶到栈底依次是1,2,3,4,5。只能使用递归函数思路 两个递归函数 1.getAndRemoveLastElement(); 功能:将栈底元素删除并返回 2.reverseStack(); 功能:获取栈底元素并删除,栈为空的时...
2018-05-19 17:36:59
839
原创 用一个栈排序另一个栈
题目: 一个栈中的元素都是整型,现在想将改栈从栈顶到栈底从大到小排列,只允许申请一个栈,除此之外可以申请新的变量,但不能申请额外的数据结构。思路: 两个栈,一个记为stackData,一个记为stackSort。一个整型变量cur stackData弹栈到cur,判断stackSort是否为空 如果为空,将cur压栈到stackSort。如果不为空判断c...
2018-05-18 09:31:42
634
原创 两个栈实现队列
题目: 编写一个类,用两个栈实现队列,支持进队列,出队列,获取队列头元素思路: 使用两个栈,因为栈的特性是后进先出,两个栈正好把顺序反过来(stackPush,stackPop)注意: 1. 如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中全部元素压入,并且删除 2. 如果stackPop不为空,stackP...
2018-05-17 17:23:04
148
原创 最小值栈
题目: 实现一个特殊的栈,可以提供返回最小值的操作。要求: 1. push,pop和getMin时间复杂度都是O(1) 2. 设计的栈可以使用现成的栈结构思路: 使用两个栈,一个做数据栈,一个做最值栈。第一种方法: 不重复的保存最值第二种方法: 重复的保存最值代码:#include <exception&g...
2018-05-17 15:57:55
268
原创 Longest Substring Without Repeating Character
Given a string, find the length of the longest substring without repeating characters.Examples:Given "abcabcbb", the answer is "abc", which the length is 3.Given "bbbbb", the answer is "b", with...
2018-04-12 22:02:14
179
原创 Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return i...
2018-04-12 19:52:05
384
原创 Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same ...
2018-04-12 19:12:52
150
原创 单链表的实现
继承的类:List类成员变量:class LinkList : public List{protected: struct Node : public Object { T value; Node* next; }; mutable struct : public Object { c
2017-12-08 20:14:01
262
原创 链式存储结构线性表
链式存储结构线性表顺序表的问题:1、顺序表的访问和修改的时间复杂度是常数级的,非常快。但是顺序表的插入和删除的缺不好,这两种操作的时间复杂读是O(N),看上去挺好,但是顺序表的插入和删除是通过大量数据的移动形成的。考虑最坏的情况,一个顺序表很长,在第一个位置插入元素,或者删除一个很长的顺序表的第一个元素,需要移动大量的元素,当元素的类型是复杂的类类型时,这种情况就更糟了。2、顺序表
2017-12-01 20:56:38
500
原创 数组类—DynamicArray
DynamicArray上一篇说到了数组类的一种具体对象,这篇里面来说另一种。就是DynamicArray,既然StaticArray已经够好了,为什么还要有DynamicArray呢。就如同前几片博客里讲的基于顺序存储结构的线性表的两种实现一样,我们想让这个对象可以动态的改变自己的存储空间的大小,这样就会更加灵活。设计要点:类模板在堆中申请一定的空间作为存储空间
2017-11-28 20:27:53
4933
原创 数组类—StaticArray
StaticArray上一节数组类的抽象类里我们在程序里构造的Array类里定义了成员的地址变量,有了可以返回数组的大小的方法,也通过下标合法性的检查避免了数组越界的问题,但是还有一个问题没有解决,就是数组之间可以赋值。在这篇博客里,我们新创建的一个类继承自Array类,然后去客服数组间不能互相赋值的问题。设计要点:类模板封装原生数组实现函数返回数组长度拷贝
2017-11-28 19:05:21
801
原创 数组类
数组类开发理由:原生的数组创建后没有大小的概念原生数组对越界访问只有警告,不易发现数组变量之间不能互相赋值设计要点:抽象类模板存储空间的位置和大小由子类完成提供数组长度的抽象函数[]操作符重载,判断下标是否合法同类型对象间的复制操作代码表现:template class Array : public Object{prot
2017-11-28 14:30:29
343
原创 顺序存储结构线性表—DynamicList
DynamicList在上一片博客里说到了一种基于顺序存储结构的实现,即StaticList,这一篇说另外一种DynamicList。这个类也要继承SeqList类,初始化父类的成员变量和重写capacity。StaticList和DynamicList都是继承自SeqList,大部分的实现都是一样的,那么不一样的就是DynamicList相比于StaticList来说,它的大小是可以
2017-11-27 23:41:37
447
原创 顺序存储结构线性表—StaticList
StaticList在顺序存储结构里说到了基于顺序存储结构的有两种具体的实现,一种就是StaticList。而且也说道了这个类要继承SeqList类,而且要初始化父类的成员变量和重写capacity,并且实现方法的具体操作。设计要点:类模板使用原生数组作为顺序存储空间使用模板参数决定数组的大小程序表现:template class Stati
2017-11-27 19:54:31
231
原创 线性表的顺序存储结构
线性表的顺序存储结构顺序存储定义:线性表的顺序存储结构,是指用一段连续的内存空间一次存储线性表中的数据元素设计思路:使用一位数组实现,直接申请一段大小固定的连续的内存空间程序表现:class SeqList : public List{protected: T* m_array; int m_length;public: bool inse
2017-11-27 17:52:00
338
原创 线性表
线性表抽象定义:具有相同类型的n(n>=0)个数据元素的有限序列。表现形式:1、数据元素类型相同2、零个或多个数据元素的集合,个数必须有限3、元素之间是有序排列的性质:1、第一项只有一个后继2、最后一项只有一个前驱3、除首尾项,其它每一项都有一个前驱和一个后继常用操作:1、元素插入2、元素删除3、获取指定位置的元素
2017-11-27 17:31:07
172
原创 C++——类型转换
c语言里的基础类型,char,short,int,uint,long.ulong,float,double,他们在表达式里是有隐式类型的转换,做运算时,默认转换为右值的最大类型,然后运算,得出结果后强转为左值的类型赋值给左值,期间char,short一定是先转换为int类型,而且基础类型里无符号大于有符号。C++里也满足这样的关系,但是现在有类了,类和基础数据类型怎么进行转换呢。如果基础数据类
2017-11-19 16:16:30
260
原创 C++——逻辑操作符的危险
C++的逻辑操作符我们在C语言里就一直用,从来没遇到过什么危险的事,因为一直是按照想法执行的。为什么会有危险。因为C++里操作符的重载。先来了解一下前提。1操作符的重载的本质是函数的调用。2逻辑操作符从做往右执行,满足短路规则,即不用计算完就可能得到结果。这里所说的逻辑操作符就是因为操作符的重载出现的。我们通过一个例子说明。class Test{ int mValue;
2017-11-18 19:03:27
303
原创 C++——智能指针
这里所说的都不是STL里的东西,只是简单的模仿一下。程序里一般我们将一些常用的,不是临时的对象放在堆上,堆的空间是比较大的。但是如果我们只是不停的动态申请但是忘记在不使用的时候归还就会造成内存泄露。有时候我们也会因为同一块内存空间被多个指针指向,在释放时造成多次释放的问题。为了避免这些,所以我们试着来创建一个特殊的指针。1在生命周期结束的时候直接释放掉堆里的内存空间2且这个指针指向的内
2017-11-17 19:36:18
301
原创 C++——函数对象
函数对象其实就是一个类的成员函数重载了()操作符,我们就可以使用varName(......)的方式调用一段函数。那么我们为什么需要用函数对象来调用函数呢?1函数对象可以根据不同的构造方法生成初始状态不同的函数。 2函数对象可以在类里面有自己的成员变量,这个成员变量可以记录当前函数的状态。3参数列表传入函数对象比指针更加安全。这里的状态的优势可以使用普通函数和局部的静态变量,但
2017-11-17 17:27:52
377
原创 C++——操作符重载
我们知道c++里的函数重载,那么操作符是不是也可以重载呢,?既然说出来肯定是有的。操作符重载有什么意义呢。比如我们定义一个复数类,让对象可以互相进行加减乘除。原生的加减乘除是不支持我们这么操作的,所以我们需要让这个操作符支持,让这个操作符实现重载,基础类型还是原生意思,我们说的复数类就用承载的操作符的操作。操作符的重载其实是一个函数实现的,本质也是去找到匹配的函数进行调用函数。成员函数和全局函
2017-11-15 22:58:26
236
原创 C++——静态成员
学习了一些累得基础知识,知道了,在类的作用域外要通过类去实例化对象,然后访问里面的成员。思考一下,如何去实现一个统计类对象个数的程序设计呢,最笨的办法我们可以在类里加一个方法,进行自加,然后初始化对象后就调用这个方法。这个可以实现一大部分需求。然后说这个的不足,如果我们没有对象,应该怎么去调用那个方法返回一个0值呢?还有如果我们的对象个数不为0,我们每次都需要手工调用,就如同我们当时想着自己初
2017-11-14 22:32:57
186
原创 C++——临时对象
class Test{ int t;public: Test() { Test(0); } Test(int rec) { t = rec; } int getVal();};int Test::getVal(){ return t;}这个程序,比较简单,说一下产生问题的
2017-11-13 17:31:09
264
原创 C++——析构函数
前面我们知道一个对象创建后,需要自动调用构造函数去进行初始化,避免我们操作时引出问题。那么今天有一个类似的问题,就是当一个对象不再需要时,它会占着一些操作系统的资源,比如一直占着内存,慢慢我们的内存就不足了,所以看的出来,当一个对象不再需要时我们需要释放这个对象占用的系统资源,比如释放内存,关闭文件和端口的使用权。我们可以在public的访问权限处添加一个一个free函数,去做一些处理上述问题
2017-11-13 14:13:04
230
原创 C++——对象构造顺序
程序里不可能只有一个对象,我们的程序里处处都是对象,那么对象的构造顺序是怎么样的呢。还是按照在内存四区上的分布来分开说,此处不在说代码段。如果对象是在栈上分配的,那么肯定是在函数中创建的,只要main函数开始执行,就有了程序执行流,所以分配在栈上的对象的构造顺序是按照顺序执行流和对象的定义语句来确定先后顺序的。如果对象在分配在堆上的,那么我们值需要跟着程序执行流找到new出现的先后顺序
2017-11-12 10:54:32
569
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅