剑指offer——基础知识

请你来说一下C++类中成员的访问权限

c++通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限,它们分别公有的、保护的、私有的,被称为成员访问限定符。在类的内部(定义类的代码内部),无论成员被声明public、protected还是private,都是可以相互访问的,没有访问限制。在类的内部(定义类的代码外部),只能通过对象访问成员,并且通过对象只能访问public属性的成员,不能访问private、protected属性的成员

请你来说一下struct和class的区别

在c++中,可以用struct和class定义类,都可以继承。区别在于:struct的默认继承权限和默认权限是public,而class的默认继承权限和默认访问权限是private

另外,class还可以定义模板类形参,比如template<class T,int i>.

请你回答一下c++类内可以定义引用数据成员吗

可以,必须通过成员函数初始化列表初始化

数组指针和指针数组的区别

数组指针:int(*p)[n];指向数组的指针

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也就是说执行p+1时,要跨国n个整型数据的长度

如果将二维数组赋给一个指针,应

int a[3][4];

int (*p)[4];

p=a;

p++;//p跨过行a[0][]指向a[1][];

也被称为行指针

指针数组   int *p[n];数组元素都是指针

[]优先级高,先与p结合成为一个数组,在由int*说明这是一个整型指针数组,它由n个指针类型的数组元素,这里执行p+1

是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、....p[n-1],而且它们分别是指针变量可以用来存放变量地址,但可以这样*p=a,这里*p表示指针数组第一个元素的值,a的首地址的值

int *p[3];

int a[3][4];

for(i=0;i<3;i++)

p[i]=a[i];

线性顺序存储结构和链式存储结构的区别和优缺点

顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素。

由于表中各个元素具有相同的属性,所以占用的存储空间相同。

线性表按链式存储时,每个数据元素的存储包括数据区和指针两个部分,数据区存放结点本身的数据

指针存放其后继元素的地址,只要知道该线性表的起始地址表中的各个元素可通过其间的链接关系逐步找到

优缺点

顺序存储需要开辟一个定长的空间,读写速度快,缺点不可扩充容量

链式存储不需要担心容量的问题,读写速度慢些,由于要存储下一个数据的地址所哟存储空间比顺序存储大些。

二叉树:

结点定义

class TreeNode{
     int data;
     TreeNode left;
     TreeNode right;
}

创建一棵二叉树

求二叉树的最大深度

int maxDeath(TreeNode node){
      if(node==NUll)
         return 0;
      int left=maxDeath(node.left);
      int right=maxDeath(node.right);
      return Math.max(left,right)+1;
}

求二叉树的最小深度

int getMinDepth(TreeNode root){
     if(root==Null)
      return 0;
     return getMin(root);
}

int getMin(TreeNode root)
{
      if(root==Null)
        return Inter.MAX_VALUE;
      if(root.left==Null&&root.right==NULL)
          return 1;
      return Math.min(getMin(root.left),getMin(root.right))+1;
}

 

删除节点要从查找要删的节点开始入手,首先找到节点,这个要删除的节点有三种情况需要考虑

二叉树的遍历:先序遍历(根节点,左节点,右节点)

                         中序遍历(左子树、根节点、右子树)

                         后序遍历(左子树、右子树、根节点)

完全二叉树:若二叉树的高度是h,除第n层外,其他层全部都达到了最大个

满二叉树:除最后一层外,每一层上的所有节点都有两个子节点,最后一层都是叶子节点

哈夫曼树:带权路径长度最短的树

平衡二叉树:左右两个子树的高度差值不超过1;

二叉搜索树/二叉排序树:一个节点的左子节点的关键字小于这个节点,右节点的关键字大于该节点

AVL树:本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。

            1.本身首先是一棵二叉搜索树。

            2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

红黑树:红黑树是每个节点都带颜色的树,节点颜色或是红色或是黑色,红黑树是一种查找树。红黑树有一个重要的性质,从根节点到叶子节点的最长的路径不多于最短的路径的长度的两倍。

           对于红黑树,插入,删除,查找的复杂度都是O(log N)。

Trie树:又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

           它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

            3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。

B+树:B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:

1.有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。

通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。

B树:1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:

1、根结点至少有两个子女;

2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;

3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;

4、所有的叶子结点都位于同一层。

在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。

因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。

B-树中的一个包含n个关键字,n+1个指针的结点的一般形式为: (n,P0,K1,P1,K2,P2,…,Kn,Pn)

其中,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Offer:名企面试官精讲典型编程题》剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点。全书分为7章,主要包括面试的流程,讨论面试流程中每一环节需要注意的问题;面试需要的基础知识,从编程语言、数据结构及算法三方面总结了程序员面试的知识点;高质量的代码,讨论影响代码质量的3个要素(规范性、完整性和鲁棒性),强调高质量的代码除了能够完成基本的功能之外,还能考虑到特殊情况并对非法输入进行合理的处理;解决面试题的思路,总结在编程面试中解决难题的常用思路,如果在面试过程中遇到了复杂的难题,应聘者可以利用画图、举例和分解复杂问题3种方法化繁为简,先形成清晰的思路再动手编程;优化时间和空间效率,介绍如何优化代码的时间效率和空间效率,读完这一章读者将学会常用的优化时间效率及空间换时间的常用算法,从而在面试中找到最优的解法;面试中的各种能力,本章总结应聘者在面试过程中如何表现学习能力和沟通能力,并通过具体的面试题讨论如何培养知识迁移能力、抽象建模能力和发散思维能力;两个面试案例,这两个案例总结了应聘者在面试过程中哪些举动是不好的行为,而哪些表现又是面试官所期待的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值