小米手机面经

news/2024/11/15 3:17:23/
  1. 问你职业规划,看与目前岗位的匹配度

  2. 询问项目,看具体做了什么方向 integer和int的区别

  3. integar和int的区别
    1.Integer是int的包装类,int则是java的一种基本数据类型
    2.Integer变量必须实例化后才能使用,而int变量不需要
    3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象
    4.而int则是直接存储数据值 Integer的默认值是null,int的默认值是0

  4. const的用途

    1.const全局/局部变量:保证变量不改变

    2.const指针/引用:指针变量和变量指针,非const引用只能绑定非const对象,const引用可以绑定任何对象

    3.const修饰函数参数:放置函数体内可能会修改参数原始对象。因此,有三种情况讨论,
    a. 函数参数为值传递,本身就是形参,并不会修改原始对象,故不需要const
    b. 函数参数为指针,指针传递只会进行浅拷贝,可以加上顶层const防止指针指向被修改,加上底层const防止指向对象被修改
    c.函数参数为引用:添加一个const,即可减小拷贝开销,又可以防止修改底层引用的对象

    4.const修饰函数返回值:可以有效防止因用户错误造成的意外,可以防止外部object的内部成员进行修改。

    5.const成员函数和数据成员:
    a.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数
    b.const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的
    c.const成员函数不可以修改对象的数据,不管对象是否有const
    d.类的常数据成员:类的数据成员不能再任何函数中被复制或修改,但必须***在构造函数中使用初始化列表的方式赋初值***

    6.const修饰类对象:该对象内的任何成员变量都不能被修改,因此不能调用该对象的任何非const成员函数

class A
{public:void funcA() {}void funcB() const {}
};int main
{const A a;a.funcB();    // 可以a.funcA();    // 错误const A* b = new A();b->funcB();    // 可以b->funcA();    // 错误
}
  1. final
    1.修饰类:说明类不能被继承
    2.修饰变量:如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象(但它指向的对象内容可以变)。
    3.final和static的区别:static表示只保存一份副本,而final的作用是用来保证变量不可变。

  2. 二叉搜索树的后序遍历序列
    1.递归

class Solution {
public:bool VerifySquenceOfBST(vector<int> sequence) {int n = sequence.size();if(n == 0) return false;    // 注意审题, 约定空树不是二叉搜索树return check(sequence, 0, n - 1);}bool check(vector<int>& sequence, int l, int r){if(l >= r) return true;    // 若当前子树只有一个节点int root = sequence[r];    // 当前子树的根节点// 划分出右子树int j = r - 1;while(j >= 0 && sequence[j] > root) j--;// 检查左子树是不是存在大于根节点的数for(int i = l; i <= j; i++){if(sequence[i] > root) return false;}// 分治法检查左子树和右子树return check(sequence, l, j) && check(sequence, j + 1, r - 1);}
};

时间复杂度:O(n^2), n为二叉树节点的个数, 当树为链式时时间复杂度最坏为O(n^2)
空间复杂度:O(n), 当树为链式结构时, 递归深度为n

2.栈
题目中的要点在于两点:后序遍历与二叉搜索树。我们模拟后序遍历的过程,来判断每时每刻的状态是否满足二叉搜索树。
从后往前遍历,就顺序变成了根->右子树->左子树,由于右子树>根>左子树,所以当该序列有下降时,说明当前已经来到了左子树,(因为每个二叉搜索树的右子树一定大于根,所以在没到左子树的情况下,必定是升序的情况,一旦不满足升序,说明已经到了左子树。)找到大于当前值的最小值,该值为局部树的根节点。初始时,令根节点root无穷大,则当前树为该根节点的左子树。遍历过程中,逐步缩小root的值,因为所有的操作都是在当前根节点root的左子树中进行的,所以保证遍历的值小于root即可满足判断条件,否则为false;

class Solution {
public:bool VerifySquenceOfBST(vector<int> sequence) {if(sequence.size()==0)return false;stack<int> s;int root=1000000;//序列从后往前遍历,即根->右子树->左子树的顺序。for(int i=sequence.size()-1;i>=0;i--){//不满足二叉搜索树所表现出来的特征,即存在左子树中节点值大于根节点。if(sequence[i]>root)return false;//找到栈中大于当前值sequence[i]的最小值 即为rootwhile(!s.empty()&&sequence[i]<s.top()){root=s.top();s.pop();}s.push(sequence[i]);}return true;}  
};

图解在这里插入图片描述复杂度分析:
时间复杂度:O(n),遍历数组序列。
空间复杂度:O(n),入栈最大数目n。

