C/C++编程练习题
文章平均质量分 87
敲完代码好睡觉zzz
好好学习,天天向上。
展开
-
自我实现一个简洁版的String类——1
在C++中有C没有的string字符串类型,string类型的数据其实是一个指向字符串首地址的指针变量,因此在string类的默认成员函数拷贝构造和赋值运算符的重载就会涉及到深浅拷贝的问题,一不小心要么就是内存泄露要么就是多次释放同一块空间导致程序崩溃,下面就来模拟实现一个简洁版的String类: 既然是指向一个字符串的指针,因此类的成员变量就需要有一个char*类型的指针;#include原创 2017-10-20 20:40:49 · 355 阅读 · 0 评论 -
反转单链表——16
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 要反转一个单链表也就是使链表中的结点逆置,但并不是遍历链表每一次都将结点重新创建进行头插,这样就是重新创建一个单链表了而不是将原有的单链表逆置;因此,可以想到用多个指针来操控,既要防止找不到下一个结点的问题,也要解决逆置链表的链接问题;程序设计如下:#include #include using namespace s原创 2017-10-20 20:41:47 · 224 阅读 · 0 评论 -
合并两个排序的链表——17
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。 要合并两个递增的链表,首先找出两个链表的头结点中较小的一个就为合并后新链表的头结点,之后再依次将两个链表中的结点值进行相比较,依次将较小值在新链表中进行尾插,直到其中一个链表遍历完成,将剩余链表直接链在新链表的尾部就可以了,因为链表本来就是有序递增的;程序设计如下:#include #include using原创 2017-10-20 20:41:49 · 357 阅读 · 0 评论 -
顺时针打印矩阵——20
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,输入如下矩阵: 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。 其实顺时针的打印,无非就是先打印出矩阵最外面的第一行,然后原创 2017-10-20 20:41:58 · 4494 阅读 · 0 评论 -
包含min函数的栈——21
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push、及pop的时间复杂度都是O(1)。 首先,栈的特点是“先进后出,后进先出”,因此,对于pop和push两个操作自然都是直接放入栈顶和直接在栈顶删除元素,那么如果要找栈中的最小值min,因为要求时间复杂度为O(1),因此肯定不能遍历栈找出最小元素,这里可以想到使用在这个栈的数据结构中使用两个原创 2017-10-20 20:42:01 · 4451 阅读 · 0 评论 -
树的子结构——18
输入两棵二叉树A和B,判断B是不是A的子结构。如图:二叉树B就是二叉树A的一棵子树,而二叉树C不是二叉树A的子树。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/80/1D/wKioL1c4cpWi2XS9AAAT9JRAPdE913.png" title="二叉树.png" alt="wKioL1c4cpWi2XS9AAAT9J原创 2017-10-20 20:42:03 · 4465 阅读 · 0 评论 -
二叉树的镜像——19
完成一个函数,输入一个二叉树,该函数输出它的镜像。650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/80/35/wKiom1c7DRSj9efNAABKfkin-40769.png" title="镜像.png" alt="wKiom1c7DRSj9efNAABKfkin-40769.png" /> 镜像其实就是在转变成镜子当原创 2017-10-20 20:42:06 · 4305 阅读 · 0 评论 -
栈的压入、弹出序列——22
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈顺序,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 首先,可以在第一个序列也就是压栈顺序中找第二个序列中第一个元素,是4,因为第二个序列中第一个元素是第一个被弹出的,那么在压入顺序原创 2017-10-20 20:42:12 · 4422 阅读 · 0 评论 -
从上往下打印二叉树——23
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如如下二叉树打印出的结果为1、2、3、4、5、6、7、8、9。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/80/40/wKioL1c8J7SxEeWMAAAdonuXRV4682.png" title="二叉树.png" alt="wKioL1c8J7SxE原创 2017-10-20 20:42:22 · 4460 阅读 · 0 评论 -
二叉搜索树的后序遍历序列——24
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入数组的任意两个数组都互不相同。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/80/E9/wKiom1dESJeTyQIzAAAJnPK-y1I086.png" title="二叉搜索树.png" alt="wKiom原创 2017-10-20 20:42:25 · 4480 阅读 · 0 评论 -
二叉树中和为某一值的路径——25
输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/80/EF/wKiom1dFDnWQdxTiAAALYrM1qGA376.png" title="二叉树another.png" alt="wKiom1d原创 2017-10-20 20:42:28 · 4476 阅读 · 0 评论 -
复杂链表的复制——26
实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext的指针指向下一个结点外,还有一个m_pSibling的指针指向链表中任意结点或者NULL。如下如所示的一个复杂链表,没有画出_sib指针的结点表示_sib指向NULL:650) this.width=650;" src="http:/原创 2017-10-20 20:42:37 · 4318 阅读 · 0 评论 -
二叉搜索树与双向链表——27
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/82/0A/wKiom1dIRfrxQCSkAAAJnPK-y1I749.png" title="二叉搜索树.png" alt="wKiom1dIRfrxQCSkAAAJ原创 2017-10-20 20:42:43 · 4557 阅读 · 0 评论 -
链表中倒数第k个结点——15
输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6,这个链表的倒数第3个结点是值为4的结点。 因为链表是单链表,因此不可能先找到链表的最后一个结点,再倒回去数k个结点;因此有一种方法就是可以先将链表依次遍历一遍得到链表总结点个数n,然后链表中倒数第k个结点也就原创 2017-10-20 20:41:44 · 186 阅读 · 0 评论 -
打印1到最大的n位数——12
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3...一直到最大的3位数即999。 其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值。但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字原创 2017-10-20 20:41:35 · 257 阅读 · 0 评论 -
在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3
给定一个二维数组,数组的特点是:每一行从左到右数据大小依次递增,每一列数据从上到下依次递增,要求判断一个整数是否在这个二维数组中;设计二维数组如下:650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/7F/73/wKioL1cfMmLxgqRwAAAY1Yn6gfs969.png" title="arr[5][5].png" alt=原创 2017-10-20 20:40:52 · 597 阅读 · 0 评论 -
将一个字符串中的空格替换为指定的内容——4
实现一个函数,将一个字符串中的所有空格替换为"%20",例如输入字符串"How beautiful you are!",输出结果应为"How%20beautiful%20you%20are!"。 首先,如果另开辟一块空间并且足够将全部空格都替换成"%20",然后一个单词一个单词的拷贝过去,当遇到空格时就放进去"%20",这种低效率的方法肯定是可行的,但很显然不仅效率不高还浪费存储空间,因此,原创 2017-10-20 20:40:55 · 507 阅读 · 0 评论 -
输入一个链表的头结点,从尾到头反过来打印每个结点的值——5
一般这样的题,链表肯定不会是一个双向链表还带个循环什么的,也就是只给一个单链表的头结点,然后从尾到头输出每个结点的值; 如果从前往后去找最后一个结点,那找到了输出然后就没办法往返回往头部访问了,因为只是个单链表;因此可以想到,用递归来实现:#include using namespace std;template //将链表的结点定义为模板类,实现代码的复用性struc原创 2017-10-20 20:40:58 · 404 阅读 · 0 评论 -
用两个栈实现一个队列——7
用两个栈实现一个队列,并实现两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 栈的特点是“先进后出,后进先出”,而队列的特点是“先进先出,后进后出”,因此可以想到只用一个栈是无法完成的,所以会需要两个栈,先将输入的数据都依次放入一个栈stack1中,但是先进去的数据会被压在栈底,而栈底的数据是需要最先被取出的,可画图如下:650) t原创 2017-10-20 20:41:01 · 201 阅读 · 0 评论 -
用一棵二叉树的前序遍历结果和中序遍历结果还原这棵二叉树——6
输入某二叉树的前序遍历和中序遍历的结果,重建出这棵二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出这棵满足前序遍历和中序遍历的二叉树并输出它的头结点。 对一棵二叉树前序遍历的顺序是“根结点->左结点->右结点”,而中序遍历的顺序是“左结点->根节点->右结点”,因此原创 2017-10-20 20:41:03 · 826 阅读 · 0 评论 -
C++中的单例模式——2
有时候实现了一个类,但只需要创建出一个实例化的对象就能完成需求,如果有太多的对象不仅浪费内存空间也会使得代码数据不那么好维护,因此会需要设计出一个只能生成一个实例的类; 首先,要使得这个类只能实例化出一个对象,那么它的构造函数肯定不能够被外部随意调用,因此应该将类的构造函数的访问限定符设定为私有的,但是这样的话,如何获得唯一一个的实例化对象呢?可以设计一个成员函数,这个成员函数只能分配出唯一原创 2017-10-20 20:41:06 · 178 阅读 · 0 评论 -
输出一个为递增排序数组的旋转数组中的最小元素——8
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转,该数组的最小值为1。 当然了,将数组遍历一遍肯定能找出最小值,但其时间复杂度为O(N),效率是最低的,因此,应该有一种更高效的解决办法。 因为原数组是递增的,因此数组的第一个元素一原创 2017-10-20 20:41:12 · 288 阅读 · 0 评论 -
求斐波那契数列的第n项值——9
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下: 0 n = 0 F(n) = 1 n = 1 F(n-1)+F(n-2) n > 1也就是斐波那契数列为{0,1,1,2,3,5,8,13,21,......F(n-1)+F(n-2)}; 首先可以想到,原创 2017-10-20 20:41:15 · 1515 阅读 · 0 评论 -
一个数的二进制表示中1的个数——10
实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,将9表示成二进制为1001,有2位是1,因此如果输入数字9,该函数输出2。 如果让我们将一个十进制的数转换成二进制的表示,我们就会不停的模除模除2取它的余数,因此,就可以用这样的方法解决:#include using namespace std;size_t count_one_num(int n){ size_t cou原创 2017-10-20 20:41:18 · 455 阅读 · 0 评论 -
数值的整数次方——11
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 首先可以想到的是,如果exponent是个大于零的数,可用循环来进行相乘,而如果exponent是个复数,依然可以将base进行相乘,最后再取其倒数也就是用1去除以相乘结果。程序设计如下:#include #include usi原创 2017-10-20 20:41:27 · 241 阅读 · 0 评论 -
在O(1)时间删除链表结点——13
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了;可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了,至于结点,除去任意一个结点所占的空间都是OK的; 所以,这里换一种思路,若要删除指定的结点,一般需要将前一个结点原创 2017-10-20 20:41:29 · 217 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面——14
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 首先,可以想到,用前后两个指针一个在数组首一个在数组尾同时往数组中间遍历,当遇到前指针遇到偶数后指针遇到奇数时,就将两个数交换,直到两指针相遇或者前指针超过了后指针,这个有点类似快速排序的思想;程序设计如下:#include #include using namespace原创 2017-10-20 20:41:32 · 202 阅读 · 0 评论 -
字符串的排列——28
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 对于一个字符来说,只有一个排列就是其自身,那么对于多个字符的组合来说,也是有规律可循的:可以在字符串中选出一个字符来固定出头部,比如上述先用a来开头,那么后面的部分就由b、c来组成,之后再将b、c分别更换为头部,后面的就由剩下原创 2017-10-20 20:42:46 · 4497 阅读 · 0 评论