盘点2020年滴滴秋招C++面试题及答案(上)

1. C++实现线程安全的单例模式

懒汉模式:

class singleton
{
    
    
protected:
 singleton()
 {
    
    
 pthread_mutex_init(&mutex);
 }
private:
 static singleton* p;
public:
 static pthread_mutex_t mutex;
 static singleton* initance();
};
 
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
    
    
 if (p == NULL)
 {
    
    
 pthread_mutex_lock(&mutex);
 if (p == NULL)
 p = new singleton();
 pthread_mutex_unlock(&mutex);
 }
 return p;
}

2. 1-2n的数存储在空间为n的数组中,找出出现两次的数字,时间复杂度O(n),空间复杂度O(1)

/*
奇数零次 偶数零次 0
奇数 一次 偶数 零次 -1
奇数 两次 偶数 零次 -2
奇数 零次 偶数 一次-3
奇数 一次 偶数 一次-4
奇数 两次 偶数 一次-5
奇数 零次 偶数 两次-6
奇数一次 偶数 两次-7
奇数两次 偶数两次-8
*/ 
public class Main {
    
    
 public static void main(String[] args) {
    
    
 int[] nums = {
    
    1, 3, 5, 15, 7, 8, 5, 3, 6, 15};
 findNumber(nums, nums.length);
 print(nums);
 }
 
 public static void findNumber(int[] nums, int length) {
    
    
 for (int i = 0; i < length; ) {
    
    
 if (nums[i] <= 0){
    
    
 i++;
 continue;
 }
 int index = nums[i] / 2;
 boolean isOdd = (nums[i] % 2 == 0) ? false : true;
 switch (nums[index]) {
    
    
 case 0:
 if (isOdd == true) {
    
    
 nums[index] = -1;
 } else {
    
    
 nums[index] = -3;
 }
 break;
 case -1:
 if (isOdd == true) {
    
    
 nums[index] = -2;
 } else {
    
    
 nums[index] = -4;
 }
 break;
 case -2:
 nums[index] = -3;
 break;
 case -3:
 if (isOdd == true) {
    
    
 nums[index] = -4;
 } else {
    
    
 nums[index] = -6;
 }
 break;
 case -4:
 if (isOdd == true) {
    
    
 nums[index] = -5;
 } else {
    
    
 nums[index] = -7;
 }
 break;
 case -5:
 nums[index] = -6;
 break;
 case -6:
  nums[index] = -7;
 break;
 case -7:
 nums[index] = -8;
 break;
 default:
 swap(nums, i, index);
 if (isOdd) {
    
    
 nums[index] = -1;
 } else {
    
    
 nums[index] = -3;
 }
 continue;
 }
 nums[i++]=0;
 }
 }
 public static void swap(int[] nums, int i, int j){
    
    
 int temp =nums[i];
 nums[i]=nums[j];
 nums[j]=temp;
 }
 
 public static void print(int[] nums) {
    
    
 for (int i = 0; i < nums.length; i++) {
    
    
 if (nums[i] == -2) {
    
    
 System.out.println(i * 2 + 1);
 } else if (nums[i] == -6) {
    
    
 System.out.println(i * 2);
 } else if (nums[i] == -8) {
    
    
 System.out.println(i * 2);
 System.out.println(i * 2 + 1);
 }
 }
 }
}

一线互联网大厂完整面试题及答案 关注公众号零声学院免费领取!
在这里插入图片描述

3. kafka中partition的工作原理?

Kafka集群partition replication默认自动分配分析

下面以Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication;数据Producer流动如图所示:

当集群中新增2节点,Partition增加到6个时分布情况如下:

副本分配逻辑规则如下:

在Kafka集群中,每个Broker都有均等分配Partition的Leader机会。

上述图Broker Partition中,箭头指向为副本,以Partition-0为例:broker1中 parition-0为Leader,Broker2中Partition-0为副本。

上述图种每个Broker(按照BrokerId有序)依次分配主Partition,下一个Broker为副 本,如此循环迭代分配,多副本都遵循此规则。

副本分配算法如下:

将所有N Broker和待分配的i个Partition排序.

扫描二维码关注公众号,回复: 12026470 查看本文章

将第i个Partition分配到第(i mod n)个Broker上.

将第i个Partition的第j个副本分配到第((i + j) mod n)个Broker上.

4. shell脚本统计文件中单词的个数

方法一:

(1)cat file|sed ‘s/[,.:;/!?]/ /g’|awk '{for(i=1;i<=NF;i++)array[$i]++;}

END{for(i in array) print i,array[i]}’

#其中file为要操作的文件,sed中/ /间有一个空格。

(2)sed ‘s/[,.:;/!?]/ /g’ file|awk '{for(i=1;i<=NF;i++)array[$i]++;}

END{for(i in array) print i,array[i]}’

#(1)和(2)效果一致。

方法二:

(1)awk 'BEGIN{RS="[,.:;/!?]"}{for(i=1;i<=NF;i++)array[$i]++;}

END{for(i in array) print i,array[i]}’ file

5. linux下IPC有哪些

①匿名管道(PIPE)和有名管道(FIFO):最简单

②信号(SIGNAL):系统的开销最小

③共享映射区(MMAP):可以在无血缘关系的进程间通信

④本地套接字(SOCKET):最稳定(但是比较复杂)

  1. Redis 有哪些架构模式?
    一、Redis单机模式

特点:简单,直接运行redis-server redis.conf即可(注意自己的redis-server文件和redis.conf文件的位置)。

缺点:1、内存容量有限 2、处理能力有限 3、无法高可用。

二、Redis主从复制模式

Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。

特点:

1、master/slave 角色

2、master/slave 数据相同

3、降低 master 读压力在转交从库

缺点:

1、无法保证高可用

2、没有解决 master 写的压力

三、Redis哨兵(Sentinel)模式

3.1 哨兵模式概述

Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。

其中三个特性:

监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

特点:

1、保证高可用

2、监控各个节点

3、自动故障迁移

缺点:

主从模式,切换需要时间丢数据

没有解决 master 写的压力

四、集群(proxy 型)模式

Twem proxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程>序,支持 Memcached ASCII 协议和 redis 协议。

特点:

1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins

2、支持失败节点自动删除

3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致

缺点:

1、增加了新的 proxy,需要维护其高可用

2、failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预

五、集群(直连型)模式

从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和

其他所有节点连接。

特点:

1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。

2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。

3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。

4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本

5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。

缺点:

1、资源隔离性较差,容易出现相互影响的情况。

2、数据通过异步复制,不保证数据的强一致性E

猜你喜欢

转载自blog.csdn.net/lingshengxueyuan/article/details/108295857