- 博客(68)
- 资源 (3)
- 收藏
- 关注
原创 队列和栈
案例五:有一个整形数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次想右边滑一个位置。返回一个长度为n-w+1的数组res,res[i[表示每一种窗口状态下的最大值。以数组为[4,3,5,4,3,3,6,7],w=3为例。因为第一个窗口为[4.3.5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5,。第四个窗口[4,3,3]的最大值为4,第五
2017-06-28 17:07:29 223
原创 队列和栈的基本性质和应用
栈和队列在实现结构上可以有数组和链表两种形式:数组实现比较容易;用链表结构比较复杂,因为有指针。栈结构的基本操作:pop 从栈顶弹出一个元素;top或peek 只访问栈顶元素,但是不弹出删除;push 向栈顶压入一个元素;size 返回当前栈中的元素个数;队列的基本操作:与站操作不同的是,push操作为在队头加入元素;而pop操作是
2017-06-28 13:43:04 6861 2
原创 字符串相关的高频面试题
1. 给定一个字符串str,将其中所有空格字符替换成“%20”,假设str后面有足够的空间。方法为遍历str,发现空格的数量为s,所以str在替换后 ,长度为 原来的长度+2*s。然后从下标为原来的长度+2*s-1的地方开始拷贝的过程,从后向前拷贝!!class Replacement {public: string replaceSpace(string iniSt
2017-06-27 16:12:06 261
原创 字符串相关的高频面试题
案例三:如果一个字符串str,把字符串str前面任意部分挪到后面去形成的字符串叫做str的旋转词。判断str1和str2是否互为旋转词。本题的最优解的时间复杂度为o(n),其中n是str1的长度。1. 判断str1与str2是否长度相等。如果长度不相等则一定刚不互为旋转词。2. 如果长度相等,生成str1+str1的大字符串;3. 用KMP算法判断大字符串中是否函数str2。如果有
2017-06-27 12:57:40 281
原创 字符串面试题
字符串面试题的特点:1. 广泛性字符串可以看做字符类型的数组,与数组排序,查找,调整有关。很多其他类型的面试题可以看做字符串类型的面试题。2.需要掌握的概念回文子串(连续)子序列(不连续)前缀树(Trie树)后缀树和后缀数组匹配字典序3. 需要掌握的操作与数组有关的操作:增删改查字符的替换字符串的旋转字符串题目的常见类
2017-06-26 17:40:59 944
原创 二叉树相关问题
二叉树按层遍历:1.针对二叉树的宽度优先遍历。2. 宽度优先遍历常使用队列结构。3. 还要打印出行号。思路:last表示正在打印的当前行的最右节点nlast表示下一行的最右节点如何更新nlast:nlast一直跟踪新加入的节点,因为新加入的节点一定是下一行的最右节点;二叉树的序列化和反序列化:将二叉树记录成文件的过程叫做二叉树的序列化,又
2017-06-24 21:36:20 252
原创 vector的用法
如果只是声明了一个vector对象,比如vector c;并不能直接对其用下面的方式赋值:c[0]=1;c[1]=2.......这样是不对的,必须要用push_back函数!!用cout进行输出的时候不能直接coutvector veco; // 空的vectorconst int size = 8;// size 为8 的vector// 每个元
2017-06-24 16:55:50 301
原创 排序算法相关的笔试面试高频题
1. 荷兰国旗问题。只包含0,1,2的整数数组进行排序,要求使用交换、原地排序,不是利用计数进行排序。原地排序就是指不申请多余的空间来进行的排序,就是在原来的排序数据中比较和交换的排序。例如堆排序等都是原地排序,合并排序(根据TAOCP,合并排序也有原地排序的版本),计数排序等不是原地排序。属于原地排序的是:希尔排序、冒泡排序、插入排序、选择排序、堆排序、快速排序。本题主要过程与快拍划分过
2017-06-24 11:46:25 488
原创 排序算法常见面试题
1. 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离不超过k,并且k相对于数组长度来说很小。请问选择什么方法对其排序比较好?时间复杂度为o(n)的排序算法:计数排序 基数排序但是由于并不知道需要排序的数据的范围,所以不能使用这两种方法。时间复杂度为o(n2)的排序算法:冒泡排序、选择排序这两个排序算法与数据原始序列无关,时间复杂度永远都是o(n2)
2017-06-23 16:01:09 1875
原创 动态分配二维数组以及new的用法
动态分配二维数组:http://blog.csdn.net/morewindows/article/details/7664479这篇博客的代码很有代表性,要弄懂,并且评论中也有很多值得探究的问题,需要认真思考!new的用法:http://blog.csdn.net/pengzhixi/article/details/4274984http://www.cnblogs.com/resoun
2017-06-22 19:23:54 2044
原创 基数排序
基数排序的方式可以采用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。LSD从低位开始排到高位,每排一位都是把各个桶合并,再按下一位排序;MSD从高位开始排到低位,排完一位后不合并桶,相同的高位划分子桶继续分配,最后再合并。LSD的基数排序适用于位数小的
2017-06-22 18:41:29 842
原创 排序算法的时间复杂度以及空间复杂度 计数排序
时间复杂度为o(n)的排序算法:不是基于比较的排序算法;思想来自于桶排序!比如:计数排序和基数排序。其中基数排序中是分别基于个位、十位以及等等更高的位将数据放入桶中,然后再将数据倒出来!八个经典排序算法的时间复杂度:O(n2)插入排序 选择排序 冒泡排序O(n*logn)堆排序 希尔排序 快速排序 归并排序八个经典排序算法的空间复杂度:O(1)插入排序 选择排序 冒泡
2017-06-22 11:22:41 2390
原创 手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1这篇文章对手摇算法以及归并排序有很详细的讲解!!手摇算法就是空间复杂度为O(1),仅仅是依靠交换操作来对字符串进行处理。利用手摇算法实现归并排序,主要需要三个变量:i指向右边待排序列将要插入的左边序列的位置;index指向右
2017-06-21 11:52:46 1109 2
原创 排序算法
冒泡排序:o(n2)0~n-1 两两比较,找出最大的,放在n-1位置;0~n-2 两两比较,找出第二大的,放在n-2位置;以此类推class BubbleSort {public: int* bubbleSort(int* A, int n) { // write code here int temp; in
2017-06-20 21:56:23 187
原创 关于typeid
typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。
2017-06-15 19:44:02 554
转载 C++宏定义详解
一、#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。1 #define命令剖析1
2017-06-15 19:09:52 187
原创 字符串
一、旋转词:将字符串str前面的任意部分挪到后面去形成的字符串叫做str的旋转词。给定两个字符串a和b,判断a和b是否互为旋转词。思路:最优解时间复杂度为o(n)1. 判断两个字符串str1 str2长度是否相等2. 长度相等,生成str1+str1的大字符串3. 用KMP算法判断大字符串中是否函数str2.原因; 如果str1长度为N,在str1
2017-06-15 19:09:09 255
原创 不同类型数据间的转换
c++中某些标准类型的数据之间可以自动转换,也就是隐式转换,由c++编译系统自动完成的,用户不需要干预!强制类型转换(显式类型转换):在程序中将一种类型数据明确转换成另一指定的类型!而对于用户自定义的类型,编译系统并不知道如何进行转换,因此需要自定义函数:转换构造函数和类型转换函数!类的几种构造函数:可以同时出现在同一类中(构造函数的重载):默认构造函数;用于初
2017-06-14 22:24:46 1885
原创 函数中的引用
对于上面的程序来说,两个程序的不同之处在于第一个程序中的disp函数的参数是Sample对象,而第二个程序中的disp的参数是Sample的引用;因此。对于第一个程序。调用disp的时候,是将实际参数对象s1赋值给形式参数对象s,所以要调用复制构造函数,因此会多输出一个B,同时形式参数s和实际参数s1两个是占用不同内存的两个对象;但是对于第二个程序来说,在调用disp函数的时候,是将实际参
2017-06-14 21:47:01 569
原创 内存中的堆区和栈区
对于上面的程序来说,当这个程序编译之后成为.obj文件,是放在只读区的;char s中的s是变量所以是存放在栈中,但是对于s的赋值“abc”是一个字符串常量,所以“abc\0”是存放在只读区的.静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。
2017-06-14 20:37:18 386
原创 范型编程
范型编程(generic programming,GP) :编写不依赖数据类型的程序,数据类型的参数化。#includefind(iarray,iarray+SIZE,50);find(intVector.begin(),intVector.end(),50);对于上面的find函数来说,它是algorithm库中的一个函数,其实它是一个算法的实现,它可以针对数组、向量等做查找操作
2017-06-14 12:13:43 328
原创 命名空间 extern的用法 static全局变量
std是标准库中的命名空间;关于extern的用法可以参考文献http://blog.163.com/sunjinxia%40126/blog/static/9498487920131214502107/,讲解的非常清晰这里有一个关于static全局变量的讲解http://www.360doc.com/content/16/0115/15/15947598_528164347.sh
2017-06-14 11:06:36 3753
原创 异常处理
异常处理针对的是运行错误:程序运行时出现的错误称为异常,对异常的处理-------------异常处理。异常处理指对运行时出现的差错以及其他例外情况的处理:没有异常处理程序时,运行出现异常,程序只能结束运行。c++中的异常处理机制:try{被检查语句;throw异常;}//这部分是异常引发catch(异常类型1){进行异常处理的语句1}catch
2017-06-14 09:52:32 453
原创 字符串流
字符串流也叫内存流,以内存中用户定义的字符数组(字符串)为输入输出的对象。输入输出缓冲区就是字符串流!!比如用cin读入的数据,一开始的时候是存储在输入缓冲区的,这个时候它是字符串流;当用变量对它进行提取的时候,就存储在内存中了,就是以二进制的形式保存了;最后用cout进行输出的时候也是先存放到输出缓冲区中,这时候也是字符串流。也就是字符串----------二进制----------
2017-06-13 20:46:27 1458
原创 文件的随机读写
文件的随机读写也就是说文件指针可以随意移动。文件的操作方式:顺序读写:文件指针只能从头移动到尾。随机读写:文件指针可以随意移动,根据需要。上面的两种文件读写方式不论是ASCII文件还是二进制文件都是可以的。文件指针:在磁盘文件操作中有一个文件指针,用来知名当前应进行读写的位置,没有具体变量。文件流提供一些有关文件指针的成员函数:例子:从键盘输入1
2017-06-13 19:05:05 13269
原创 二进制文件及其顺序读写
short int在内存中需要两个字节,而这两个字节就是它的二进制存储形式。比如short int x=12345;那么ASCII存储为:00110001 00110010 00110011 00110100 00110101二进制形式存储为:00110000 00111001,二进制存储用记事本打开看到的是90,因为第一个字节恰好为数字9的ASCII,第二个字符恰好为0的AS
2017-06-13 14:08:05 6801
原创 内存对齐 高位优先 从低地址到高地址
下面这篇文章对内存对齐进行了简单讲解,比较清晰http://www.jianshu.com/p/49ddb946a226http://www.cppblog.com/cc/archive/2006/08/01/10765.htmlhttp://blog.csdn.net/lgouc/article/details/8235471下面这篇文献http://blog.csd
2017-06-13 14:07:55 1191
原创 文本文件(ASCII)的读写
文本文件:字符以ASCII形式存储。1. 打开磁盘文件打开文件 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件,同时也指定文件的工作方式。文件流是内存中的,也就是为内存与磁盘中的文件建立联系。打开文件的两种不同方法:(1)调用文件流的成员函数open,比如:ofstream outfile;//定义输出文件流类对象outfile.open("f1.da
2017-06-12 21:00:12 13919
原创 文件与流
文件:存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的。文件分类:存储介质:磁盘文件 光盘文件 u盘文件用途:程序文件 数据文件(比如保存密码的文本文件)文件中数据的组织形式:ASCII文件:又叫文本文件,保存的是人能够识别的符号。以ASCII表示的我呢间,.txt,.cpp等二进制文件:用二进制形式表示的文件,可以是.o,.exe等程序文件,也
2017-06-12 18:41:52 203
原创 输入输出流对象
输入的方式有很多,但是最常用的方式是通过文件进行输入;同理,输出流通常也就输出到文件中进行保存。c++的输入与输出包括:1. 对系统指定的标准设备的输入-----------标准i/o:键盘与显示器2. 以外存磁盘文件为对象的输入和输出--------文件I/O:文件 。操作系统中将设备也当做文件,所以这个方式也可以对设备进行操作。3. 对内存中指定的空间进行的输入和输出-
2017-06-12 18:13:41 6258
转载 void类型及void指针
下面关于void的讲解转载自http://www.cnblogs.com/pengyingh/articles/2407267.html总的来说,就是void *可以指向任何类型的数据,它是“无类型指针”。对于void*来说,任何类型的指针都可以直接赋值给它,无需进行强制类型转换;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“
2017-06-12 15:06:41 437
原创 UML
UML(Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言,软件设计的全过程。UML包括UML语义和UML表示法两个部分:UML语义:UML对语义的描述使开发者能在语义上取得一致认识,消除了因人而异的表达方法所造成的影响。UML表示法:UML表示法定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语法为系统建模提供可
2017-06-11 20:17:28 173
原创 抽象类中可以有构造函数吗
抽象类中也是可以有构造函数的。虽然抽象类不能实例化,但是抽象类被继承之后,它的派生类可以实例化;而派生类在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象类的构造函数也是可以被调用的,所以抽象类中可以有构造函数。抽象类的析构函数最后是虚析构函数。比如上面的程序在执行的时候就会执行Animal的构造函数,所以最后的运行结果为:goujiao1s
2017-06-11 16:48:25 9792
原创 纯虚函数 和 抽象类
纯虚函数:虚函数,有时并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名。纯虚函数的作用:基类类型的指针,如果指向的是派生类的对象,那么它就可以访问这个函数,从而执行的是派生类中的函数。再设计类的层次结构中,有的基类成员函数并没有意义,具体功能依赖于派生类。纯虚函数是不能被调用的虚成员函数。纯虚函数的定义:virtual 函数类型 函数名(参数表列)
2017-06-11 15:46:20 1655
原创 虚析构函数
当派生类的对象从内存中撤销时:一般先调用派生类的析构函数然后再调用基类的析构函数问题的由来:Point*p=new Circle;delete p;对于上面的程序来说,Circle是继承于Point的,那么当delete p的时候执行的析构函数事实上只是调用了Point的构造函数;并没有调用Circle的析构函数;因此:如果用new运算符建立了派生类的对象,
2017-06-11 14:42:56 210
原创 重载和覆盖
重载:重载函数名,只要函数的参数表唯一就行:或者是参数的个数不同,或者是参数类型不同;和返回值无关。如果两个函数的参数表相同,但是返回类型不同,则第二个声明被视为第一个的错误重复声明,会被标记为编译错误。 重载和覆盖的区别1. 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。 覆盖要求函数名、参数列表、返回值必须相同。2.
2017-06-10 20:56:07 159
原创 虚函数
虚函数的使用方法:1. 在基类中使用virtual声明成员函数为虚函数 : 类内声明:virtual [类型]函数名([参数表列])2. 在类外定义虚函数时,不再加virtual3.效果派生类根据需要可以重新定义函数体(函数覆盖),使用虚函数提高了程序的可扩充性;成员函数被声明为虚函数后,其派生类中函数覆盖的同名函数自动定义为虚函数;若虚函数在派生类中未重新定
2017-06-10 20:07:57 373
原创 多态性(polymorphism)
polymophism多态:poly-多种morph-形态多态的表述:具有不同功能的函数可以用同一个函数名多态的效果:用一个函数名调用不同内容的函数,完成不同的工作。多态性形式:静态多态性:函数重载和运算符重载(实际就是函数的重载)实现的多态性属于静态多态性为什么是静态多态性:在生成目标代码之前,在编译的时候系统就能决定调用的是哪个函数,因此又称编译时的多态性。
2017-06-10 16:43:18 435
原创 const类型的成员函数
在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。const数据成员的初始化只能在类
2017-06-10 16:19:07 561
原创 MFC体系
MFC应用程序中的文件:.vcproj---------应用程序向导生成的VC++项目的主项目文件,包含生成该文件的Visual C++的版本平台、配置和项目功能等信息、.h -------------应用程序的主要头文件,包括其他项目特定的头文件,并声明应用程序类。.cpp应用程序类的主要应用程序源文件应用程序向导创建一个对话框类,该类定义应用程序主对话框的行为。(.cpp .h
2017-06-09 09:35:07 567
Geometry for Computer Graphics
2018-05-09
Polygon Mesh Processing
2018-05-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人