  1. 判断二叉树是否为平衡二叉树
    题目:
    输入一颗二叉树的根节点,判断该树是不是平衡二叉树。
    解题思路:
    1.根据二叉树的定义,我们可以递归遍历二叉树的每一个节点来(中序遍历),求出每个节点的左右子树的高度,如果每个节点的左右子树的高度相差不超过1,按照定义,它就是一颗平衡二叉树。
//求二叉树的高度
int treeDepth(BinaryTreeNode* root){if(root==NULL){return 0;}int nLeft=treeDepth(root->m_pLeft);int nRight=treeDepth(root->m_pRight);return nLeft>nRight?nLeft+1:nRight+1;
}bool isBalanced(BinaryTreeNode* root){if(root==NULL)return true;//空树是平衡二叉树int left= treeDepth(root->m_pLeft);int right= treeDepth(root->m_pRight);int diff=left-right;if(diff>1||diff<-1)return false;return isBalanced(root->m_pLeft)&&isBalanced(root->m_pRight);
}

优点:只要求出给定二叉树的高度,就可以方便的判断出二叉树是平衡二叉树,思路简单,代码简洁。

缺点:由于每个节点都会被重复遍历多次,这造成时间效率不高。

解题思路: 采用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右字数。此时,记录每个节点为根节点的树的高度,就可以一边遍历一边判断每个节点是不是平衡的。

bool IsBalanced(BinaryTreeNode* pRoot, int* depth){  if(pRoot== NULL){  *depth = 0;  return true;  }  int nLeftDepth,nRightDepth;  bool bLeft= IsBalanced(pRoot->m_pLeft, &nLeftDepth);  bool bRight = IsBalanced(pRoot->m_pRight, &nRightDepth);  if (bLeft && bRight){  int diff = nRightDepth-nLeftDepth;  if (diff<=1 && diff>=-1) //左右字树高度差绝对值不超过1  {  *depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth : nRightDepth);  return true;  }  }   return false;  
}  bool IsBalanced(BinaryTreeNode* pRoot)  
{  int depth = 0;  return IsBalanced(pRoot, &depth);  
}  
  1. ARP协议:
    1.地址解析协议,通过解析IP地址得到MAC地址。

    2.在TCP/IP分层结构中,把ARP划分为网络层

    3.工作过程缩写:
    主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接受返回信息,以此确定目标的物理地址。收到返回信息后,会将该IP地址和物理地址存入本机ARP缓存中一段时间,下次请求时便可直接查询。

    4.工作过程详细:
    假设主机A和B在同一个网段:

    a.主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。

    b.如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。

    c.主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。

    d.主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。

    假设主机A和B在不同一个网段:
    a.主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址.当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。
    b.如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;
    c.如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。

  2. DHCP协议:
    1.动态主机配置协议 ,前身是BOOTP协议,使用UDP协议工作。

    2.DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录、自动给内网机器分配IP地址等信息的协议。

    3.相比于BOOTP,DHCP通过“租约”来实现动态分配IP的功能,实现IP的时分复用,从而解决IP资源短缺的问题。其地址分配的方法有三种
    a.人工配置:由管理员对每台具体的计算机指定一个地址

    b.自动配置:服务器为第一次连接网络的计算机分配一个永久地址,DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址

    c.动态配置:在一定的期限内将地址租给计算机,客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,并且租期结束后客户必须续租或者停用该地址,而对于路由器,经常使用的地址分配方式是动态配置。

    4.租约表分为静态租约表和动态租约表。当收到客户端的首次请求时,DHCP服务器先查找静态租约表;若存在请求的表项,返回这个客户的静态IP地址;否则,从IP地址池中选择可用的IP分配给客户,并添加信息到动态数据库中。此外,服务器将会周期性的刷新租约表写入文件存档,在这个过程中会顺便对动态租约表进行租期检查。

  3. DNS协议:
    1.域名:由一串用点分割的名字组成的Internet上某一台计算机或计算机组的名称,比如www.baidu.com
    IP地址:一长串能够唯一地标记网络上的计算机的数字
    网址:网址里面含有域名:举个例子:www.gitee.com/veal98 就是一个网址,而 www.gitee.com 就是域名

    2.域名解析协议,将域名和IP地址互相映射。可以用UDP或TCP进行传输,端口号都是53.但大多数情况下DNS都是用UDP。

    3.DNS查询方式有两种:
    a.递归查询:
    b.迭代查询
    所谓迭代就是,如果请求的接收者不知道所请求的内容,那么接收者将扮演请求者,发出有关请求,直到获得所需要的内容,然后将内容返回给最初的请求者。
    通俗点来说,在递归查询中,如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案;而迭代查询则是指,如果接收者 B 没有请求者 A 所需要的准确内容,接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求。
    一般域名服务器之间用迭代查询,避免根域名服务器的压力过大

    4.域名缓存:
    本地中有两种缓存方式
    a.浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,如 Chrome 的过期时间是 1 分钟,在这个期限内不会重新请求 DNS
    b.操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件。比如 Windows10 下的 hosts 文件存放在 C:\Windows\System32\drivers\etc\hosts

    5.完整域名解析过程
    a.搜索浏览器的DNS缓存
    b.若没有名字,则搜索操作系统的DNS缓存
    c.若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是递归查询)
    d.若本地域名服务器的DNS缓存没有名字,则本地域名服务器向上级域名服务器进行迭代查询。(先向根域名服务器发请求,根域名服务器会返回顶级域名服务器的地址,从而获得权限域名服务器的地址,最后获得该域名对应的IP地址)
    e.本地域名服务器将得到的IP地址返回给操作系统,并且自己将IP地址缓存起来
    f.操作系统将IP返回给浏览器,并且自己将IP地址缓存起来
    g.浏览器得到ip地址,并且自己将IP地址缓存起来


http://www.ppmy.cn/news/210372.html

相关文章

小米手机如何解锁

目录 1&#xff0c;申请解锁 2&#xff0c;刷入开发版 3&#xff0c;解锁 ​​​​​​​ 1&#xff0c;申请解锁 首先申请解锁&#xff0c;请用解锁手机所登入的小米帐号登入申请&#xff0c;地址&#xff1a;http://www.miui.com/unlock/ 填写 姓名、手机号、申请理由 并…

小米手机log

下面来说下抓取Log的四种方法&#xff1a; 方法一&#xff1a;   如果在使用过程中遇到程序FC点击立即报修&#xff0c;这个是必须的&#xff0c;报修之后相关的工程师就会收到相应的log文件&#xff0c;第一时间来修复这些容易浮现的问题。 方法二&#xff1a;   1.进入硬…

android小米手机拍照功能介绍,小米手机使用手册

小米手机使用手册 1、 设置默认输入法 默认的输入法是英语的。也就是只能输入英文字母。但是往往我们用到汉字的比较多。所以&#xff0c;这里就教大家怎么设置默认输入法。 屏幕主页—设置—全部设置—系统—语言和输入法—默认的是Android 键盘。我们需要先开启搜狗输入法&am…

小米手机刷机

小米手机刷机 方式一&#xff1a;通过官方的方式&#xff0c;刷入MIUI其他版本 卡刷&#xff1a;http://www.miui.com/shuaji-329.html 线刷&#xff1a;http://www.miui.com/shuaji-393.html 以上的两种方式官网说的很详细我就不多赘述了。 可能会遇到的问题&#xff1a;…

Elliptic Labs宣布,搭载其AI虚拟智能传感器的全新小米智能手机Redmi Note 10 Pro正式发布

挪威&#xff0c;奥斯陆--(美国商业资讯)--全球AI软件、虚拟智能传感器领导者Elliptic Labs (EuroNext Growth: ELABS.OL)宣布再度与全球第三大智能手机制造商小米(HKSE: 1810.HK)联手&#xff0c;将其AI虚拟接近传感器INNER BEAUTY引入其全新智能手机——Redmi Note 10 Pro中。…

自费送最新款小米 Redmi Note 8 Pro 手机!

最近有粉丝留言让我多搞些抽奖活动&#xff0c;为了感谢大家对本公众号的大力支持本次联合了10个号主&#xff0c;送Redmi Note 8 Pro&#xff0c;祝所有人新的一年工作顺利&#xff0c;工资芝麻开花节节高&#xff0c;希望本次抽奖可以给你带来好运。生活不易&#xff0c;望大…

【小米8手机的状况】

商品介绍&#xff1a; 小米8 全面屏智能游戏手机 6GB64GB 黑色 全网通4G 双卡双待 商品名称&#xff1a;小米8 商品编号&#xff1a;7437788 商品毛重&#xff1a;430.00g 商品产地&#xff1a;中国大陆 CPU型号&#xff1a;骁龙845 运行内存&#xff1a;6GB 机身存储&#x…

ffmpeg enum AVChannel枚举解析

AVChannel枚举是在2022-12-20的提交中添加的&#xff0c;对应的版本号是5.1. 这个提交的描述是"avutil/channel_layout: add AVChannel enum and related functions"。 原型 typedef struct AVChannelCustom {enum AVChannel id;char name[16];void *opaque; } AVCh…