C++ interview guide
wangicter
金融产品研发
展开
-
安全的“野指针”
诸位有没有见过安全的“野指针”呢?下面请看我的一段C++程序,灵感来自CSDN上的一次讨论。在此,我只需要C++的“类”,C++的其余一概不需要,因此我没有使用任何的C++标准库,连输出都是用printf完成的。 #include class CTestClass { public: CTestClass( void ); int m_nInteger; void F转载 2012-10-05 22:28:19 · 982 阅读 · 0 评论 -
从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”
内存分配方式有三种: 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建。 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 这个大小在linux上可以使用:ulimit -a | gre转载 2012-10-05 22:59:18 · 1169 阅读 · 0 评论 -
一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling
span style="font-size:18px;">我们从实验中去总结问题 测试一: virtual 函数和non-virtual函数 01.#include stdio.h> 02.class A 03.{ 04.public: 05. void function(){print转载 2012-10-05 23:01:43 · 1021 阅读 · 0 评论 -
面经
1. 判断两节点是否是祖先和后代的关系;思路一:生成父指针,从孩子节点向上寻找,o(n);要求继续优化,可以采用跳表的方式来实现,这里涉及了一个孩子节点和祖先节点的层数问题,例如,输入两节点的层数差,直接利用跳表就很容易到达。思路二:利用深度优先遍历的思想。2. 沿着地球表面走,先向南一公里,再向东一公里,再向北走一公里,回到原点,问地球表面有哪些满足这种情况的点?3. 一个n位数原创 2012-09-14 19:09:39 · 959 阅读 · 2 评论 -
ASCII与unicode的转换
不管什么时候,只要COM方法返回一个串,这个串都是Unicode串(这里指的是写入COM规范的所有方法)。Unicode是一种字符编码集,类似ASCII,但用两个字节表示一个字符。如果你想更好地控制或操作串的话,应该将它转换成TCHAR类型串。 TCHAR和以_t开头的函数(如_tcscpy())被设计用来让你用相同的源代码处理Unicode和ANSI串。在大多数情况下编写的代码都是用转载 2012-09-15 12:57:27 · 6649 阅读 · 0 评论 -
什么是堆什么是栈以及两者区别特点
什么是堆什么是栈以及两者区别特点一 英文名称堆和栈是C/C++编程中经常遇到的两个基本概念。先看一下它们的英文表示:堆――heap栈――stack二 从数据结构和系统两个层次理解在具体的C/C++编程框架中,这两个概念并不是并行的。深入到汇编级进行研究就会发现,栈是机器系统提供的数据结构,而堆是由C/C++函数库提供的。这两个概念可以从数据结构和系统两个转载 2012-10-01 23:18:35 · 8631 阅读 · 1 评论 -
(x&y)+((x^y)>>1)求(245, 112)结果是多少
(x&y)+((x^y)>>1)是用来求x和y的平均数的,即(x+y)/2.分析如下:(x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。其中,一类是x,y对应位都是1,用x&y计算其平均值;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;还有一另是x,y中对应位均为0,无须计算。原创 2012-02-29 22:47:11 · 2686 阅读 · 2 评论 -
求大数的阶乘方法(数组)
主要思想:由于大数阶乘结果通常非常大,用long long保存都不一定够,因此,大数阶乘不能直接去相乘。可以采用数组存储进位的方法来存储。例如,定义一个数组a[3],a[2] = 3,a[1] = 2,a[0] = 5,则表示这个数为325.当然,以上是采用10进制进行进位的。如果进位设置为1000,那么如果a[2] = 223,a[1] = 100,a[0] = 4,表示223,10原创 2012-05-02 17:24:11 · 5506 阅读 · 4 评论 -
求1000的阶乘结果尾部0的个数
该题目有多种方法来得到结果。方法一:直接求出结果并计算尾数0的个数该方法可以参考上一篇帖子(http://blog.csdn.net/yahohi/article/details/7528778),采用数组存储结果,然后计算尾数中0的个数。结果为249.方法二:计算可分解5的个数这种想法认为,1000! = 1000*999*...*1,而5*2= 10,故只要将所有的从1到100原创 2012-05-02 18:49:19 · 11076 阅读 · 2 评论 -
打印zigzag矩阵
/** * 描述:打印zigzag矩阵 * 0 1 5 6 14 15 27 28 * 2 4 7 13 16 26 29 42 * 3 8 12 17 25 30 41 43 * 9 11 18 24 31 40 44 53 * 10 19 23 32 39 45 52 54 * 20 2转载 2012-05-03 15:45:24 · 1873 阅读 · 3 评论 -
面试常考题目之atoi的实现
题目:编程实现atoi函数。分析:要实现string转int,直接每一次读入一个字符,然后减去'0',即可自动转换成int数值;如果有多位,则当前位乘以10,加上当前位的int数值。当然,这个题目不只是考察这个转换过程,溢出判断是另外一个重点。下面的代码是atoi.c的内容:/*------------------------------------------------原创 2012-05-07 11:31:59 · 3581 阅读 · 0 评论 -
百度实习笔试题(2012.5.6)
简答题1一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。简答题2线程和进程区别和联系。什么是“线程安全”简答题3C和C++怎样分配和释放内存,区别是什么算法题1一个url指向的页面里面有另一个url,最终有一个url指向之前出现过的url或空,这两种情形都定义为null。这样构成一个原创 2012-05-07 09:07:56 · 5131 阅读 · 12 评论 -
void指针的使用
void指针的理解和使用都是比较复杂的,尤其与其他形式定义结合时,就显得更为复杂了。下面就综合网上一些资料,介绍一下void的用法。1.void指针是一种特别的指针 void *vp //说它特别是因为它没有类型 //或者说这个类型不能判断出指向对象的长度2.任何指针都可以赋值给void指针 type *p; vp=p; //不需转换 //只获得原创 2012-05-09 22:32:09 · 8155 阅读 · 2 评论 -
C++面试宝典之STL向量容器
找出下面一段程序的错误:#include #include #include #include #include using namespace std;class CDemo{public:char * str;CDemo():str(NULL){};~CDemo(){ if(str) { static原创 2012-05-09 22:56:54 · 2747 阅读 · 1 评论 -
给定单链表,检测是否有环等系列考题
题一、 给定单链表,检测是否有环。 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。题二、 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。 如果head1==head2,那么显然相交转载 2012-05-11 21:46:01 · 2552 阅读 · 0 评论 -
蓄水池抽样
如何等概率的从N个元素中选取出K个元素?这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述: Init : a reservoir with the size: k for i= k+1 to N M=random(1转载 2012-06-18 19:32:39 · 680 阅读 · 0 评论 -
声明顺序
#include using namespace std;class Point2D{public: Point2D(int val) :y(val),x(y) { }private: int x; int y; public: void show() { cout << x << " " << y <<原创 2012-04-26 23:58:07 · 1347 阅读 · 0 评论 -
腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
题目:1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少?分析:设和为S,积为M。首先,A:我不知道。说明:S可以分解成多个组合,而2=1+1,3=1+2,40=20+20,39=19+20,只有一种分解方式,因此S应属于[4,38]集合。其次,B:我也不知道。说明:M也可以分原创 2012-04-12 11:33:36 · 19131 阅读 · 11 评论 -
请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
方法一:#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))若a>b,则a-b的二进制最高位为0,与上任何数还是0,所以大数为a;否则,a-b为负数,最高位为1,与上0x80000000(最高位为1其他为0)之后为1,所以此时最大数为b。方法二:#define max(a,b) ((((a)-(b))&(1方法三原创 2012-04-11 23:08:12 · 10865 阅读 · 1 评论 -
const的思考
1、什么是const 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:)2、为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。3、cons有什么主要的作用? (1)可以定义const常量,具有不可变性。 例如转载 2012-03-30 16:41:11 · 898 阅读 · 0 评论 -
明晰C++内存分配的五种方法的区别
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统转载 2012-03-30 21:48:15 · 1387 阅读 · 0 评论 -
x&(x-1)表达式的意义
求下面函数的返回值(微软) -- 统计1的个数-------------------------------------int func(int x){int countx = 0;while(x){countx++;x = x&(x-1);}return countx;} 假定x = 999910011100001111答案: 8原创 2012-02-15 21:16:55 · 683 阅读 · 0 评论 -
char* 和char[]的区别
以下内容均来自互联网,系笔者汇总并总结。1. 问题介绍问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码#include using namespace std;main(){ char *c1原创 2012-04-05 11:33:12 · 143178 阅读 · 11 评论 -
螺旋队列问题
下面是一个螺旋队列: 73 74 75 76 77 78 79 80 81 72 43 44 45 46 47 48 49 50 71 42 21 22 23 24 25 26 51 70 41 20 7 8 9原创 2012-04-09 17:15:01 · 892 阅读 · 0 评论 -
将C/C++代码中的注释删除
题目:将C/C++代码中的注释通过程序删除。分析:C/C++中的代码注释,包括如下形式://, /* */。当然,在""和''中的//, /* */是无效的,不应删除。因此,可以考虑针对/, *, ", '加标志flag1, flag2, flag3, flag4:1)遇到/时,读取下一个字符,如果是/时,则将当前行删除;如果是*,记录当前位置,找到*/,然后删除之间的字符原创 2012-04-09 16:03:35 · 6963 阅读 · 0 评论 -
一摞烙饼的问题
问题: 星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后原创 2012-04-11 10:33:56 · 1173 阅读 · 0 评论 -
一摞烙饼最上面一个的另一面为焦的概率
题目: 星期五的晚上,一帮微软技术员在希格玛附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:我以前在烙饼店打工,顾客经常端非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上 面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后来原创 2012-04-11 11:35:39 · 1422 阅读 · 1 评论 -
函数与函数指针
在学习C++的回调函数机制时有一个关于函数名和函数指针的疑惑,如是就自己研究了下二者的关系。 快速排序的原型: void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *)); 可见qsort接受一个类型为_USERENTRY的函数指针fc转载 2012-04-11 13:51:18 · 888 阅读 · 0 评论 -
常见面试题思想方法整理
最近一直在找工,博客都没怎么更新了,觉得也该总结和思考些东西了,于是便有了这篇文章。谈到面试题,其实它有很多种,有偏技术的(腾讯,淘宝问得多);有偏算法,逻辑和数学的(微软,谷歌,百度,阿里云等问得多)。我喜欢后者,最近也做了很多这方面的题目,围观了很多关注算法和面试题的博客,比如(july童鞋)。对于很多精妙的题目,常常在想这些出题的童鞋是怎么想到的,因为这些题目确实能够很深入的考察出一个面试者转载 2012-06-18 22:12:58 · 984 阅读 · 0 评论 -
插入排序和希尔排序
1. 插入排序插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 本节介绍两种插入排序方法:直接插入排序和希尔排序。直接插入排序基本思想1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:原创 2012-07-03 23:02:12 · 1192 阅读 · 0 评论 -
strcpy(d,s)的溢出问题
char s[]="123456789";char d[]="123";strcpy(d,s);printf("result: %s, \n%s",d,s);输出:分析如下:以上是gcc编译器输出结果。定义了s和d之后,d存在s之前,为:123\0123456789\0d原创 2012-07-07 15:48:20 · 10795 阅读 · 8 评论 -
给定一个N位数,得到一个N-k位的数中最小的数
题目:给定一个N位数,例如12345,从里面去掉k个数字,得到一个N-k位的数, 例如去掉2,4,得到135,去掉1,5,得到234。设计算法,求出所有得到的 N-k位数里面最小的那一个 解决方案一:(1)第一步要确定剩余N-K位的数的最高位:从个位开始算起,从第N-K位开始向高位比较,求出最小数字,作为高位。例如,3 1 1 2 3 3 1,K=3时,从7原创 2012-08-30 21:46:27 · 3877 阅读 · 0 评论 -
将多个集合合并成没有交集的集合
百度面试题:将多个集合合并成没有交集的集合2010-03-20 18:25给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。(1)请描述你解决这个问原创 2012-08-30 23:32:09 · 8479 阅读 · 3 评论 -
memcpy内存重叠的解决
内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。memmove函数对内存重叠做了处理。现在来看函数strcpy原型:extern char *strcpy(char *dest,ch转载 2012-08-31 09:40:41 · 14765 阅读 · 3 评论 -
【面经】葫芦面经
1、给定一个N位数,例如12345,从里面去掉k个数字,得到一个N-k位的数, 例如去掉2,4,得到135,去掉1,5,得到234。设计算法,求出所有得到的 N-k位数里面最小的那一个2、“找明星”,N个人中,只有一个明星:明星不认识其他所有的人,而其他人 都认识明星,这些人中也可能相互认识。你每次只可以问一个人是否认识另一 个人这样的问题,问最少问多少次可以找转载 2012-08-30 21:18:31 · 1593 阅读 · 3 评论 -
如何判断两个矩形相交
假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形 rect1{(minx1, miny1)(maxx1, maxy1)} rect2{(minx2, miny2)(maxx2, maxy2)} 相交的结果一定是个矩形,构成这个相交矩形rect{(minx, miny) (maxx, maxy)}的点对坐标是: minx转载 2012-08-30 22:54:34 · 5286 阅读 · 0 评论 -
gdb调试
一个调试示例源程序:tst.c代码:1 #include23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i7 {8 sum+=i;9 }10 return sum;11 }121314 main()15 {16 int i;17 long result = 0;18转载 2012-09-01 22:51:06 · 690 阅读 · 0 评论 -
GCC和G++详解
[介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解] -x l转载 2012-09-01 22:26:23 · 964 阅读 · 1 评论 -
从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法?
题目:从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法? 解决方案一:挡板问题——插空法假设当前在书架上已经放好14本书,那么只需要再把剩下五本书插入这些空中即可。14本书有15个可以插入的空,因此,总共方法有:C(15,5)。 解决放啊二:二进制转化成二进制方式,0表示选中国,1表示未选中。则题意转变成,要求00不能相邻。可以编程遍历来实现。原创 2012-09-03 16:15:47 · 1895 阅读 · 0 评论 -
随机概率发生器
题目:已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2解决方案:这是随机概率发生器的典型题目。由于需要产生1/2,而用1位0,或1位1无法产生等概率,因此,考虑将随机数扩展成2位:00 p*p01 p*(1-p)10 (1-p)*p11 (1-p)*(1-p)有上述分析知道,01和10原创 2012-08-24 09:52:49 · 6486 阅读 · 3 评论