시각
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) + " ");
}
}
}
공정 설명
온라인 필기 시험은 매우 간단합니다. 면접관이 시작하기 전에 링크를 보내드립니다. 필기 시험 페이지를 열면 위의 코드 블록처럼 보입니다. 두 개의 개별 문제가 있으며 중간에 빈 답변이 있습니다. . 자체 로컬 IDE를 열고 작성한 후 붙여 넣을 수 있습니다. 이럴 줄 알았을 때 깜짝 놀랐습니다.
요구 사항은 1 시간입니다. 시작할 준비가되면 페이지의 채팅 창에서 면접관에게 메시지를 보내 면접관에게 시작할 준비가되었음을 알리면 면접관이 전화를 걸어 작성한 코드에 대해 이야기합니다. 1 시간 만에 솔루션 아이디어 제공
물론 필기 시험을봤을 때 충격적이고 캐주얼했습니다. 영상 감시가 아니었다면 누가 속일지 궁금합니다.
나는 그 주제를 볼 때 더욱 놀랐다. 질문도 무작위입니다. 정말 단순 해 보이며 조사 할 수없는 문제는 풀 수 없습니다.
내 문제 해결 프로세스에 대해 이야기 해 보겠습니다.
첫 번째 질문은 질문의 첫 번째 아이디어에서 동시성 및 스레드 안전성 문제를 살펴보십시오. 위의 두 가지 해결책을 썼는데, 처음에는 비슷한 질문 유형을 머릿속에 본 것 같은 인상을 받았기 때문에 두 번째 해결책을 쓰고 싶었습니다. 부끄러운 점은 마음에 들었고 대기와 알림의 동기화 조건을 잊었다는 것입니다. 작성을 마친 후 제가 작성한 코드가 잘못되었다는 것을 알게되었습니다. 잠시 생각했지만 생각하지 않았습니다. 시간이 10 분 넘게 흘렀습니다. 질문의 낭비라고 생각합니다. 너무 많은 시간은 가치가 없습니다. 첫 번째 쓰기 방법 인 매우 낮은 솔루션을 생각했습니다. a, l, i 3 개의 스레드가 있습니다. 자원이 다투면 조건이 인쇄됩니다.
그런 다음 두 번째 질문 인 매우 간단한 알고리즘 질문을보기 시작했습니다. 질문은 매우 명확하게 말하고 있습니다. 무엇을 말해야할지 모르겠으므로 말하지 않겠습니다.
아직 20 분이 남았는데 jdk의 대기 상태를보고 소스 코드 주석을 알리고 첫 번째 질문의 두 번째 단어를 계속 디버깅했습니다. 디버깅이 올 바르고 답변이 게시되었습니다. 1 시간도 안되는 걸 알았어요., 잠시 기다렸습니다. 그런데 두 번째 쓰기 방식은 두 개의 문자열 배열 객체를 사용하지만 그들이 참조하는 문자열 리터럴은 상수 풀에서 동일한 변수이므로 동기화 된 블록의 조건에 문제가 없습니다.
한 시간 후 면접관이 전화를 걸어 자신의 아이디어에 대해 이야기를 나눴습니다. 해결책이 많았 기 때문에 다른 질문을했습니다. 채팅 과정은 매우 빨랐고 필기 시험은 끝났습니다.
그런 다음 필기 시험 문제와 답변을 보내는 이메일을 받게됩니다.
개인적인 인식
이 필기 테스트는 코딩 표준과 동시성에 관한 것이라고 생각합니다.
다행히도 주제의 관점에서 볼 때 알고리즘 문제를위한 것은 아닙니다. 동적 프로그래밍, 욕심, 역 추적, bfs, dfs 등 많은 것들이 있습니다. 더 아쉬운 점은 이러한 알고리즘 문제가 실제로 발생하지 않았다는 것입니다. 어떻게 해야할지 모르겠지만 정말 시도해보고 싶어요, 하하.
추신 오늘 밤 내 이메일을 지우고 기록을 만들 때이 서면 테스트 이메일을 발견했습니다.