面试题目汇总

1,for循环的时间复杂度

for(int i=0;i<N;i++)
{
   for(int j=i;j<N;j++)
   {
     //此处运行次数:N+N-1+N-2+...+1=1+2+3+...+N=N(N+1)/2
   }
}
for(int i=0;i<N;i++)
{
   for(int j=i+1;j<N;j++)
   {
     //此处运行次数N-1+N-2+N-3+...+1=1+2+3+...+N-1=N(N-1)/2
   }
}

2,变量的声明和定义

3,关于存储区域描述错误的是

char buff[] = "abc";//栈
char *pStr1 = "123456";//pStr存储在栈区,“123456”存储在常量区
char *pStr2 = new char[256];//pStr2在堆区,分配的内存也在堆区

4,友元函数可以访问 类的公有、保护和私有成员

5,联合程序的输出结果 266 

union {
    int i;
    char x[2];
}a;
int main(){
    a.x[0] = 10;
    a.x[1] = 1;
    printf("%d",a.i);
    return 0;
}

6,构造函数和析构函数

7,反转链表

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* reverseList(ListNode* head) {
    ListNode* curr = head;
    ListNode* prev = nullptr;
    while (curr){
        ListNode* next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

8,指定数组nums,将数组中的0全部移动到数组的末尾,维持其他所有非0元素的相对位置,空间复杂度为o(1),时间复杂度为O(n)

#include <vector>
#include <iostream>

std::vector<int> MoveAllZeroToTall(std::vector<int>& nums){
    int n = nums.size();
    int left = 0;
    int right = 0;
    while (right < n){
        if (nums[right]){
            std::swap(nums[left],nums[right]);
            left++;
        }
        right++;
    }
    return nums;
}

int main(){
    std::vector<int>nums{0,8,0,12,34,0,89};
    nums = MoveAllZeroToTall(nums);
    for (int i = 0; i < nums.size(); ++i) {
        std::cout << nums[i] << " ";
    }
}

9,linux 常用命令

10,下面哪些不属于字节流?

11,关于PV操作的理解

12 内存的静态分配方式和动态分配方式

13 MySQL的数据库事务的隔离级别 对资源消耗最大的是

14 Linux扩展虚拟内存  将/dev/sda5格式化为交换分区的指令是

15 关于epoll叙述正确的是

EPOLL事件有两种模型 Level Triggered (LT) 和 Edge Triggered (ET):

  • LT(level triggered,水平触发模式)是缺省的工作方式,并且同时支持 block 和 non-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。
  • ET(edge-triggered,边缘触发模式)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,等到下次有新的数据进来的时候才会再次出发就绪事件。如果一直不对这个fd进行I/O操作,导致fd变为未就绪时,内核同样不会发送更多的通知,因为only once。所以这种方式下,出错率比较高,需要增加一些检测程序。

epoll的优点:

  • 没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
  • 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
  • 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。

1、listen fd,有新连接请求,对端发送普通数据 触发EPOLLIN。
16 接口中 定义static方法正确的是

static void method1(){};  个人感觉
static protected void method2(){}
static void method4();
static public void method3();

 17 需要被重写的方法 使用哪个关键字进行修饰?

18  完全二叉树

preview

19  等概率下 查找成功的平均查找长度

20 查看linux系统中/etc/fstab文件的第一列和第三列

21 Kruskal 和 Prim算法相关知识

22 贪心算法 的理解

23 对表执行 select 操作 不会激活 触发器

  • 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等

24 解决临界区资源互斥应该遵循的原则

25  代码 消消乐 

 

#include <iostream>
#include <vector>
int n;

int main(){
    std::cin >> n;
    getchar();
    std::string input_string{};
    std::getline(std::cin,input_string);
//    std::cout << input_string;
    std::vector<int>base(4,0);
    for (int i = 0; i < n; ++i) {
        base[input_string[i]-'0']++;
    }
    std::cout << std::min(base[0],base[1]) * 2 + std::min(base[2],base[3]) * 2 << std::endl;

//    for (int i = 0; i < n; ++i) {
//        std::cout<< input_nums[i] << " ";
//    }
}

26 web页面级优化描述

27 数组基本有序的时候,下面哪个算法对数组排序的时间复杂度最低

28 进程进入等待状态有哪几种方式

29 栈的入栈序列为 1,2,3,.......,n 出栈顺序为P1,P2,P3 .......Pn,如果P2 = 3,P3的可能取值的个数是 n-1

30  以下哪种http状态下,浏览器会产生两次http请求?( )A 304;B 404 C 403  D 302

  • 302临时重定向,会产生两次http请求,软件开发中一般用于跨域请求先请求跨域凭证,再访问跨域后的网络资源。
  • 304:客户端申请的资源存在,但是条件不满足
  • 302:临时重定向
  • 404:NOT FOUND
  • 400:存在语法错误

31 容器底层使用了namespace,linux内核中 PID namespace是如何实现的

32  ping命令是属于tcp/ip的哪一层?应用层

32  如果事务T获得了数据项Q上的排它锁,则T对Q (   )  既可以写也可以读

  • 链接:https://www.nowcoder.com/questionTerminal/30da7fd9af91446d9b71b162eb8070b2
  • 来源:牛客网
  • 共享锁【S锁】 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
  • 排他锁【X锁】又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

33 n个数值选出最大的m个数值(3<m<n) 最小的时间复杂度是?

  • 最简单的方法:将n个数排序,排序后的前k个数就是最大的k个数,这种算法的复杂度是O(nlogn)
  • O(n)的方法:利用快排的patition思想,基于数组的第k个数来调整,将比第k个数小的都位于数组的左边,比第k个数大的都调整到数组的右边,这样调整后,位于数组右边的k个数最大的k个数(这k个数不一定是排好序的)
  • O(nlogk)的方法:先创建一个大小为k的最小堆,接下来我们每次从输入的n个整数中读入一个数,如果这个数比最小堆的堆顶元素还要大,那么替换这个最小堆的堆顶并调整
  • n个数值选出最大m个数(3<m<n)的最小算法复__牛客网

34 6行5列 数组按照列序为主要顺序进行存储,基地址为1000,每个元素占据2个存储单元,则第三行第4列的元素(假定无第0行第0列)的地址是

  • 1042 注意 是按照列进行存储

35 将N条长度均为M的有序链表进行合并,合并以后的链表也保持有序,时间复杂度为()?

36 邻接表表示图的时候 拓扑排序时间复杂度

37 时间复杂度?

void recursive(int n,int m,int o){
    if (n <= 0){
        printf("%d,%d\n",m,o);
    } else{
        recursive(n-1,m+1,o);
        recursive(n-1,m,o+1);
    }
}

38 对于分布式事务的CAP定理,说法正确的是

 C 一致性

  • 一致性是写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点时,从任意节点读取到的数据都是最新的状态。
  • 上图中,商品信息的读写要满足一致性就是要实现如下目标:
  • (1)商品服务写入主数据库成功,则向从数据库查询新数据也成功。
  • (2)商品服务写入主数据库失败,则向从数据库查询新数据也失败。
  • 如何实现一致性?
  • (1)写入主数据库后要将数据同步到从数据库。
  • (2)写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁,以免在新数据库写入成功后,向从数据库查询到旧的数据。
  • 分布式一致性的特点:
  • (1)由于存在数据同步的过程,写操作的相应会有一定延迟。
  • (2)为了保证数据一致性会对资源暂时锁定,待数据同步完成释放锁定资源。
  • (3)如果请求数据同步失败的节点则会返回错误信息,一定不会返回旧信息。

可用性

  • 可用性是指任何事务操作都可以得到相应结果,且不会出现响应超时或响应错误。
  • 上图中,商品信息的读取要满足可用性就是要实现如下目标:
  • (1)从数据库接收到查询的请求则立即能够响应数据查询结果。
  • (2)从数据库查询不允许出现响应超时或者响应错误。
  • 如何实现可用性?
  • (1)写入主数据库要将数据同步到从数据库。
  • (2)由于要保证从数据库的可用性,不可将从数据库中的资源锁定。
  • (3)即时数据还没有同步过来,从数据库也要返回要查询的数据,哪怕是旧数据,如果连旧数据也没有则可以按照约定返回一个默认信息,但不能返回错误或相应超时。
  • 分布式系统可用性的特点:
  • (1)所有请求都有响应,且不会出现响应超时或者响应错误。

分区容忍性

  • 通常分布式系统的各个节点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致节点之间通信失败,此时仍可对外提供服务,这叫分区容忍性。
  • 上图中,商品信息读写要满足分区容忍性就是要实现如下目标:
  • (1)主数据向从数据库同步数据失败不影响读写操作。
  • (2)一个节点挂掉不影响另一个节点对外提供服务。
  • 如何实现分区容忍性?
  • (1)尽量使用异步取代同步操作,例如使用异步方式将数据从主数据库同步到从数据库,这样节点之间有效的实现松耦合。
  • (2)添加从数据库节点,其中一个节点挂掉其它节点提供服务。
  • 分布式分区容忍性的特点:
  • (1)分区容忍性是分布式系统具备的基本能力。

39  数组连续最大的非空子数组的和 

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        std::vector<int>f_vector(nums.size(),0);
        int max = nums[0];
        f_vector[0] = nums[0];
        for(int i = 1;i< nums.size();i++){
            f_vector[i] = std::max(f_vector[i-1]+nums[i],nums[i]);
            max = std::max(f_vector[i],max);
        }
        return max;
    }
};
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre = 0;
        int max = nums[0];
        for(int i=0;i<nums.size();i++){
            pre = std::max(pre+nums[i],nums[i]);
            max = std::max(pre,max);
        }
        return max;
    }
};

 40 传输协议对应的层级

  • 网络协议各层概述 - kumata - 博客园
  • http 应用层
  • pop3 应用层协议,用于发邮件,基于udp协议
  • pop3 smtp imap这三种邮件协议,分别在七层协议的哪一层?_百度知道
  • POP3_百度百科
  • ICMP_百度百科
  • ICMP 网络层  它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息
  • ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例
  • 802.11 物理层
  • 802.11最初定义的三个物理层包括了两个扩散频谱技术和一个红外传播规范,无线传输的频道定义在2.4GHz的ISM波段内,这个频段,在各个国际无线管理机构中,例如美国的USA,欧洲的ETSI和日本的MKK都是非注册使用频段。这样,使用802.11的客户端设备就不需要任何无线许可。扩散频谱技术保证了802.11的设备在这个频段上的可用性和可靠的吞吐量,这项技术还可以保证同其他使用同一频段的设备不互相影响。​​​​​​​
  • 802.11标准定义了哪三种物理层通信技术_百度知道

 41 通过IP地址的请求 由相同的服务器节点来承担

