2020年のDidiAutumn Recruitment C ++インタビューの質問と回答の一覧(パート1)

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の配列に格納され、2回出現する数が検出されます。時間の複雑さは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でパーティションはどのように機能しますか?

Kafkaクラスターパーティションレプリケーションのデフォルトの自動割り当て分析

以下は、Kafkaクラスター内の4つのブローカーの例です。トピックの作成には、4つのパーティションと2つのレプリケーションが含まれます。データプロデューサーのフローを図に示します。

2つのノードがクラスターに追加され、パーティションが6に増加すると、分布は次のようになります。

コピー割り当ての論理ルールは次のとおりです。

Kafkaクラスターでは、各ブローカーにパーティションリーダーを割り当てる機会が均等にあります。

上の図のブローカーパーティションでは、矢印がコピーを指しています。例として、Partition-0を取り上げます。broker1のpartition-0がリーダーで、Broker2のPartition-0がコピーです。

上の図では、各ブローカー(BrokerIdに従って順序付けられている)が順番にメインパーティションを割り当て、次のブローカーがコピーです。このように、繰り返し割り当てられ、複数のコピーがこのルールに従います。

コピー割り当てアルゴリズムは次のとおりです。

割り当てるすべてのNブローカーとiパーティションを並べ替えます。

i番目のパーティションを(i mod n)番目のブローカーに割り当てます。

i番目のパーティションのj番目のコピーを((i + j)mod n)ブローカーに割り当てます。

4.シェルスクリプトはファイル内の単語数をカウントします

方法1:

(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)は同じ効果があります。

方法2:

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

END {for(i in array)print i、array [i]} 'ファイル

5.linuxでのIPCとは

①匿名パイプ(PIPE)と有名パイプ(FIFO):最も単純な

②信号(SIGNAL):システムのオーバーヘッドが最小

③共有マッピングエリア(MMAP):無関係なプロセス間で通信できます

④ローカルソケット(SOCKET):最も安定しています(ただし、より複雑です)

  1. Redisの建築パターンは何ですか?
    1つは、Redisスタンドアロンモードです

機能:シンプルで、redis-server redis.confを直接実行するだけです(redis-serverファイルとredis.confファイルの場所に注意してください)。

短所:1。メモリ容量の制限2.処理能力の制限3.高可用性がありません。

2、Redisマスタースレーブレプリケーションモード

Redisのレプリケーション機能により、ユーザーはRedisサーバーに基づいてサーバーのレプリカをいくつでも作成できます。レプリケートされたサーバーはマスターサーバーであり、レプリケーションによって作成されたサーバーレプリカはスレーブサーバーです(スレーブ)。マスターサーバーとスレーブサーバー間のネットワーク接続が正常である限り、マスターサーバーとスレーブサーバーの両方に同じデータがあり、マスターサーバーは常に発生するデータ更新をスレーブサーバーに同期するため、マスターサーバーとスレーブサーバーのデータが同じになります。

特徴:

1.マスター/スレーブの役割

2.マスター/スレーブデータは同じです

3.スレーブライブラリに転送する際のマスター読み取りの圧力を軽減します

短所:

1.高い可用性は保証できません

2.マスターライティングのプレッシャーを解決しなかった

3、Redisセンチネル(センチネル)モード

3.1センチネルモードの概要

Redis sentinelは、redisマスターサーバーとスレーブサーバーを監視し、マスターサーバーがオフラインになると自動的にフェイルオーバーする分散システムです。

特徴の3つ:

監視:Sentinelは、マスターサーバーとスレーブサーバーが正常に動作しているかどうかを常にチェックします。

通知:監視対象のRedisサーバーに問題がある場合、SentinelはAPIを介して管理者または他のアプリケーションに通知を送信できます。

自動フェイルオーバー:プライマリサーバーが正常に機能しない場合、Sentinelは自動フェイルオーバー操作を開始します。

特徴:

1.高可用性を確保する

2.各ノードを監視します

3.自動障害移行

短所:

マスタースレーブモード、切り替えにはデータが失われるまで時間がかかります

マスターライティングのプレッシャーを解決しなかった

4.クラスター(プロキシタイプ)モード

Twemプロキシは、Twitterがオープンソースとするredisおよびmemcache用の高速/軽量プロキシサーバーです。Twemproxyは、MemcachedASCIIプロトコルおよびredisプロトコルをサポートする高速シングルスレッドプロキシプログラムです。

特徴:

1.複数のハッシュアルゴリズム:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins

2.失敗したノードの自動削除をサポートします

3.バックエンドのシャーディングシャーディングロジックはビジネスに対して透過的であり、ビジネス側の読み取りおよび書き込みメソッドは単一のRedisの操作と一貫性があります。

短所:

1.新しいプロキシが追加され、その高い可用性を維持する必要があります

2.フェイルオーバーロジックはそれ自体で実装する必要があり、障害の自動転送をサポートできません。スケーラビリティが低く、拡張と縮小には手動による介入が必要です。

5.クラスター(直接接続)モード

redis 3.0以降のバージョンは、redis-clusterクラスターをサポートします。Redis-Clusterは非集中構造を採用しています。各ノードはデータとクラスター状態全体を保存し、各ノードは調和しています。

他のすべてのノードは接続されています。

特徴:

1.中央アーキテクチャがなく(ノードがパフォーマンスのボトルネックに影響を与えない)、プロキシレイヤーがありません。

2.スロットに応じて複数のノードにデータを格納し、ノード間でデータを共有し、データの分散を動的に調整できます。

3.スケーラビリティ、1000ノードへの線形拡張、ノードは動的に追加または削除できます。

4.高可用性。一部のノードが使用できない場合でも、クラスターは引き続き使用できます。スレーブを追加してバックアップデータのコピーを作成します

5.障害の自動フェイルオーバーを実現し、ゴシッププロトコルを介してノード間でステータス情報を交換し、投票メカニズムを使用してスレーブからマスターへの役割のアップグレードを完了します。

短所:

1.リソースの分離が不十分であり、相互の影響が発生しやすい。

2.データは非同期で複製され、強力なデータの一貫性は保証されません。

おすすめ

転載: blog.csdn.net/lingshengxueyuan/article/details/108295857