![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
文章平均质量分 56
wangkechuang
这个作者很懒,什么都没留下…
展开
-
Trend科技的一道面试题
请看下面的程序,说说会出现什么问题?#include #include #include using namespace std; class CDemo { public: CDemo():str(NULL){}; ~CDemo() { if(str) delete[] str;转载 2012-04-25 10:33:02 · 732 阅读 · 0 评论 -
一道面试题
题目:求1+2+....+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C) class Temp{public: Temp() { ++N; Sum += N; } static void Reset(转载 2012-04-25 15:24:32 · 487 阅读 · 0 评论 -
malloc函数的一种简单的原理性实现
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。转载 2012-04-16 10:16:17 · 603 阅读 · 0 评论 -
什么是事务?
事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4个属性,只有这样才能称为一个事务。1)原子性 事务必须是原子工作单元。对于其数据修改,要么全部执行,要么全都不执行。2)一致性 事务在完成时,必须使所有的数据都保持一致。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。3)隔离性 由并发事务所做的修改必须与任何其他原创 2012-04-16 17:03:11 · 389 阅读 · 0 评论 -
子类的访问权限
请考虑标记为A到J的语句在编译时可能出现的情况。如果能够成功编译,请记为RIGHT,否则标记为ERROR.#include#includeclass Parent{public: Parent(int var=-1) { m_nPub=var; m_nPtd=var; m_nPrt=var; }public: int m_nPub;pr原创 2012-04-21 11:58:08 · 1019 阅读 · 0 评论 -
请讲述heap与stack的差别
(1)栈区:由编译器自动分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于结构体中的栈。(2)堆区:一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(3)全局区(staic):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一原创 2012-04-23 15:32:46 · 556 阅读 · 0 评论 -
指针与引用的区别
(1)引用访问一个变量是直接访问,而指针是间接访问。(2)引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。(3)引用在刚开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值。 指针在任何时刻都可以改变自己的指向。原创 2012-05-08 10:16:55 · 678 阅读 · 0 评论 -
不开辟用于交换数据的临时空间完成字符串的逆序
#includeusing namespace std;int main(){ char str[20]="abcdef"; int l=strlen(str); int i,j; for(i=0,j=l-1;i { str[i]=str[i]^str[j]; str[j]=str[i]^str[j]; str原创 2012-05-28 14:03:12 · 710 阅读 · 0 评论 -
飞机加油问题
题目描述:一道关于飞机加油的问题,已知:每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈,问题:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场) 答案:共5架飞机 1,2,3,4,51,2,3号飞机从起点A起飞转载 2012-05-30 23:45:10 · 3497 阅读 · 0 评论 -
海盗分宝石
题目描述:五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分:抽签决定自己的号码(1、2、3、4、5)首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼。依此类推转载 2012-05-30 16:26:46 · 1414 阅读 · 1 评论 -
在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?
因为时针、分针和秒针都是饶同一轴转动,所以它们都有自己的角速度,并且其角速度之间存在一定的关系。根据这个关系我们可以解除此题。若设时针的角速度为w,则分针跟秒针的角速度分别为12w和720w。先来考察时针与分针重合时的角度,设为x。则有等式: x/w = (x + n*360)/ 12w 其中n为分针超过时针的转载 2012-05-31 13:39:22 · 21358 阅读 · 0 评论 -
给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里
分析:首先54张牌分别用0到53 的数值表示并存储在一个整形数组里,数组下标代表纸牌所在的位置。接下来,遍历整个数组,在遍历过程中随机产生一个随机数,并以该随机数为下标的数组元素与当前遍历到的数组元素进行对换。时间复杂度为O(n) (注:所得到的每一种结果的概率的分母越大越好)#include #include #include void shuffle(int boke[])转载 2012-06-01 16:07:09 · 3779 阅读 · 0 评论 -
一道面试题
实现函数double power(double base,int exponent),求base的exponent次方。 double Power(double base,int exp){ if(exp==1) return base; double half=Power(base,exp>>1); return (((exp&1)==1)?base:1.0)*half*转载 2012-05-14 22:55:55 · 431 阅读 · 0 评论 -
求1+2+3+....n
要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)解法一:求n个数的累加和就是让累加n次。我们可以在一个类中定义静态变量,然后用构造函数来操作这个变量,然后输出结果。那怎么能让构造函数不用循环和递归操作n次呢,我们于是想到定义数组,这样就会连续调用n次构造函数,以实现我们的目的#includeusing namesp原创 2012-06-06 16:46:10 · 1108 阅读 · 0 评论 -
递减左旋数列中查找一个数
题目:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}克移两位形成的,在这种数组中查找某一个数。思路:在此序列不断二分的过程中,由于原序列是一个递减序列经过旋转得到的,将它从任何位置分开,都会得到两个序列,其中一个是递减序列,另一个可以通过一个递减序列通过旋转得到。这样在不断地二分查找时,我们处理的序列子片段要么就是一个旋转后递减序列,要么转载 2012-06-07 11:14:35 · 989 阅读 · 0 评论 -
不能被继承的类
如何使类不能被继承 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现菱形继承层次结构的一个好办法. 要实现一个不能被继承的类有很多方法. 如何使类不能被继承的主要的思路就是使子类不能构造父类的部分,这样子类就没有办法实例化整转载 2012-06-07 11:50:09 · 7619 阅读 · 2 评论 -
找出数组中两个只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路:这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现依次的转载 2012-05-22 15:53:50 · 441 阅读 · 0 评论 -
VC获取当前程序文件的路径,文件名以及路径+文件名
1.方法1 char pBuf[MAX_PATH]; //存放路径的变量 GetCurrentDirectory(MAX_PATH,pBuf); //获取程序的当前目录 strcat(pBuf,"\\"); strcat(pBuf,AfxG原创 2012-06-13 18:32:21 · 1168 阅读 · 0 评论 -
拷贝构造函数
拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:1. 以下函数哪个是拷贝构造函数,为什么?X::X(const X&); X::X(X); X::X(X&, int a=1); X::X(X&, int a=1, b=2); 2. 一个类中可以存在多于一个的拷贝构造函数吗?3. 写出以下程原创 2012-05-26 11:07:26 · 547 阅读 · 3 评论 -
set
容器set/multiset的底层数据结构为红黑树,set的内部元素依据其值自动排序,每个元素只能出现一次,不允许重复,multiset跟set相同,只不过它允许重复。示例代码:#include#includeusing namespace std;int main(){ set s; set::iterator p; s.insert(5); s.inse原创 2012-07-04 16:08:35 · 295 阅读 · 0 评论 -
list
容器list的底层数据结构为链表,为非连续内存,不支持[]操作符,支持任意位置操作,下面的代码展示了list的使用方法:#include#includeusing namespace std;int main(){ list l; char c; for( c='a';c { l.push_back(c); } list::const_ite原创 2012-07-04 16:11:50 · 327 阅读 · 0 评论 -
map
容器map/multimap的底层数据结构为红黑树,map是键值对,每一个元素都有一个键,是排序的基础,每个键只能出现一次,不允许重复。multimap跟map相同,只不过允许重复键,可以当作字典。示例代码:#include#includeusing namespace std;int main(){ multimap m; multimap::iterator i原创 2012-07-04 16:30:22 · 324 阅读 · 0 评论 -
stack
适配器stack底层用deque实现。示例代码:#include#includeusing namespace std;int main(){ stack s; for(int i=0;i s.push(i); while(!s.empty()) { cout s.pop(); } return 0;}原创 2012-07-04 16:36:32 · 337 阅读 · 0 评论 -
priority_queue
适配器priority_queue就是大顶堆,对头元素最大。示例代码:#include#includeusing namespace std;int main(){ priority_queue pq; int a; while(cin>>a&&a!=0) { pq.push(a); } while(!pq.empty()) { co原创 2012-07-04 16:58:52 · 326 阅读 · 0 评论 -
STL提供了很多高效的算法
如下所示:#include#include#includeusing namespace std;int main(){ vector v; vector::iterator pos; v.push_back(1); v.push_back(0); v.push_back(3); v.push_back(7); v.push_back(5);原创 2012-07-04 17:17:52 · 366 阅读 · 0 评论 -
memmove 的实现
baidu的笔试题目用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)。该函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。注意,作为公用库函数,请注意安全检查,注意处理内存区重合的情况。void* memmove(void *dest, const void *src,size_t原创 2012-06-21 10:22:32 · 451 阅读 · 0 评论 -
deque
容器deque的底层数据结构为队列,支持头部和尾部操作,支持[]操作符。示例如下:#include#includeusing namespace std;int main(){ deque deq; for(int i=1;i { deq.push_front(i*1.1); } for(i=0;i { cout } cout原创 2012-07-04 15:58:51 · 309 阅读 · 0 评论 -
要求或禁止在堆中产生对象
有时我们想这样管理某些对象,要让某种类型的对象能够自我销毁,即“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候我们想获得一种保障:“不在堆中分配对象,从而保证某种类型的类不会发生内存泄漏。”若在嵌入式系统上工作,就有可能遇到这种情况,发生在嵌入式系统上的内存泄漏是极其严重的,其堆空间是非常珍贵的。有没有可能编写出代码来要求或禁止在堆中产生对象(heap-ba转载 2012-07-05 09:59:55 · 3308 阅读 · 0 评论 -
STL
STL提供了容器、迭代器和算法。容器分为以下三种:序列容器:vector,list,deque关联容器:set,map适配器:stack,queue,priority,queue迭代器有两种: iterator 读写模式 const_iterator 只读模式STL提供了一些常用的算法:sort(),reverse(),find(),copy()等原创 2012-07-04 15:13:38 · 353 阅读 · 0 评论 -
queue
适配器queue底层用deque实现。示例代码:#include#includeusing namespace std;int main(){ int i; queue q; for(i=0;i q.push(i); while(q.size()) { cout q.pop(); } return 0;}原创 2012-07-04 16:40:23 · 272 阅读 · 0 评论 -
智能指针
智能指针的实现是C++中的热点,它哦功能就是动态分配对象以及当对象不再需要时自动执行清理,因此不必担心内存泄露问题。智能指针经常出现在各种C++面试中,要有考生说出智能指针的优缺点,甚至让求职者实现一个自己的智能指针。在C++编程领域里,有两种智能指针的实现:auto_ptr和shared_ptr.auto_ptr ptr(new Y)shared_ptr ptr(new X) 下原创 2012-07-04 23:10:44 · 445 阅读 · 0 评论 -
内存映射
如果程序涉及大型数据流的处理,则可以用内存映射文件,内存映射文件是由一个文件到一块内存的映射。Windows系统提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping()).这样,文件内的数据就可以用内存读/写指令来访问,而不是用ReadFile()和WriteFile()这样的I/O系统函数,从而提高了文件存取速度,因此适合对大文件的访问和处理。示例代码: HA原创 2012-07-04 23:51:43 · 420 阅读 · 0 评论 -
内存分配方式
在Windows中,系统为大家提供了很多种内存的分配方式,包括new,malloc(),HeapAlloc(),VirtualAlloc()等,那么它们的区别是什么呢?彼此有没有联系呢?下面对此来做个比较和总结。(1)new是C++的运算符,操作的是默认堆,具备编译器可控制的操作,可以完成C++类对象的构造,适合小型数据的内存分配,操作简单方便。(2)malloc是c提供的库函数,操作的是原创 2012-07-05 15:59:36 · 836 阅读 · 0 评论 -
进程空间的程序的布局
栈 空闲区堆(非连续区域)变量 代码 静态常量数据 全局变量区 示例:int a=0; //全局初始化区char *p1;//全局未初始化区void main(){ int b;// 栈 char s原创 2012-07-05 22:28:05 · 380 阅读 · 0 评论 -
程序分析
下面的程序运行情况:#includeusing namespace std;int main(){ char x,y,z; int i; int a[16]; for(i=0;i { a[i]=0; printf("\n"); } return 0;}答案:程序会出现死循环。分析:下图为程序原创 2012-07-05 23:15:49 · 362 阅读 · 0 评论 -
C++文件读写
示例代码如下:#include#include#includeint main(){ ofstream outFile("1.txt"); ifstream inFile("1.txt"); char buf[]="wangkechuang"; char buf1[20]=""; outFile.write(buf,sizeof("wangkechuang"原创 2012-07-07 21:34:31 · 286 阅读 · 0 评论 -
临界区
临界区机制是保证在某一时刻只有一个线程能访问数据的简便方法,即在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在一个线程进入后其他所有试图访问此临界区的线程被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到原子方式操作共享资源的目的。下面是一个windows下使用临介区访问共享数据的多线程例子:#include原创 2012-07-06 20:03:43 · 1604 阅读 · 0 评论 -
内存泄露
如果动态分配的内存在程序结束后一直未释放,就会出现内存泄露。一般常说的内存泄露是指堆内存的泄露。堆内存是指程序从堆中分配的大小任意的使用完后必须显式释放的内存。应用程序一般使用malloc、new等函数从堆中分配到一块内存,使用完后,程序必须相应地调用free或delete释放该内存块,否则,这块内存就不能被再次使用,就说这块内存泄露了。如下所示的代码:void GetMemory(cha原创 2012-07-05 15:35:12 · 454 阅读 · 0 评论 -
线程同步机制
Windows中有四种线程同步机制:(1)临界区(2)互斥量(3)信号量(4)事件它们的联系与区别总结如下:1.互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。2.互斥原创 2012-07-06 19:57:54 · 640 阅读 · 0 评论 -
互斥量(mutex)
互斥量(Mutex)跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就是就决定了任何情况下此共享资源都不会同时被多个线程访问。当前占据资源的线程在任务处理完后将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因此使用互斥不仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。下面是原创 2012-07-06 21:57:31 · 594 阅读 · 0 评论