
C++学习系列
文章平均质量分 67
sequenceGO
dev
展开
-
C++ 中Traits技术 (4) —— 类型推导
继续理解traits技术。当我们处理原生指针时,会遇到需要知道其所指对象类型这样的问题。如何实现呢?template void testTypeForward(T t){ // write code here}C++中我们不允许使用typedef(*T)这样的语句。其中的一种解决方案是:将这个功能实现传递给另一个函数去完成。template void typeFo原创 2016-04-18 22:46:41 · 788 阅读 · 0 评论 -
旋转字符串的判断——KMP实现 (C++)
题目: 给定2个字符串srt1和str2,实现一个算法判断其是否互为旋转字符串。 注: 比如字符串"ABCDE" 那么"BCDEA" "CDEAB" "DEABC" "EABCD"都是其旋转字符串。思路: 这里我们判断str2是否是str1的旋转字符串。原创 2015-12-06 19:37:15 · 691 阅读 · 0 评论 -
求字符串的最长无重复字符子串(C++)
题目: 给定一个字符串str,返回str的最长无重复字符子串的长度。 如:"abcd" 返回4 "abcb" 返回3 要求:若字符串的长度为N 算法的时间复杂度为O(N)。思路: 下面给出的算法 时间复杂度为O(N) 空间复杂度为O(M) 其中 :原创 2015-12-06 22:20:37 · 6986 阅读 · 1 评论 -
二叉树的序列化和反序列化实现(C++)
题目:实现二叉树的序列化和反序列化的函数。思路: 二叉树的序列化 即给定二叉树的头指针,按照某种遍历方式将所有结点链接为一个数组或字符串(/指针)。 反序列化即根据给定的序列重新恢复一颗二叉树。 A. 这里给出的序列化按照二叉树的先序遍历方式将所有结点链接为字符串。 遇到空结点追加'#'原创 2015-12-05 14:39:49 · 3768 阅读 · 1 评论 -
复杂链表的复制(C++)
题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可以为NULL) )。要求实现一个算法返回一个链表,结构与输入的链表一致(完全的一份拷贝)。注: 链表结点结构如下: struct RandomListNode { i原创 2015-12-04 21:15:46 · 3483 阅读 · 0 评论 -
判断数组中是否有重复的数字(C++)
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。思路:这个题目解法很多,这里给出一种解法,充分利用了题目的已知信息。【每个数的范围是 0 - n-1 可能存在多个重复的数字】贴代码:bool duplicate(int numb原创 2015-12-02 21:55:18 · 9399 阅读 · 0 评论 -
删除排序链表中重复的结点(C++)
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,最后返回链表头指针。如:链表1->2->3->3->4->4->5 输出为 1->2->5思路:原创 2015-12-03 15:59:21 · 912 阅读 · 0 评论 -
数组中只出现一次的数(1)(C++)
题目:一个整型数组里除了1个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。思路:强调数字出现的次数,而且是偶数次。这时候可以考虑利用位运算的 "异或" 实现。2个相同的数异或=0 因此,将数组所有元素异或得到的结果即为只出现一次的那个数。贴代码:#include #include using namespace std;/原创 2015-12-01 16:49:32 · 1123 阅读 · 0 评论 -
数组中只出现一次的数(2)(C++)
题目:一个整型数组里除了2个数字之外,其他的数字都出现了两次。请写程序找出这2个只出现一次的数字。思路:和前一篇文章类似。利用位运算的 "异或" 实现。2个相同的数异或=0 但是这样遍历完数组所有元素之后,得到的是两个只出现一次的数异或的结果。要想分别得到这两个数,还需要进一步思考。按照上一篇文章的思路,我们需要分别将这两个数放在2个不同的子数组,每个数都按原创 2015-12-01 18:07:18 · 383 阅读 · 0 评论 -
【C++标准】之 C++11——auto特性
C++ 1C++98/03 : 修饰自动存储期的变量C++11 : 自动推导类型(并不意味着变量类型不确定 or 在运行时确定而是指变量类型在编译时可由编译器推导出来)原创 2015-12-24 20:03:09 · 486 阅读 · 0 评论 -
51nod 数塔取数问题 —— 动态规划
1002 数塔取数问题基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。 5 8 4 3 6 97 2原创 2015-12-09 20:26:55 · 2195 阅读 · 0 评论 -
C++ 中Traits技术 (2) —— 与迭代器
接着了解C++中的Traits技术。Traits技术可以获取一个类型的相关信息。比如针对一个泛型迭代器,类型参数T表示迭代器所指向的类型。template class CMyIterator{//...};我们使用这个迭代器时,如何才能知道这个迭代器所指向元素的类型呢?比如我们可以为这个类加入一个内嵌类型template class CMyIter原创 2016-04-13 23:57:16 · 525 阅读 · 0 评论 -
C++ 中Traits技术 (1) —— 初识
在C++泛型编程中接触到的这个概念。尽管C++的模板技术为泛型编程提供了支持,可以编写更加通用的代码。但是模板参数类型的不同,往往会带来一些问题。比如:C++中标准库类 string和wstring的实现。(模板实现时 参数中需要一个求字符串长度的函数,由于类型不一致,函数调用API不一致,导致了问题)typedef basic_string, allocator >原创 2016-04-13 23:39:44 · 821 阅读 · 0 评论 -
C++ 命名空间 namespace 知多少
A. 命名空间是什么 命名空间是一个作用域,为了防止命名冲突。不同命名空间内可以有相同名字的成员。在所有命名空间之外,有一个全局命名空间,以隐式方式声明,这个命名空间并没有名字。B. 命名空间的定义 // 如果名为NAME的命名空间不存在 下面的代码则创建一个新的名为NAME的命名空间 // 否则 打开现有的名为NAME的命名空间,向其中添加新的原创 2016-04-15 22:46:12 · 3197 阅读 · 0 评论 -
你说你会C++? —— 智能指针
智能指针的设计初衷是: C++中没有提供自动回收内存的机制,每次new对象之后都需要手动delete。稍不注意就memory leak。智能指针可以解决上面遇到的问题。C++中常见的智能指针包括(共七种): std::auto_ptr boost::scoped_ptr boost::shared_ptr boost:原创 2016-04-14 22:51:10 · 2003 阅读 · 0 评论 -
原生指针 泛型指针 智能指针 都是什么?
R.TA. 原生指针 就是最普通的指针,定义类似: 类型 *变量名; 与之对比的是使用上有类似指针的功能 实际并不是指针。比如:迭代器 [一个类重载 *和->操作符 那么可以像指针一样使用 但是这种并不是原生的]B. 泛型指针 第一种就是 void *指针 可以指向任意的数据结构 因此可以称为"泛型"。 第二种就是指具有指转载 2016-04-14 14:13:07 · 4290 阅读 · 0 评论 -
关于C++中 虚函数 多态 和 访问限定符的思考
2016-04-12 1、C++中的静态编译和动态编译分别基于什么机制实现?首先,静态编译和动态编译都属于C++中的多态,即“一种接口,多种实现”。静态编译(/联编) —— 也称为 静态多态 如:函数的重载和运算符的重载动态编译(/联编 ) ——也称为运行时多态 如:虚函数多态规则: 通过基类指针或引用调用成员函数时 如果函数是原创 2016-04-12 22:37:51 · 599 阅读 · 0 评论 -
面向对象编程的原则
面向对象的原则 —— 高内聚 低耦合(最终目的)单一职责原则(SRP Single Responsibility Principle)类的职责单一 对外只提供一种功能开放封闭原则(OCP Open Close Principle)类的改动是通过增加代码进行的 而不是修改源代码依赖倒置原则(DIP Dependence Inversion Principle)依赖抽象原创 2016-03-31 01:56:17 · 685 阅读 · 0 评论 -
链表指定值清除(C++)
题目: 有一个单链表。链表中每个节点保存一个整数,给定一个值val,把所有等于val的节点删掉。 给定一个单链表的头结点head,同时给定一个值val,返回清除后的链表的头结点,保证链表中有不等于该值的其它值。 同时保证其他元素的相对顺序。 如:原创 2015-12-09 22:41:26 · 1408 阅读 · 0 评论 -
翻转单词顺序列(C++)
题目:给定一个输入字符串,其中各个单词之间由空格分开,每个单词的字符是顺序的,但是单词之间的顺序是逆序的。实现一个翻转单词序列的算法。如: 输入:student. a am I 输出:I am a student.思路:从左往右遍历字符串,逐个拼接每个单词即可。 贴代码:#include #inc原创 2015-12-02 20:30:00 · 4072 阅读 · 0 评论 -
判断给定序列是否是对应入栈序列的出栈序列(C++)
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。(假设压入栈的所有数字均不相等)如 序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2不可能是该压栈序列的弹出序列。思路:使用一个辅助栈,依次将压栈序列的元素入栈,同时判断出栈序列的元素与栈顶元素是否相等。全部压栈原创 2015-12-01 13:45:40 · 2470 阅读 · 0 评论 -
【C++ vector拷贝的一些方法】
小记一下:一、初始化构造 vector v1(v2);二、swap赋值 vector v1(); v1.swap(v2); // v1 = v2三、assign赋值 v1.assign(v2.begin(), v2.end());四、使用迭代器循环语句赋值 (效率较差)转载 2016-01-02 19:58:01 · 18668 阅读 · 0 评论 -
PAT乙级——1009 数字黑洞 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。例如,我们从6767开始,将得到7766原创 2015-12-11 00:09:32 · 1265 阅读 · 1 评论 -
PAT乙级——1008 锤子剪刀布 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)题目描述大家应该都会玩“锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。输入描述:输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时原创 2015-12-11 00:05:39 · 662 阅读 · 0 评论 -
PAT乙级——1003 数素数 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述令Pi表示第i个素数。现任给两个正整数M 输入描述:输入在一行中给出M和N,其间以空格分隔。输出描述:输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。输入例子:5 27输出例子:11 13 17 19 23原创 2015-12-10 20:24:28 · 807 阅读 · 0 评论 -
PAT乙级——1010 月饼 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)题目描述月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存原创 2015-12-11 00:13:01 · 453 阅读 · 0 评论 -
PAT乙级——1007 A除以B (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。输入描述:输入在1行中依次给出A和B,中间以1空格分隔。输出描述:在1行中依次输出Q和R,中间以1空格分隔。输入例子:12345678905原创 2015-12-10 20:35:45 · 682 阅读 · 0 评论 -
PAT乙级——1004 福尔摩斯的约会 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很 快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写原创 2015-12-10 20:27:11 · 549 阅读 · 0 评论 -
PAT乙级——1002 数字分类 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;A3 = 被5除后余2的数字的个数;A4 = 被5除后余3的数字的平均数,精确到小数点后1位原创 2015-12-10 20:18:59 · 1135 阅读 · 3 评论 -
PAT乙级——1005 德才论 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入描述:输入第1行给出3个正原创 2015-12-10 20:30:41 · 729 阅读 · 0 评论 -
PAT乙级——1001 A+B和C (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。输入描述:输入第1行给出正整数T(输出描述:对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从原创 2015-12-10 20:13:19 · 669 阅读 · 0 评论 -
PAT乙级——1006 部分A+B (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA、B、DB,请编写程序计算PA + PB。输入描述:输入在一行中依次给出A、DA、B、DB,中间以空格原创 2015-12-10 20:33:29 · 597 阅读 · 0 评论 -
数组中出现次数超过一半的数字(C++)
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。如果不存在则输出0。如 数组{1,2,3,2,2,2,5,4,2}。数字2在数组中出现了5次,超过数组长度的一半,最终输出2。思路:目前只找到O(n)的解法。初始认为数组第一个数就是目标数(target)。之后遍历数组后面的元素,如果等于目标数,计数++; 否则计数--;如果发现目标数的计数原创 2015-12-01 15:37:30 · 2380 阅读 · 0 评论 -
从上往下打印二叉树BFS(C++)
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:很明显,这是一个BFS遍历问题。使用一个辅助队列即可。和很多二叉树问题一样,使用递归和非递归的方式实现。【注:递归方式将二叉树所有元素压入队列 非递归方式队列中只有一层的结点】贴代码:#include #include #include using namespace std;typ原创 2015-12-01 14:53:10 · 1370 阅读 · 0 评论 -
顺时针打印矩阵(C++版)
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。如:输入矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:对于这类题,可使用"转圈"的方法从外向内遍历矩阵。对于遍历到的每一圈,按照从左往右 从上往下 从右往左原创 2015-11-30 21:04:53 · 2956 阅读 · 0 评论 -
二叉树镜像(C++版)
题目:给定源二叉树,设计算法实现其镜像。思路:对于二叉树问题,需要思考除递归方法外的非递归实现。本题递归很好实现,对于遍历到的头结点,每次交换其左右子树即可。之后对其子树递归调用即可。对于非递归实现,需要使用一个辅助栈,用于保存头结点。(层序遍历)注:二叉树结点定义如下:typedef int dataType;struct原创 2015-11-30 21:28:33 · 2292 阅读 · 0 评论 -
合并两个排序的链表(C++版)
题目:已知两个单调递增的链表,要求实现算法合并两个链表,使得成后的链表满足单调不减规则。思路:本题很显然用递归方式很好实现,同时需要注意下算法的鲁棒性【对于空链表的判断】。当然本题还有非递归的版本实现,思想与递归大致一致。每次比较链表1和链表2结点的值,选择较小的结点作为下一个链接的结点。贴代码:注:链表结点的定义如下:struct ListNode {原创 2015-11-29 12:08:24 · 1440 阅读 · 0 评论 -
C++ 文件操作(不断更新ing)
因最近测试算法,算法主要是C++下的,但是希望使用matlab绘图。 因此考虑到将一些调试数据写入本地,让matlab读取数据绘图。 主要使用以下类:读取文件: istream写入文件: ostream原创 2015-12-14 13:51:22 · 699 阅读 · 0 评论 -
PAT乙级——1012 D进制的A+B (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述输入两个非负10进制整数A和B(30-1),输出A+B的D (1 输入描述:输入在一行中依次给出3个整数A、B和D。输出描述:输出A+B的D进制数。输入例子:123 456 8输出例子:1103 进制转换的问题一般采原创 2015-12-11 20:55:33 · 722 阅读 · 0 评论 -
PAT乙级——1011 个位数统计 (C/C++)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB题目描述给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0ik-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。输入描述:每个输入包含1个测试用例,即一个不超过1000位的正整数N。输原创 2015-12-11 20:43:37 · 1052 阅读 · 0 评论