Inventaire des questions et réponses d'entrevue C ++ de Didi Autumn Recruitment en 2020 (partie 1)

1. C ++ réalise le mode singleton thread-safe

Mode Slacker:

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. Le nombre de 1-2n est stocké dans un tableau d'espace n, trouvez le nombre qui apparaît deux fois, la complexité temporelle est O (n), la complexité spatiale est 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);
 }
 }
 }
}

Les entreprises Internet de première ligne répondent aux questions et réponses des entretiens sur le compte officiel de Zero Sound Academy pour les recevoir gratuitement!
Insérez la description de l'image ici

3. Comment fonctionne la partition dans Kafka?

Analyse d'allocation automatique par défaut de réplication de partition de cluster Kafka

Voici un exemple de 4 courtiers dans un cluster Kafka. La création d'une rubrique contient 4 partitions et 2 réplications; le flux de production de données est illustré dans la figure:

Lorsque 2 nœuds sont ajoutés au cluster et que la partition passe à 6, la distribution est la suivante:

Les règles logiques d'allocation de copie sont les suivantes:

Dans un cluster Kafka, chaque courtier a une chance égale d'allouer des chefs de partition.

Dans la partition Broker de la figure ci-dessus, la flèche pointe vers la copie. Prenez Partition-0 comme exemple: partition-0 dans broker1 est le leader et Partition-0 dans Broker2 est la copie.

Dans le diagramme ci-dessus, chaque courtier (trié par BrokerId) alloue la partition principale à son tour, et le courtier suivant est la copie. De cette manière, il alloue de manière itérative et plusieurs copies suivent cette règle.

L'algorithme d'allocation de copie est le suivant:

Triez tous les N Brokers et i Partitions à allouer.

Attribuez la i-ième partition au (i mod n) -th Broker.

Attribuez la jième copie de la ième partition au ((i + j) mod n) Broker.

4. Le script Shell compte le nombre de mots dans le fichier

première méthode:

(1) fichier cat | sed 's /[,.:;/!? </font>/ / g' | awk '{pour (i = 1; i <= NF; i ++) tableau [$ i] ++;}

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

#File est le fichier à exploiter, et il y a un espace entre // dans sed.

(2) sed 's /[,.:;/!?[/ / g' fichier | awk '{pour (i = 1; i <= NF; i ++) tableau [$ i] ++;}

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

# (1) et (2) ont le même effet.

Deuxième méthode:

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

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

5. Quels sont les IPC sous Linux

① Pipe anonyme (PIPE) et pipe célèbre (FIFO): le plus simple

②Signal (SIGNAL): le système a le moins de frais généraux

③ Zone de cartographie partagée (MMAP): peut communiquer entre des processus non liés

④Socket local (SOCKET): le plus stable (mais plus compliqué)

  1. Quels sont les modèles architecturaux de Redis?
    Un, le mode autonome Redis

Fonctionnalités: Simple, exécutez simplement redis-server redis.conf directement (faites attention à l'emplacement de votre fichier redis-server et du fichier redis.conf).

Inconvénients: 1. Capacité mémoire limitée 2. Puissance de traitement limitée 3. Pas de haute disponibilité.

Deux, mode de réplication maître-esclave Redis

La fonction de réplication de Redis permet aux utilisateurs de créer un nombre illimité de répliques du serveur basées sur un serveur Redis. Le serveur répliqué est le serveur maître et la réplique de serveur créée par réplication est le serveur esclave ( esclave). Tant que la connexion réseau entre les serveurs maître et esclave est normale, les serveurs maître et esclave auront les mêmes données, et le serveur maître synchronisera toujours les mises à jour de données qui lui arrivent avec le serveur esclave, afin de garantir que les données des serveurs maître et esclave sont les mêmes.

Traits:

1. Le rôle de maître / esclave

2. Les données maître / esclave sont les mêmes

3. Réduisez la pression de lecture du maître lors du transfert vers la bibliothèque esclave

Désavantages:

1. La haute disponibilité ne peut être garantie

2. N'a pas résolu la pression de l'écriture maître

Trois, mode sentinelle Redis (Sentinel)

3.1 Vue d'ensemble du mode Sentinel

Redis sentinel est un système distribué qui surveille les serveurs maître et esclave Redis, et bascule automatiquement lorsque le serveur maître est hors ligne.

Trois des caractéristiques:

Surveillance: Sentinel vérifiera constamment si votre serveur maître et votre serveur esclave fonctionnent normalement.

Notification: lorsqu'un serveur Redis surveillé rencontre un problème, Sentinel peut envoyer des notifications aux administrateurs ou à d'autres applications via l'API.

Basculement automatique: lorsqu'un serveur principal ne fonctionne pas normalement, Sentinel démarre une opération de basculement automatique.

Traits:

1. Assurer une haute disponibilité

2. Surveillez chaque nœud

3. Migration automatique des pannes

Désavantages:

Mode maître-esclave, la commutation prend du temps pour perdre des données

N'a pas résolu la pression de l'écriture de maître

4. Mode cluster (type proxy)

Twem proxy est un serveur proxy rapide / léger pour redis et memcache open source provenant de Twitter; Twemproxy est un programme proxy rapide à un seul thread qui prend en charge le protocole Memcached ASCII et le protocole redis.

Traits:

1. Algorithmes de hachage multiples: MD5, CRC16, CRC32, CRC32a, hsieh, murmur, Jenkins

2. Prise en charge de la suppression automatique des nœuds défaillants

3. La logique de partitionnement du back-end est transparente pour l'entreprise, et les méthodes de lecture et d'écriture du côté métier sont cohérentes avec le fonctionnement d'un seul Redis

Désavantages:

1. Un nouveau proxy est ajouté et sa haute disponibilité doit être maintenue

2. La logique de basculement doit être mise en œuvre par elle-même et ne peut pas prendre en charge le transfert automatique des pannes. L'évolutivité est médiocre et une intervention manuelle est nécessaire pour l'expansion et la contraction.

5. Mode cluster (connexion directe)

Les versions postérieures à redis 3.0 prennent en charge les clusters redis-cluster. Redis-Cluster adopte une structure non centralisée. Chaque nœud enregistre les données et l'état complet du cluster, et chaque nœud est intégré

Tous les autres nœuds sont connectés.

Traits:

1. Aucune architecture centrale (aucun nœud n'affecte le goulot d'étranglement des performances) et la couche proxy est manquante.

2. Les données sont stockées dans plusieurs nœuds en fonction de l'emplacement, et les données sont partagées entre les nœuds, et la distribution des données peut être ajustée dynamiquement.

3. Évolutivité, expansion linéaire à 1000 nœuds, les nœuds peuvent être ajoutés ou supprimés dynamiquement.

4. Haute disponibilité: lorsque certains nœuds ne sont pas disponibles, le cluster est toujours disponible. Faire une copie de sauvegarde des données en ajoutant un esclave

5. Réalisez le basculement automatique des échecs, échangez des informations d'état entre les nœuds via le protocole de potins et utilisez le mécanisme de vote pour terminer la mise à niveau du rôle d'esclave à maître.

Désavantages:

1. L'isolement des ressources est faible et une influence mutuelle est susceptible de se produire.

2. Les données sont répliquées de manière asynchrone et une forte cohérence des données n'est pas garantie.

Je suppose que tu aimes

Origine blog.csdn.net/lingshengxueyuan/article/details/108295857
conseillé
Classement