
c++面试宝典
经典C++算法、面试宝典
白话机器学习
10年IT从业经验,人工智能高级算法工程师、优快云博客专家、阿里云专家、《2023博客之星马龄赛道11-15年》第一名、《2023博客之星,城市赛道》长春TOP1,优快云付费资源项目实践专家
展开
-
两种洗牌算法比较
// 洗牌算法.cpp : Defines the entry point for the console application.////算法1原理:/*1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0.2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个原创 2013-07-04 16:37:51 · 897 阅读 · 0 评论 -
教你如何在海量数据中用算法处理面试题
原文:http://www.mianwww.com/html/2012/03/14933.html1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每转载 2013-06-20 17:03:41 · 740 阅读 · 1 评论 -
某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。
http://www.mianwww.com/html/2012/11/17432.htmlPS: 据说这是迅雷的一道面试题,不过问题本身具有很强的真实性,所以本文打算按照真实场景来考虑,而不局限于面试题的理想环境。存储结构首先,我们用一张用户积分表user_score来保存用户的积分信息。表结构:示例数据:下面的算法会基于这个基本的表结转载 2013-06-20 16:16:43 · 2342 阅读 · 0 评论 -
将链表中的节点顺序倒排序
利用三个额外的节点指针修改链表节点的指向详细参考Reverse函数// 倒排链表节点.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include using namespace std;typedef struct node{ int data; nod原创 2013-06-19 10:57:47 · 2769 阅读 · 0 评论 -
计算9999的二进制中含有多少个1
// 求数字的二进制含有多少个1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include int func(int num){int countx = 0;while (num){countx ++;num = num&(num-1);}return c原创 2013-06-19 11:18:00 · 3538 阅读 · 0 评论 -
MFC为何使用消息映射表而不用虚函数?
这个问题是windows开发面试中最经常问到得问题,也是很有深度的一个问题。有两个帖子对该问题讨论的比较深刻:http://topic.youkuaiyun.com/u/20090822/16/4cf5d189-0e5e-41ff-9ba3-c7eaf2f6da74.htmlhttp://topic.youkuaiyun.com/u/20090316/22/8b067591-6a17-4970-b224-41转载 2013-05-31 15:30:45 · 794 阅读 · 0 评论 -
快速找到未知长度单链表的中间节点。(腾讯)
题目:快速找到未知长度单链表的中间节点。既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为:O(L+L/2)=O(3L/2)。 能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:利用快慢指针!转载 2013-05-29 11:07:51 · 808 阅读 · 0 评论 -
写一个函数找出一个整数数组中,第二大的数 (microsoft)
答案:const int MINNUMBER = -32767 ;int find_sec_max( int data[] , int count){int maxnumber = data[0] ;int sec_max = MINNUMBER ;for ( int i = 1 ; i < count ; i++){if ( data[i] > maxnumber ){se原创 2013-05-28 11:23:53 · 777 阅读 · 0 评论 -
已知链表的头结点head,写一个函数把这个链表逆序
struct Node{int data ;Node *next ;};typedef struct Node Node ;Node * ReverseList(Node *head) //链表逆序{if ( head == NULL || head->next == NULL )return head;Node *p1 = head ;Node *p2 =原创 2013-05-28 11:22:14 · 2164 阅读 · 0 评论 -
简述数组与指针的区别?
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a[] = “hello”;a[0] = ‘X’;char *p = “world”; // 注意p 指向常量字符串p[0] = ‘X’; // 编译器不能发现该错误,运行时错误(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeo原创 2013-05-28 10:31:03 · 598 阅读 · 0 评论 -
c++ 空类大小不为0的原因
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的转载 2013-05-28 10:11:10 · 624 阅读 · 0 评论 -
给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。
void WipeOutRepeatStr(char* str){ char *p,*q; p=q=str; while(*q!='\0') { q++; cout<<*p; while(*p==*q) { q++; } p=q; }}原创 2013-06-20 16:56:10 · 2558 阅读 · 0 评论 -
程序员面试—5大算法
原文:http://www.mianwww.com/html/2012/04/15178.html其实解决复杂的算法问题时并没有什么良方高招,但是下面的介绍的5种方法还是有一定的实用性。下面的方法你练习的越多,就越能鉴别出用什么方法来解决问题。这5种方法并不是彼此独立的,也可能会交叉起来使用。比如同一个问题可能会用到“简化和一般化”和“套用常见方法”两种方法。法1:举例转载 2013-06-21 21:32:54 · 721 阅读 · 0 评论 -
寻找两个相交链表的第一个公共节点
// 寻找两个链表的第一个公共节点.cpp : Defines the entry point for the console application.///*1.最简单的方法就是先顺序访问其中一个链表,在每访问一个节点时,都对另外一个链表进行遍历,看节点是否相等 直到找到一个相等的节点位置,如果链表长度分别是m,n 则时间复杂度为O(mn)2.我们可以知道如果两个链表有公共节点,那么原创 2013-07-09 16:19:55 · 980 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符,要求时间复杂度O(n)
// 在一个字符串中找到第一个只出现一次的字符.cpp : Defines the entry point for the console application.////利用hash表,记录每一个字符出现的次数//char占8个位,字符的最大可能数是2^8=256#include "stdafx.h"#include using namespace std;const int Ta原创 2013-07-01 09:54:36 · 2334 阅读 · 0 评论 -
字符串的最长公共子序列问题
// 最长公共子序列问题.cpp : Defines the entry point for the console application.///*问题:给出两个字符串,找出它们的最长公共子序列什么是最长公共子序列?最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条原创 2013-06-28 14:57:42 · 1339 阅读 · 0 评论 -
二元查找树转有序双向链表
// 二元查找树转有序的双向链表.cpp : Defines the entry point for the console application.////题目:把二元查找树转变成排序的双向链表//要求:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。//要求不能创建任何新的结点,只调整指针的指向。/* 将下面这个二元查找树转化成 10 / \ 6原创 2013-06-27 10:20:11 · 1030 阅读 · 0 评论 -
设计一个不能被继承的类
原文:http://zhedahht.blog.163.com/blog/static/25411174200793181548842/题目:用C++设计一个不能被继承的类。分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。在Java中定义了关键字final,被final修饰的类不能被继承。但转载 2013-07-11 15:42:21 · 815 阅读 · 0 评论 -
求数组中只出现一次的数字
原文:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了转载 2013-07-11 15:12:41 · 787 阅读 · 0 评论 -
二元查找树转有序的双向链表
// 二元查找树转有序的双向链表.cpp : Defines the entry point for the console application.////题目:把二元查找树转变成排序的双向链表//要求:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。//要求不能创建任何新的结点,只调整指针的指向。/* 将下面这个二元查找树转化成 10 / \原创 2013-06-27 10:24:23 · 841 阅读 · 0 评论 -
给定链表的头指针和一个结点指针,在O(1)时间删除该结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDel转载 2013-07-11 14:42:28 · 971 阅读 · 0 评论 -
最大子序列求和问题
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。//方案1,穷举法,三层循环求出每种可能的组合的和,O(n3)int MaxSum1(int array[],int length){ int原创 2013-06-25 14:19:53 · 1218 阅读 · 0 评论 -
在已排序的数组中寻找和是给定值的两项,要求时间复杂度为O(n)
// 在已排序的数组中寻找和是给定值的两项.cpp : Defines the entry point for the console application.///*1.最简单的思路是固定数组中的一个数,然后寻找其余n-1个数看是否有满足条件的,时间复杂度是O(n^2)2.另一种思路:我们从数组的两端开始,如果和大于给定的值,则尾端的数后前移动一步,如果和小于给定值则首端的数向前移动原创 2013-07-09 16:49:07 · 967 阅读 · 0 评论 -
有n个台阶,如果一次只能上1个或2个台阶,求一共有多少种上法
// n级台阶,求多少种跳法.cpp : Defines the entry point for the console application.///*思路:如果只有一级台阶,n=1,很明显只有一种跳法如果有两级台阶,n=2,则有两种跳法,一种是跳两下1级,一种是直接跳两级那么我们来看看如果有n层台阶,可以怎么跳:n层台阶可以是这么够成的1.第n层台阶是从第n-1层跳1级上来的原创 2013-07-09 19:48:15 · 11903 阅读 · 3 评论 -
C++是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。原创 2013-05-28 10:04:10 · 891 阅读 · 0 评论 -
ADO与ADO.net的相同与不同?
除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于COM 体系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.ne原创 2013-05-28 09:56:39 · 539 阅读 · 0 评论 -
重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?
常考的题目。从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer)原创 2013-05-28 09:53:07 · 1398 阅读 · 0 评论 -
面向对象的三个基本特征,并简单叙述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复原创 2013-05-28 09:50:49 · 816 阅读 · 0 评论 -
MFC程序编译时VS2008提示无法打开包含文件<afxcontrolbars.h>
这个头文件包含在“stdafx.h”中造成这个问题的主要原因是这个工程原来可能是在打了SP1补丁的VS2008下创建的,SP1是微软08年发布的一个补丁,用于改善VS的一些特性。可能是SP1后加入了这个头文件,用于提供对功能区和控制条的MFC支持#include // MFC support for ribbons and control bars一种解决方法就是安装SP1以原创 2013-05-06 10:13:16 · 2153 阅读 · 0 评论 -
this指针
this指针是在实例化一个对象后产生的,并且指向对象本身。比如实例化一个对象pt,那么this=&pt;类的this指针有以下特点:(1)this只能在成员函数中使用全局函数,静态函数都不能使用this。实际上,成员函数默认第一个隐涵参数就是this,即T* const this。例如一个类class A{ public:int func(int p){}}原创 2013-04-16 19:14:59 · 570 阅读 · 0 评论 -
指针和引用
指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因转载 2013-04-16 17:35:25 · 424 阅读 · 0 评论 -
如何将a,b的值进行交换,并且不使用任何中间变量
解析:简而言之,用异或语句比较容易,而且不用担心越界的问题。如果采用:a=a+b;b=a-b;a=a-b;这样做的缺点是如果a,b都是一个比较大的数,那么相加可能会超界采用:a=a^b;b=a^b;a=a^b;无需担心超界问题。原理是按位异或运算如果a=00001001b=00000101那么00001001(a)^00000101(b)=0转载 2013-04-15 20:25:29 · 2032 阅读 · 0 评论 -
i++
面试题1:what will be the output of the following code?int i=3,j=4;i?i++:++j;printf("%d %d\n",i,j);A.3 3 B.4 4 C.3 4 D.4 3解析:i?i++:j++的意思是说如果问好前面的i是真,则进行i++,否则进行++j。由于i是3,所以是真,原创 2013-04-15 18:50:57 · 504 阅读 · 0 评论 -
内联函数和宏定义
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同。带参数的宏定义并不对参数进行运算,而是直接进行字符串替换内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数。 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定;而带参数宏定义的参数没有类型的概念,只有在宏展转载 2013-04-15 21:14:00 · 663 阅读 · 0 评论 -
extern “C” 条件编译
1.#include 和#include "filename.h" 有什么区别对于#include 编译器从标准库路径开始搜索查找对于#include "filename.h" 编译器从用户的工作路径上开始搜索查找2.ifndef /define /endif 有什么作用防止该头文件被重复引用例如header.h的定义如下#ifndef HEADER_H#de原创 2013-04-15 20:48:32 · 612 阅读 · 0 评论 -
如何得到C语言中int的最大值
只需一小句代码,如下:printf("%d\n", ~(unsigned int)0 / 2);分析:当无符号0以二进制储存在内存中的时候,每一位都为0,以32位int为例,(unsigned int)0的二进制为:00000000000000000000000000000000按位取反(~)后,变成:11111111111111111111111111111111转载 2013-04-15 19:40:41 · 4731 阅读 · 0 评论 -
赋值语句2
What does the following program print?#include using namespace std;int Vac=3;int main(){int Vac=10;::Vac++;cout<<::Vac<<endl;cout<<Vac<<endl;return 0;}解析:::Va原创 2013-04-15 16:59:28 · 636 阅读 · 0 评论 -
类成员函数的重载、覆盖和隐藏区别?
a.成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如原创 2013-05-28 10:35:05 · 480 阅读 · 0 评论 -
如何打印出当前源文件的文件名以及源文件的当前行号?
cout cout__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的原创 2013-05-28 10:36:20 · 804 阅读 · 0 评论 -
什么是“引用”?申明和使用“引用”要注意哪些问题?
引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数原创 2013-05-27 20:59:26 · 812 阅读 · 0 评论