
C++面试题
零下10度C_zjw
关注计算机互联网发展的点点滴滴
展开
-
函数不能传递动态内存
下面这道面试题是有关指针、动态内存分配的相关内容,感觉比较经典,记录下来大家共享。问题:What will happen after running the "Test"?#include using namespace std;void GetMemory(char* p, int num){ p = (char*)malloc(sizeof(char*)num);};原创 2017-03-20 11:51:34 · 2304 阅读 · 5 评论 -
排序数组中的相邻两数最大差值
给定一个数组A及其大小n,求其排序后的相邻两数的最大差值。(注:要求时间复杂度为O(n))思路:题目要求对排序后的数组进行操作,显然需要先对数组进行排序。如果没有要求时间复杂度,那么可以有很多种排序算法,如快速排序、堆排序、归并排序等等。但是这里要求时间复杂度为O(n),就不能用上述常规的排序算法了。那么桶排序可以吗?由于我们不知道最大数的位数,因此,如果最大数的位数很大的话,我们原创 2017-08-07 10:45:06 · 2786 阅读 · 1 评论 -
经典动态规划问题总结
动态规划引入首先我们以一个最基本的例子来分析——菲波那切数列。我们都知道,菲波那切数列的递推公式f(n) = f(n-1)+f(n-2) (这里我就说明一般情况,不列举边界条件了),很简单,如果我们用递归的方法来求解f(n),两三行代码就出来了。那么我们深入分析一下这样有什么问题?f(2) = f(1) + f(0);f(3) = f(2) + f(1);f(4) = f(原创 2017-08-16 17:25:37 · 731 阅读 · 0 评论 -
环形链表插值
在一个环形单链表中插入一个值为val的结点,使得插入后的链表仍然有序。分析:我们设置两个指针,分别指向链表中的某一个结点和下一个结点,如果val的值在其中间,则将对应结点插入这两个结点中间,如果val的值比所有的结点值都大,则插入在头结点的前面,如果val的值比所有的值都小,则也插入在头结点前面,不过返回值应该是这个新的结点。//链表结构struct LinkList{ int原创 2017-08-09 08:46:31 · 521 阅读 · 0 评论 -
最长无重复字符子串
给定一个字符串,求出其最长的无重复的字符子串的长度。例:给定字符串str = “abcdahisjgdb”,则其最长无重复子串为“bcdahisjg”,长度为9。思路:我们遍历字符串,计算以每一个字符开头的所有无重复子串的长度,最后比较这些长度,找出最大的一个。在每一次的循环中,我们用哈希表来统计有无重复的字符。本题比较简单,直接上代码。code:int l原创 2017-08-07 20:47:36 · 500 阅读 · 0 评论 -
字符串拼接最小字典
给定一个字符串数组,找到一种拼接顺序,使得所有小字符串拼接成的大字符串在所有可能的拼接中字典序最小。例如:给定strArr = {"bac", "bd"},n = 2。则有两种拼接顺序bacbd和bdbac,显然第一种拼接的字典序要小于第二种。我们是否可以这样认为:如果str1的字典序小于str2的字典序,那么str1一定就放在前面,也就是str1+str2的字典序一定小于str2原创 2017-08-07 16:40:13 · 940 阅读 · 0 评论 -
字符串的移位
给定一个字符串str及其长度len,将其前面n个字符移动到字符串的尾部,将后面的(len-n)个字符串移动到字符串的前面。要求:算法的额外空间复杂度为O(1)。例:str = “ABCEF”,len = 5, n = 3,则移位后的字符串str = “EFABC”。思路:如果对空间复杂度没有要求,则我们可以将字符串看做两部分,然后开辟两块空间来存储,然后将两个子串调换位置即可,但是原创 2017-08-07 16:11:44 · 1922 阅读 · 0 评论 -
从给定数组中找出最大的两个数——二分递归
分析1:对于给定数组找出其中最大的两个数,很容易想到的就是遍历数组。首先遍历整个数组,找出最大的一个元素并记录下该位置;然后分别遍历该位置之前的区间和该位置之后的区间,分别找出这两个子区间的最大值,然后比较这两个子区间的最大值,大者即为整个数组的次大元素。显然,整个过程中,用到了三次for循环,算法的时间复杂度是比较大的,对于规模较小的数组尚且可以,但是当问题的规模非常大时,这种遍历的方法就不可行原创 2017-05-19 09:19:36 · 5223 阅读 · 0 评论 -
牛课网--直通BAT面试算法精讲课--送优惠码啦
直通BAT面试算法精讲课专属优惠码:AqjvtPi。通过该优惠码报名,可立减10元! http://www.nowcoder.com/courses/1?coupon=AqjvtPi原创 2017-05-11 23:27:31 · 746 阅读 · 0 评论 -
字符串转换为数字
问题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“345”,则输出整数345。分析:可以一次扫描每一个字符,把之前得到的数字乘以10再加上当前字符表示的数字。需要考虑:1)输入的是否是空字符串; 2)是否有正负号; 3)字符串中是否有非数字的字符,如果有,则停止转换; 4)考虑移除问题;代码如下:int str2num(const原创 2017-05-11 22:15:55 · 524 阅读 · 0 评论 -
C++的运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运转载 2017-04-18 23:24:07 · 244 阅读 · 0 评论 -
字符串—空格替换
题目:请实现一个函数,把字符串中的每个空格图化成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。分析:有两种情形。一种是直接在原来的字符串上进行修改,从头到尾依次遍历每一个字符,当遇到空格时,我们就用“%20”去替换该空格,由于字符串长度的增加,每一次的替换,空格后的字符串都要向后移动,该做法的复杂度为O(n2);另一种是创建一个新的字符串,并原创 2017-04-12 15:14:01 · 557 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析:按照常规思路,我们对数组中的每一个数进行遍历,那么复杂度是比较大的,为O(n2)。显然,这种做法不仅效率低下,而且没有用到题目中给的数组递增的信息。那么怎么运用数组递增的信息呢?可以这样想:假如我们每次选取数组的右上角原创 2017-04-12 12:29:49 · 343 阅读 · 0 评论 -
字符串中单词的逆转
实现字符串中单词的逆转,即将单词出现的顺序进行逆转。如将"Today is Friday!"逆转为"Friday! is Today"。思路:不使用额外空间完成,可以分为两步。首先将字符串全部逆转,比如:"Today is Friday!"逆转为"!yadirF si yadoT",然后通过空格分割单词,单词自身进行逆转。代码如下://Reverse实现一个字符串的全部原创 2017-05-16 09:09:10 · 1176 阅读 · 0 评论