程序员面试笔记
文章平均质量分 58
张荣华_csdn
这个作者很懒,什么都没留下…
展开
-
分解质因数
题目:任何一个合数都可以写成几个质数相乘的形式,这几个质数叫做这个合数的质因数。编程实现分解质因数。思路:从2开始到n-1顺序地查找n的因数,第一个找到的因数i一定是质因数;接下来继续对(n/i)进行质因数分解,递归进行。#include "stdio.h"int isPrime(int n) { int i; for (i=2; i<n; i++) { ...原创 2018-07-28 00:10:31 · 1157 阅读 · 0 评论 -
计算虚继承中对象占用的空间
class Base{void f(){}};class Derived:public Base(){void f1(){}};class Derived:public Base(){void f2(){}};sizeof(Base);sizeof(Derived1);sizeof(Deirived2); Base类没有任何数据成员,但是Base...原创 2018-07-18 00:06:45 · 221 阅读 · 0 评论 -
多态与虚函数
多态是指不同对象对于同样的消息做出不同的响应,C++中的多态性通过虚函数实现。多态性的原理是延迟绑定,也就是在函数调用时才绑定函数,这也是虚函数的工作原理。虚函数通过virtual关键字标识。class Base{public: virtual void f1(){cout<<"Base::f1()"<<endl; void f2(){c...原创 2018-07-18 00:06:56 · 166 阅读 · 0 评论 -
为什么构造函数不能声明为虚函数?
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数...原创 2018-07-18 00:07:07 · 4173 阅读 · 3 评论 -
虚函数的常识性问题
构造函数不能声明为虚函数,但是析构函数可以声明为虚函数,并且为了让父类中申请的资源得到释放,强烈建议将析构函数声明为虚函数。 内联函数会在预编译时会进行代码展开,省略函数调用,因此内联函数不能是虚函数。虽然使用inline和virtual共同修饰一个函数时能够通过编译,并在调用时会表现出虚函数的性质,但这是因为编译器在函数声明中遇到virtual关键字时,会选择忽略inline关键字,不进行代码...原创 2018-07-18 00:07:24 · 357 阅读 · 0 评论 -
函数模板
编写一个比较大小的函数时,如果参数类型不确定,则需要编写一组重载函数,以满足不同数据类型的需求。而且一旦函数逻辑发生变化,所有的重载函数都得随之改变,这无形中增加了维护的成本。通过使用函数模板可以轻松解决这个问题,只要参数类型支持比较操作,就可以直接使用定义好的函数模板。template<typename T>int compare(const T&v1,const...原创 2018-07-18 00:07:41 · 160 阅读 · 0 评论 -
模板中的操作符
函数模板compare中只是用了<操作符,而没有同时使用<和>两种操作符,这是泛型编程的一种好习惯。尽量使用通用的或相同的操作符能够减少模板对类型的依赖。就像compare模板只要求模板类型支持<操作,而不需要支持>操作。...原创 2018-07-19 00:13:09 · 232 阅读 · 0 评论 -
类模板
类模板中的数据成员和函数成员都可以使用模板参数中的待定类型。与函数模板不同,类模板在实例化时必须制定模板参数的类型。因为创建对象必须要有一个明确的类,只有指定模板参数的类型,才能保证在对象创建之前先实例化一个与对象相关版本的类。template<typename T>class Test{public: Test(T a):a(a){} void...原创 2018-07-19 00:13:15 · 361 阅读 · 0 评论 -
模板全特化和偏特化的使用方式
template<typename T1,typename T2>class Test{public: Test(T1 a,T2 b):a(a),b(b){cout<<"normal"<<endl;}private: T1 a; T2 b;};//Atemplate<>calss ...原创 2018-07-19 00:13:22 · 771 阅读 · 1 评论 -
顺序容器(C++)
STL中提供的顺序容器包括:vector、list、deque、string。vector容器在堆空间中建立了一个一维数组,地址空间是连续的,支持快速随机访问。但是在vector中插入删除元素的效率较低,插入操作会导致插入位置及其后面的元素向后移动,删除元素和会导致删除位置之后的元素向前移动。在vector尾部插入删除元素最快,不需要移动任何元素;在头部插入删除元素最慢,需要移动所有元素。 ...原创 2018-07-19 00:14:01 · 232 阅读 · 0 评论 -
手动调整vector容器空间的方式
容器的reverse函数支持手工设置vector分配空间的大小。需要注意reverse不支持回收剩余空间,也就是无法通过reverse函数减小capacity的值,当capacity的值大于等于reverse函数的参数时,程序什么也不会做,因此只能通过reverse扩展空间。 但是容器中提供了shrink_to_fit函数回收全部剩余空间。调用shrink_to_fit函数后,size的值等于c...原创 2018-07-19 00:14:09 · 1275 阅读 · 0 评论 -
删除单链表中指针q指向的结点
在一个非空链表list,每个结点中存放一个整形数据。指针q指向链表中某一个结点,编写一个函数delLink,删除q指向的结点。void delLink(LinkList * list,LinkList q){ LinkList r; if(q==*list){ *list=q->next; free(q);}...原创 2018-07-20 00:14:46 · 1548 阅读 · 0 评论 -
编写程序销毁一个单链表
销毁链表指的是将链表中的所有结点删除,并且释放掉每个结点所占用的内存空间,使其成为一个空链表。可以在顺序遍历链表的过程中依次删除链表中的每个结点,并释放掉它的内存空间。void deleteLinkList(LinkList * list){LinkList p=*list;while(p!=NULL){ *list=p->next; free(p);...原创 2018-07-20 00:14:52 · 3120 阅读 · 0 评论 -
递归查找数组的最大值
题目:用递归的方法实现查找数组中的最大值。#include "stdio.h"int getMaxValue(int *k,int n){ int tmp; if(1 == n) { return k[0]; } else { tmp = getMaxValue(k+1,n-1); } if(...原创 2018-07-28 00:10:24 · 1013 阅读 · 0 评论 -
图中有多少个三角形
题目:编程计算下面图形中包含多少个三角形。思路:首先给图中每个线段的交点设一个字母标记,不是任何两个字母都构成一条线段,使用穷举法列出所有线段;之后将图中所有的线段进行任意3条的组合,如果这3条线段能构成一个三角形,则计数加一,否则计数不变。判断线段能否组成三角形,需要注意每两条线段之间是否有交点、三条线段是否共线、三条线段是否有同一交点。#include "stdio.h"...原创 2018-07-28 00:07:43 · 14244 阅读 · 0 评论 -
数的分组
题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小。#include "stdio.h"#include "math.h"void main(){ unsigned int i,j,k=0,difference=0,r; unsigned int sum_A=0, sum_B=0; int a[10]; ...原创 2018-07-27 00:02:04 · 343 阅读 · 0 评论 -
相隔多少天
题目:输入两天的信息,计算这两天之间相隔多少天。#include "stdio.h"#include "math.h"typedef struct date { int year; int month; int day;} Date;int getIntervalDays(Date date_1, Date date_2) { int days1,d...原创 2018-07-27 00:01:57 · 665 阅读 · 0 评论 -
计算一年中的第几天
编程实现输入某年某月某日,计算这一天是这一年的第几天。#include "stdio.h"int getDays(int year ,int month,int date){ int months[13]={0,31,0,31,30,31,30,31,31,30,31,30,31} ,i,days=0; if((year % 4 == 0 && year...原创 2018-07-27 00:01:50 · 2171 阅读 · 0 评论 -
将大于2的偶数分解成两个素数之和
题目:输入一个大于2的偶数N,将N分解为两个素数之和。#include <stdio.h>/*子算法,判断整数n是否是素数,是素数则返回1,不是则返回0*/int isPrime(int n){ int i; for(i=2;i<n;i++) { if(n%i==0) return 0; } ...原创 2018-07-27 00:01:43 · 8756 阅读 · 0 评论 -
寻找数组中的次大数
题目:10个互不相等的整数,求其中的第2大的数字,要求数组不能排序,设计的算法效率越高越好。思路:可以设置两个变量max、secmax,将整个数据域分为3个部分:x<secmax,secmax<x<max,x>max。首先初始化max和secmax,将DATA[0]和DATA[1]中的最大值和次大值分别赋给max和secmax。接下来从DATA[2]开始将数组中的每个数...原创 2018-07-27 00:01:34 · 1488 阅读 · 1 评论 -
斐波那契数列的第n项
递推关系:f(n)=f(n-1)+f(n-2),f(1)=f(2)=1,通过两种方法实现。#include "stdio.h"int fibonacci_1(int n) { if (n==1 || n == 2) { return 1; } else { return fibonacci_1(n-1) + fibonacci_1(n-2);...原创 2018-07-26 00:06:23 · 636 阅读 · 0 评论 -
TOP K问题
题目:搜索关键词的TOP K问题。搜索引擎每天会把用户检索使用的关键词都记录下来,并保存到日志文件中,每个关键词的长度为1-255字节。假设目前有1000万个记录(这些关键词的重复度较高,虽然总数是1000万,但去重后不超过300万。一个关键词的重复度越高,说明检索它的用户越多,也就是越热门的关键词。)请你统计最热门的10个关键词,要求使用的内存不超过1G。解决这类问题,原则上分为两步:1...原创 2018-07-26 00:06:16 · 425 阅读 · 0 评论 -
从有序数组中找出某个数出现的次数
#include "stdio.h"int bin_search(int array[], int key, int length, int loc_flag) { int low = 0, high = length -1; int mid = 0; int last = -1; /*用last记录最终的位置loc_a或loc_b*/ ...原创 2018-07-26 00:05:57 · 1144 阅读 · 0 评论 -
简述deque容器的插入删除原理
双端队列deque是一种双向开口的存储空间分段连续的数据结构,每段数据空间内部是连续的,而每段数据空间则不一定连续。 初始状态下,双端队列中只有一段数据空间,中控器的第一个指针指向这段空间。在向deque插入和删除元素的过程中,会根据数据空间的状态,动态分配和释放空间,数据空间段的数量会发生变化。 如果无法像deque的队首插入更多的元素,表明首段数据空间已满,deque会申请一段新的数据空间...原创 2018-07-19 00:14:15 · 1448 阅读 · 0 评论 -
容器适配器
每种容器都提供了一组接口,如果容器中的接口不能满足需求,那么重新编写容器还是改变我们的需求 应该构造一个容器接口到需求接口之间的转换器,称为容器适配器。 容器适配器将原容器进行了一层封装,底层基于普通容器,上层对外提供封装后的新接口,满足不同使用者的需求。常用的栈stack、队列deque、优先级队列priority_queue在STL中都有自己的容器适配器。 容器适配器对使用者是个黑盒,使...原创 2018-07-19 00:14:27 · 233 阅读 · 0 评论 -
简述STL中容器适配器的概念
STL中提供了三种容器适配器:栈适配器、队列适配器和优先队列适配器。在使用STL时。可以向使用普通的栈stack、队列queue、和优先队列priority_queue那样去操作数据。 栈的特征是后进先出,后入栈的元素先出栈,先入栈的元素后出栈,因此站适配器应该支持从栈顶添加删除元素以及访问元素的操作。容器vector、list和quque都满足栈操作的条件,因此都能作为栈适配器的底层容器...原创 2018-07-19 00:14:35 · 547 阅读 · 0 评论 -
递归计算二叉树的叶子节点个数
#include "stdio.h"#include "malloc.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;/*创建一棵二叉树*/void CreatBiTree(BiTr...原创 2018-07-24 00:07:35 · 12434 阅读 · 1 评论 -
计算二叉树的叶子结点个数
#include "string.h" #include "stdio.h" #include "malloc.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;void CreatB...原创 2018-07-23 21:26:51 · 30915 阅读 · 3 评论 -
递归计算二叉树深度
#include "stdio.h"#include "malloc.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;/*创建一棵二叉树*/void CreatBiTree(BiTr...原创 2018-07-23 21:20:56 · 10642 阅读 · 1 评论 -
编程计算二叉树的深度
#include "stdio.h"#include "malloc.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;/*创建一棵二叉树*/void CreatBiTree(BiTre...原创 2018-07-23 21:19:25 · 5588 阅读 · 0 评论 -
编程创建一棵二叉树
#include "stdio.h"#include<malloc.h>typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;/*创建一棵二叉树*/void CreatBiTree(...原创 2018-07-23 21:12:06 · 5310 阅读 · 1 评论 -
编程实现二叉树的遍历
#include "stdio.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNode , *BiTree;/*创建一棵二叉树*/void CreatBiTree(BiTree *T){ char c;...原创 2018-07-23 21:04:42 · 1049 阅读 · 0 评论 -
二叉树的性质
性质1:在二叉树中第i层上之多有2^(i-1)个结点。性质2:深度为k的二叉树之多有2^k-1个结点。性质3:对于任意一棵二叉树,如果其叶子节点数为n0,度为2的结点数为n2,则n0=n2+1。性质4:具有n个结点的完全二叉树的深度为[log2n]+1。...原创 2018-07-23 20:55:38 · 526 阅读 · 0 评论 -
树结构的性质
性质1:非空树的结点总数等于树中所有节点的度之和加1。性质2:度为k的非空树的第i层最多有k^(i-1)个结点。性质3:深度为h的k叉树最多有(k^h-1)/(k-1)个结点。性质4:具有n个结点的k叉树的最小深度为[logk(n(k-1)+1]。 ...原创 2018-07-23 20:45:03 · 351 阅读 · 0 评论 -
编程实现一个二/八进制的转换器
#include "stdio.h"#include "math.h"#include "malloc.h"#define STACK_INIT_SIZE 30#define STACKINCREMENT 10typedef struct{ char *base; char *top; int stacksize;}sqStack;int initSta...原创 2018-07-23 20:35:31 · 485 阅读 · 0 评论 -
括号匹配问题
#include "stdio.h"#include "malloc.h"#define STACK_INIT_SIZE 20#define STACKINCREMENT 10typedef struct{ char *base; char *top; int stacksize;}sqStack;int initStack(sqStack *s){ ...原创 2018-07-23 20:34:06 · 427 阅读 · 0 评论 -
编程计算二叉树中某结点的层数
题目:编写一个函数:实现在二叉树中查找与字符key内容相同的结点,并返回其在二叉树中的层数。如果二叉树中不存在该结点,则返回-1.#include "stdio.h"typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/} BiTNod...原创 2018-07-24 00:07:29 · 8871 阅读 · 0 评论 -
二叉排序树的性质
1.若它的左子树不为空,则左子树上的所有节点的值均小于根节点的值;2.若它的右子树不为空,则右子树上的所有结点的值均大于根节点的值;3.二叉排序树的左右子树也都是二叉排序树。...原创 2018-07-24 00:07:21 · 2398 阅读 · 0 评论 -
自定义优先队列的元素权重
使用优先队列保存一组矩形对象,矩形长宽为1-100的随机数,要求优先队列的元素权重为矩形面积,并按照面积大小依次输出矩形的长和宽。strcut square{int length;int width;square(int l,int w):lenth(l),width(w){}};strcut compare{bool operator()(square x,squar...原创 2018-07-19 00:14:48 · 738 阅读 · 0 评论 -
关联容器
STL中常用的关联容器有四种:set、map、multiset、multimap。这四种容器中的元素都是按照键有序排列的,向容器中插入元素时会将元素插入到适当的位置,插入删除操作都不会破坏键的有序性。 关联容器中元素的键必须是可比较的。如果键是基本类型,可以直接使用,因为基本类型都是可比较的;如果键是自定义类型,则需要定义带有比较谓词的构造函数才能作为关联容器的类型参数。 map中保存着一系列...原创 2018-07-19 00:15:31 · 837 阅读 · 0 评论