Um teste escrito por Ali

Tempo

5 de fevereiro de 2020

tema

Ali lado: teste escrito / lado do código

duração

Uma hora

Condição prévia

Ter passado por uma entrevista por telefone e concordar com um tempo de teste escrito

de outros

Recrutamento social, exame escrito online

resultado

por

Tipo de pergunta

Problema algorítmico simultâneo muito simples

Perguntas e respostas enviadas na época

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) + " ");
        }
    }
}

Descrição do processo

O teste escrito online é muito fácil. O entrevistador enviará um link antes do horário de início. Depois de abrir a página do teste escrito, ela se parece com o bloco de código acima. Existem duas perguntas separadas, com algumas respostas em branco no meio. Use . Você pode abrir seu próprio IDE local e colá-lo após escrever. Quando eu soube que era assim, fiquei chocado, foi muito casual.

O requisito é de 1 hora. Quando estiver pronto para começar, envie uma mensagem ao entrevistador na janela de bate-papo da página para dizer ao entrevistador que você está pronto para começar e, em seguida, o entrevistador ligará e falará sobre o código escrito e as idéias de solução em 1 hora.

Claro, quando vi o teste escrito, fiquei chocado e casual. Se não fosse por uma vigilância por vídeo, eu estou me perguntando se alguém trapacearia.

Fico ainda mais surpreso quando vejo o assunto. As perguntas também são aleatórias: parecem muito simples, e os problemas que não podem ser investigados não podem ser obtidos.

Vamos falar sobre meu processo de resolução de problemas:

A primeira questão, olhe para o problema de concorrência e segurança de thread na primeira ideia da questão. Eu escrevi duas soluções acima. No início, eu queria escrever a segunda solução porque tive a impressão de ter visto um tipo de pergunta semelhante em minha mente. O constrangedor é que me lembrei e esqueci as condições de sincronização de esperar e notificar. Depois de terminar de escrever, descobri que o código que escrevi estava errado. Pensei um pouco, mas não pensei nisso. o tempo passou mais de 10 minutos. Acho que foi uma perda de tempo. Tanto tempo não vale a pena. Pensei em uma solução muito baixa, que é a primeira maneira de escrever: há 3 threads a, l e i. Quando os recursos são contestados, as condições são impressas.

Então comecei a olhar para a segunda pergunta, uma pergunta algorítmica muito simples. A pergunta foi dita muito claramente. Não sei o que dizer, então não vou dizer.

Acontece que ainda faltam 20 minutos, e então eu simplesmente olhei para os comentários de espera e notificação do código-fonte do jdk e continuei a depurar o segundo texto da primeira pergunta. A depuração estava correta e a resposta foi postada. descobriu que era menos de 1 hora., Apenas esperei um pouco. A propósito, a segunda maneira de escrever usa dois objetos de array de string, mas os literais de string que eles referenciam são a mesma variável no pool constante, então não há problema com a condição do bloco sincronizado.

Uma hora depois, o entrevistador pediu um telefonema e falou sobre suas ideias. Como havia muitas soluções, ele perguntou outra coisa. O processo de chat foi muito rápido e a prova escrita acabou.

Em seguida, receberei um e-mail para enviar as perguntas e respostas do teste escrito.

Percepção pessoal

Eu sinto que este teste escrito é sobre padrões de codificação e simultaneidade.

Felizmente, do ponto de vista do tópico, não é especificamente para problemas algorítmicos.Programação dinâmica, ganância, retrocesso, bfs, dfs, etc. tem um monte de coisas, porque eu realmente não sou bom nisso. O que é mais lamentável é que esses problemas algorítmicos realmente não surgiram. Embora eu não saiba como fazer isso, eu realmente quero tentar, haha.

 

ps Eu encontrei este e-mail de teste escrito quando limpei meu e-mail esta noite, e faço um registro.

Acho que você gosta

Origin blog.csdn.net/x763795151/article/details/105941642
Recomendado
Clasificación