알리의 필기 시험

시각

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 등 많은 것들이 있습니다. 더 아쉬운 점은 이러한 알고리즘 문제가 실제로 발생하지 않았다는 것입니다. 어떻게 해야할지 모르겠지만 정말 시도해보고 싶어요, 하하.

 

추신 오늘 밤 내 이메일을 지우고 기록을 만들 때이 서면 테스트 이메일을 발견했습니다.

추천

출처blog.csdn.net/x763795151/article/details/105941642