42 TCP 网络连接进入Time_wait状态说明

  • TCP的TIME_WAIT状态 - 知乎
  • 主动关闭方在收到被动关闭方的FIN包后并返回ACK后,会进入TIME_WAIT状态,TIME_WAIT状态又称2MSL状态

 判断以下选项

参考链接

43  关于限流正确的是

参考链接

函数指针 和 指针函数的区别

为啥返回数值的类型不可以作为函数重载的区分呢?

构成多态的条件?继承和多态 是否足以?

  • C++虚函数注意事项以及构成多态的条件
  • 有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)
  • 多态是面向对象编程的主要特征之一,C++中虚函数的唯一用处就是构成多态
  • C++提供多态的目的是:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量
     

对于IP地址 130.63.160.2  MASK为255.255.255.0  子网号为?  未解决

  • 160
  • 63.160
  • 160.2
  • 130.63.160 

主机甲和主机乙之间建立了一个TCP连接,双方持续有数据传输,且数据没有差错和丢失。如果甲收到一个来自乙的TCP段,这个段的序号为1913,确认序号为2046,有效载荷为100字节,则甲立即发送给乙的TCP段的序号和确认序号分别是?

  • 2046 2013
  • 2047 2012
  • 2046 2012
  • 2047 2013

建立连接的时候,哪一个数据包发送顺序是正确的TCP握手协议过程??

  • SYN+ACK ,SYN+ACK ,SYN
  • SYN,SYN,ACK
  • SYN,SYN+ACK,SYN+ACK
  • SYN,SYN+ACK,RST
  • 都不正确

主机甲和主机一建立一个TCP连接,甲的拥塞控制初始的阈值是32kb,甲向乙始终以MSS=1kb大小的段发送数据,并一直有数据 的发送,乙为这个连接分配的16kb的接收缓存,并对每个数据段进行确认,忽略传输的延迟,如果乙收到的数据全部存入缓存,不被取走,则甲从连接建立成功时刻起,未发送超时的情况下,经过了4个RTT之后,甲的发送窗口大小是?

  • 8kb
  • 16kb
  • 1kb
  • 32kb

某个主机的ip地址是180.80.77.55 子网掩码是255.255.252.0 如果这个主机向所在子网发送广播分组,则目的地址可以是 

  • 180.80.76.255
  • 180.80.77.255
  • 180.80.76.0
  • 180.80.79.255

对于第二范式的理解正确的是?

  • 在第一范式的基础上,任何非主属性不依赖于其他非主属性
  • 在第一范式的基础上,非码属性必须完全依赖与码
  • 数据库的每一列都是不可分割的原子数据项
  • 上述说法均错误

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值