時間
2020年2月5日
テーマ
アリ側:筆記試験/コード側
デュレーション
一時間
前置条件
電話インタビューを経て、筆記試験時間に同意しました
その他
ソーシャルリクルート、オンライン筆記試験
結果
沿って
質問の種類
同時の非常に単純なアルゴリズムの問題
その時に提出された質問と回答
1、(JDK1.8)线程A打印a,线程B打印l,线程C打印i,三个线程交替打印,各打印102次,alialiali……
public class ThreadPrint {
private static volatile int integer = 0;
private static String[] strs = {"a", "l", "i"};
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(new Print(strs[i], i)).start();
}
}
static class Print implements Runnable {
String content;
int order;
public Print(String content, int order) {
this.content = content;
this.order = order;
}
@Override
public void run() {
for (int i = 0; i < 102; ) {
synchronized (ThreadPrint.class) {
if (integer == order) {
System.out.print(content);
integer = (integer + 1) % strs.length;
i++;
}
}
}
}
}
}
// 使用wait notify
public class ThreadPrint2 {
private static String[] strs = {"a", "l", "i"};
private static String[] plocks = {"i", "a", "l"};
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(new Print(strs[i], plocks[i])).start();
}
}
static class Print implements Runnable {
String content;
String plock;
public Print(String content, String plock) {
this.content = content;
this.plock = plock;
}
@Override
public void run() {
for (int i = 0; i < 102; i++) {
synchronized (plock) {
synchronized (content) {
System.out.print(content);
content.notify();
}
try {
plock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
2、小b有一个计数器,其计数规则如下:
-计数从1开始,每过1秒数字+1
-第一次计数周期上限值为5,下一次计数周期上限值为上一次计数周期的两倍
-每次计数到上限值,触发计数重置,即下一个计数重新从1开始
以下是前20秒计数器上显示的数字举例:
1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5
请实现一个方法,输入第n秒,返回计数器上这个时刻的数字
举例1:
输入:1
输出:1
举例2:
输入:15
输出:10
public class Counter {
/**
* @param n 第n秒
* @return 计数器上这个时刻的数字
*/
public int count(int n) {
int limit = 5;
int count = 0;
for (int i = 0; i < n; i++) {
if (count++ == limit) {
count = 1;
limit <<= 1;
}
}
return count;
}
public static void main(String[] args) {
Counter counter = new Counter();
for (int i = 1; i < 50; i++) {
System.out.print(counter.count(i) + " ");
}
}
}
過程説明
オンライン筆記試験は非常に簡単です。面接官は開始時間の前にリンクを送信します。筆記試験ページを開くと、上記のコードブロックのようになります。2つの別々の質問があり、途中に空白の回答があります。 。独自のローカルIDEを開いて、書き込み後に貼り付けることができます。こんな感じだったのでびっくりしました。とてもカジュアルでした。
要件は1時間です。開始する準備ができたら、ページのチャットウィンドウでインタビュアーにメッセージを送信して、開始する準備ができていることをインタビュアーに伝えます。インタビュアーは、記述されたコードについて電話し、話します。 1時間でソリューションのアイデア。
もちろん、筆記試験を見たとき、私はショックを受けてカジュアルでした。ビデオ監視がなかったら、だれかが不正行為をするのではないかと私は思っています。
トピックを見ると、私はさらに唖然とします。質問もランダムです。質問は非常に単純なようで、調査できない問題を取得することはできません。
私の問題解決プロセスについて話しましょう:
最初の質問は、質問の最初のアイデアで並行性とスレッドセーフの問題を見てください。上記の2つの解決策を書きましたが、最初は、同じような質問を頭の中で見たという印象を受けたので、2番目の解決策を書きたかったのです。恥ずかしいのは、気が付いて待機と通知の同期条件を忘れてしまったことです。書き終えた後、書いたコードが間違っていることに気づきました。しばらく考えましたが、考えていませんでした。時間が10分以上経過しました。質問の無駄だったと思います。そんなに多くの時間は価値がありません。最初の書き方である非常に低い解決策を考えました。3つのスレッドa、l、およびiがあります。リソースが競合すると、条件が出力されます。
それから、2番目の質問である非常に単純なアルゴリズムの質問を見始めました。質問は非常に明確に言われています。何を言うべきかわからないので、言いません。
まだ20分残っていることがわかったので、jdkの待機を見て、ソースコードのコメントを通知し、最初の質問の2番目の文言をデバッグし続けました。デバッグは正しく、回答が投稿されました。 1時間未満であることがわかりました。、しばらく待ってください。ちなみに、2番目の記述方法は2つの文字列配列オブジェクトを使用しますが、それらが参照する文字列リテラルは定数プール内の同じ変数であるため、同期ブロックの状態に問題はありません。
1時間後、面接官は電話をかけて自分の考えを話しました。解決策がたくさんあったので、別のことを尋ねました。チャットプロセスは非常に速く、筆記試験は終了しました。
その後、筆記試験の質問と回答を送信するための電子メールを受け取ります。
個人的な認識
この筆記試験は、コーディング標準と並行性に関するものだと思います。
幸いなことに、このトピックの観点からは、特にアルゴリズムの問題を対象としたものではありません。動的計画法、欲張り法、バックトラッキング、bfs、dfsなどには、私が本当に得意ではないため、多くのことがあります。さらに残念なのは、これらのアルゴリズムの問題が実際には発生しなかったことです。方法はわかりませんが、実際に試してみたいと思います。
ps今夜メールをクリアしたときに、この書かれたテストメールを見つけて記録しました。