面接の前に企業の面接資料について詳しく読んでください。これはその後の面接に非常に役立ちます。今日は、Shopee サーバーの実際の面接での 15 の質問 (回答分析付き) を共有します。ぜひ、自分のレベルを確認してください。お役に立てれば幸いです。
リンク リストのヘッド ノードを指定して、それを昇順に並べ替えて、並べ替えられたリンク リストを返します。
例 1:
输入:head = [4,2,1,3] 输出:[1,2,3,4]
例 2:
输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
この質問では、ポインタ マージ ソート アルゴリズムは、次の 4 つのステップで解決されます。
1. 高速および低速のポインタ方式、リンク リストをトラバースして中間ノードを見つけます。
2. 中間ノードがリンク リストを切断します。
3. それぞれを使用します。左と右のサブリンク リストをマージソートします。
4. サブリンク リストをマージします。
完全なコードは次のとおりです。
class Solution { public ListNode sortList(ListNode head) { //如果链表为空,或者只有一个节点,直接返回即可,不用排序 if (head == null || head.next == null) return head; //快慢指针移动,以寻找到中间节点 ListNode slow = head; ListNode fast = head; while(fast.next!=null && fast.next.next !=null){ fast = fast.next.next; slow = slow.next; } //找到中间节点,slow节点的next指针,指向mid ListNode mid = slow.next; //切断链表 slow.next = null; //排序左子链表 ListNode left = sortList(head); //排序左子链表 ListNode right = sortList(mid); //合并链表 return merge(left,right); } public ListNode merge(ListNode left, ListNode right) { ListNode head = new ListNode(0); ListNode temp = head; while (left != null && right != null) { if (left.val <= right.val) { temp.next = left; left = left.next; } else { temp.next = right; right = right.next; } temp = temp.next; } if (left != null) { temp.next = left; } else if (right != null) { temp.next = right; } return head.next; } }
最初に関連する概念を確認しましょう:
クリア テキスト: 暗号化されていない情報/データを指します。 。
暗号文: 平文が暗号化アルゴリズムによって暗号化された後、データのセキュリティを確保するために暗号文になります。
Key: 平文を暗号文に、または暗号文を平文に変換するアルゴリズムに入力されるパラメーターです。鍵は対称鍵と非対称鍵に分けられます。
暗号化: 平文を暗号文に変換するプロセス。
復号化: 暗号文を平文に復元するプロセス。
対称暗号化アルゴリズム: 暗号化と復号化に 同じキーを使用する暗号化アルゴリズム。一般的な対称暗号化アルゴリズムには、AES、3DES、DES、RC5、RC6 などが含まれます。
#非対称暗号化アルゴリズム: 非対称暗号化アルゴリズムには 2 つのキー (公開キーと秘密キー) が必要です。公開鍵と秘密鍵はペアで存在し、公開鍵を使用してデータを暗号化した場合、対応する秘密鍵のみで復号化できます。主な非対称暗号化アルゴリズムは、RSA、Elgamal、DSA、D-H、ECC です。
## アプリケーション プロセスが IO 呼び出しを開始すると仮定しますが、カーネル データの準備がまだ整っていない場合、アプリケーション プロセスはブロックされ、カーネル データの準備ができてカーネルからユーザー空間にコピーされるまで待機します。成功のプロンプトが表示されると、この IO 操作はブロッキング IO と呼ばれます。
4.2 ノンブロッキング IO モデルカーネル データの準備がまだ整っていない場合は、次のことができます。最初にエラーを返す この情報はユーザー プロセスに与えられるため、ユーザー プロセスは待つ必要がなく、ポーリングを通じて再度要求します。これはノンブロッキング IO です。フローチャートは次のとおりです:
##4.3 IO 多重化モデル
IO多重化select
アプリケーションプロセスはselect関数を呼び出すことで複数のfdを同時に監視することができますselect関数で監視しているfdでは、いずれかのデータステータスがreadyである限り、 select 関数は読み取り可能な状態に戻り、その後アプリケーション プロセスはデータを読み取るために recvfrom リクエストを開始します。
select にはいくつかの欠点があります。接続の最大数は制限されており、Linux システムでは通常 1024 です。
select 関数が戻った後、fdset を走査することによって準備完了記述子 fd が見つかります。
select の問題を解決するために、イベント駆動型の多重化モデル epoll が誕生しました。のフローチャートは次のとおりです:
epoll は、最初に epoll_ctl() を通じて fd (ファイル記述子) を登録します。特定の fd の準備が整うと、カーネルはコールバック メカニズムを使用して fd を迅速にアクティブ化します。プロセスが epoll_wait() を呼び出すと、通知されます。ここでは、ファイル記述子をトラバースするという厄介な操作が削除され、イベント コールバックをリッスンするメカニズムが使用されます。これがepollのハイライトです。
4.4 IO モデルの信号駆動型モデル
信号駆動型 IO は、データの準備ができているかどうかを確認するためにアクティブな問い合わせを使用しなくなりましたが、カーネルがシグナルを送信すると (sigaction の呼び出し時に SIGIO シグナルが確立されます)、アプリケーションのユーザー プロセスはブロックせずに他の処理を行うことができます。カーネル データの準備ができると、アプリケーション プロセスは、SIGIO 信号を通じて、データを読み取り可能にする準備ができたことを通知されます。アプリケーション ユーザー プロセスはシグナルを受信すると、すぐに recvfrom を呼び出してデータを読み取ります。
4.5 非同期 IO (AIO) の IO モデル
AIO は、非同期 IO の非線形化を実現します。 IOプロセス全体 ブロッキングとは、アプリケーションプロセスがシステムコールを発行した後、すぐに戻ることを意味しますが、すぐに返されるのは処理結果ではなく、サブミット成功のようなものです。カーネル データの準備ができたら、データをユーザー プロセス バッファーにコピーし、IO 操作が完了したことをユーザー プロセスに通知する信号を送信します。
プロセスは次のとおりです:
Hystrix ワークフロー チャートは次のとおりです。以下:
1. ビルド コマンド
Hystrix は、HystrixCommand と HystrixObservableCommand という 2 つのコマンド オブジェクトを提供します。これらは、依存関係リクエスト タスクの 1 つを表し、それを に渡します。コンストラクター 依存関係を要求するために必要なパラメーター。
2. コマンドの実行
Hystrix コマンドを実行するには 4 つの方法があります。
Rexecute(): 同期ブロッキング実行。依存するリクエストから 1 つの応答を受け取ります。
Future queue(): 非同期実行。単一の応答を含む Future オブジェクトを返します。
Observable observable(): Observable を作成した後、Observable をサブスクライブし、依存するリクエストからの応答を表す Observable オブジェクトを返します
Observable toObservable() : cold observable、Observable を返します、Hystrix コマンドはサブスクライブ時にのみ実行され、複数の結果が返される可能性があります
3. 応答がキャッシュされているかどうかを確認します
Hystrix キャッシュを有効にすると、タスクの実行前に、同じコマンドを実行するためのキャッシュがあるかどうかが最初に判断されます。存在する場合、キャッシュされた応答を含む Observable が直接返されます。キャッシュされた結果がなくてもキャッシュが有効になっている場合、実行結果は後で使用するためにキャッシュされます。
4. サーキット ブレーカーが開いているかどうかを確認します。サーキット ブレーカー (サーキット ブレーカー) はヒューズに似ています。ヒューズは危険が発生したときに切れて回路を保護しますが、サーキット ブレーカーは回路を開くことができます。設定したしきい値に達すると、短絡をトリガーし (たとえば、リクエストの失敗率が 50% に達する)、リクエストの実行を拒否します。
ルーパーが開いている場合、Hystrix はコマンドを実行せず、直接フォールバック処理ロジックに入ります。
5. スレッド プール/セマフォ/キューの状況を確認する Hystrix の分離方法には、スレッド プールの分離とセマフォの分離があります。 Hystrix スレッド プールを使用する場合、Hystrix はデフォルトで各依存サービスに 10 個のスレッドを割り当てます。10 個のスレッドすべてがビジー状態の場合、コマンドの実行は拒否され、代わりにフォールバック ロジックの実行にすぐにジャンプします。
6. 特定のタスクを実行する HystrixObservableCommand.construct() または HystrixCommand.run() を使用して、ユーザーの実際のタスクを実行します。
7. ループの健全性を計算します。コマンドの実行が開始されるたび、コマンドの実行が終了するたび、または例外が発生するたびに、成功、失敗、拒否、タイムアウトなどの実行ステータスが記録されます。これらは定期的に処理され、設定された条件に従ってルーパーを開くかどうかを決定します。
8. コマンドが失敗した場合にフォールバック ロジックを実行する コマンドが失敗した場合に、ユーザー指定のフォールバック ロジックを実行します。上図ではサーキットブレーク、スレッドプール拒否、セマフォ拒否、実行実行、実行タイムアウトはすべてフォールバック処理に入ります。
9. 実行結果を返します。元のオブジェクトの結果が Observable の形式で返されます。ユーザーに返される前に、呼び出しメソッドに応じていくつかの処理が行われます。
日常の開発では、次のようなビジネス シナリオに遭遇することがよくあります。注文; ユーザーが登録に成功してから 15 分後に、ユーザーに通知するテキスト メッセージが送信されます。これは、遅延タスク処理シナリオです。このようなシナリオに対しては、主に次のソリューションがあります。
HTTPS = HTTP SSL/TLS、つまり、暗号化と復号化に SSL/TLS を使用します。データ、送信用のHTTP。
SSL (Secure Sockets Layer) は、ネットワーク通信のセキュリティとデータの整合性を提供するセキュリティ プロトコルです。
TLS、Transport Layer Security (Secure Transport Layer Protocol) は、SSL 3.0 の後継バージョンです。
http リクエスト プロセス
1. ユーザーはブラウザに https URL を入力し、サーバーの 443 ポートに接続します。
2. サーバーにはデジタル証明書のセットが必要です。サーバー自体で作成することも、組織に適用することもできます。違いは、サーバー自体が発行した証明書はクライアントによって検証される必要があることです。この証明書のセットは、実際には公開鍵と秘密鍵のペアです。
3. サーバーは、独自のデジタル証明書 (公開キーを含む) をクライアントに送信します。
4. クライアントはサーバーからデジタル証明書を受信した後、それをチェックしますが、失敗した場合は、警告ボックスが表示されます。証明書に問題がない場合は、キーが生成され (対称暗号化)、証明書の公開キーで暗号化されます。
5. クライアントは HTTPS で 2 番目の HTTP リクエストを開始し、暗号化されたクライアント キーをサーバーに送信します。
6. サーバーは、クライアントから暗号文を受信した後、独自の秘密キーを使用して非対称的に復号化します。復号化後、クライアント キーを取得し、クライアント キー ペアを使用して暗号文を返します。データを暗号文にするために対称暗号化を実行します。
7. サーバーは暗号化された暗号文をクライアントに返します。
8. クライアントはサーバーから返された暗号文を受信し、独自のキー (クライアント キー) を使用して対称的に復号化し、サーバーから返されたデータを取得します。
##8.1 データベースの 4 つの主要な分離レベル 同時トランザクションにおける
ダーティ読み取り、反復不能読み取り、およびファントム読み取りの問題を解決するために、データベースおじさんは 4 つの分離レベルを設計しました。それらは、Read uncommitted、Read Committed、Repeatable Read、Serializable です。
ダーティ リード | 反復不可能な読み取り | ファントム リード | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
√ | √ | √ | |||||||||||||||||||||||||||||
× | √ | √ | |||||||||||||||||||||||||||||
√ | |||||||||||||||||||||||||||||||
##× | # #8.2 読み取りビューの可視性ルール
|