Entrevista Companheiro 2: perguntas interessantes da entrevista de lógica BAT para compartilhar

objetivo

  • Coleção especial de alguns tópicos interessantes
  • Essas perguntas serão fáceis de ler e erradas
  • Atualizar continuamente, a cada dez perguntas como um artigo

índice

Série de artigos

1. Pensamento XOR

1.1. Em uma matriz emparelhada (ou seja, cada número na matriz deve ter outro número igual ao seu valor), um número é inserido pelo programador por engano (ou seja, o número é único nesta matriz), como encontrar Fora deste número?

  • 答案:将所有数化为二进制,做异或

1.2. Em um par de matrizes (ou seja, cada número na matriz deve ter outro número igual ao seu valor), o programador inseriu por engano dois números (ou seja, ambos os números estão nesta matriz Único), como encontrar esses dois números?

  • 答案:异或所有数,所得结果相当于混入的这两个数的异或,取其不为0的某一位,按照这一位将数组元素分成两组(一组为0,一组为1),两组组内异或,分别得到这两个数。

1.3. Determinar se um número é ímpar?
Resposta: Até agora, as duas formas mais concisas são as seguintes:

方式一:
public static boolean isOdd(int i) {
    
    
    return i >> 1 << 1 != i;
}
方式二:
public static boolean isOdd(int i) {
    
    
    return (i & 1) == 1;
}

Blog de referência:
A implementação subjacente dessas classes jdk usou operações de bit

Dois, relacionado à matriz

2.1. Dado um array a [], percorra-o uma vez para encontrar o maior (menor) elemento.

  • 答案:冒泡排序。

2.2. Dado um array a [], descubra que a soma de certos dois números é igual a um dado número M.

  • 答案:首先快排(从小到大),然后头尾两个指针,若头尾指向的数之和大于M,尾指针减减,否则头指针加加。

2.3. Dado um array a [], encontre k números nele (k> = 2) de forma que a soma seja igual a um dado número M, sem retornar falso.

  • ​​​​​​​答案:动态规划的思想。

Terceiro, o problema da ponte

3.1. O problema de quatro pessoas cruzando a ponte: a velocidade é definida para v1, v2, v3, v4, encontrando v1> v2> v3> v4, e o tempo de cruzar o rio sozinho encontra-se: t1 <t2 <t3 <t4, está chovendo neste momento, quatro pessoas Há apenas um guarda-chuva, então as duas pessoas compartilham um guarda-chuva para atravessar o rio. A velocidade de travessia mais lenta é a principal. Depois de cruzar o rio, uma delas precisa enviar o guarda-chuva de volta. Pergunte como organizar o menor tempo de travessia

responda:

  • 方案一:正常思维会认为v1速度最快,让他每次回头送伞最合适,于是v1分别与其他人过河再回头送伞,总时间:t2+t3+t4+2*t1。
  • 方案二:考虑到v1>v2>>>v3>v4(即v1、v2远远大于v3、v4),可以让v1、v2先过河,v1回头送伞,v3、v4一起过河,v2回头送伞,然后v1、v2再过河, 总时间:t2+t1+t4+t2+t2。综合考虑,本题回答动态规划为最佳答案。

Quatro perguntas aleatórias

4.1. Há uma função A () que pode gerar números aleatórios de 0 a 9, e cada número aleatório é gerado com a mesma probabilidade. Agora você precisa escrever uma função B () para que a probabilidade de gerar os números 1, 2, 3 seja 0,2 e o número 4 A probabilidade é de 0,4.
Resposta:

public int B() {
    
    
    Switch(A()){
    
    
        Case 0, 6, 7, 8, 9:B();
        ​​​​​​​Case 1, 2, 3:Print(1or 2or 3); break;
        ​​​​​​​Case 4, 5:Print(4);break;
    }
}
或者
public int B() {
    
    
    Switch(A()){
    
    
        Case 01:Print(1);break;
        Case 23:Print(2);break;
        Case 45:Print(3);break;
        Case 6,7,89:Print(4);break;
    }
}

4.2. Há uma função A () que pode gerar números aleatórios de 0 a 3, e cada número aleatório é gerado com a mesma probabilidade. Agora você precisa escrever uma função B () para que a probabilidade de gerar os números 1, 2, 3 seja 0,2 e o número 4 A probabilidade é de 0,4.
Resposta:

public int B() {
    
    
    Switch((A(),A()){
    
    
        Case (0,0):Print(1);break;
        Case (0,1):Print(2);break;
        Case (0,2):Print(3);break;
        Case (0,3),(1,0):Print(4);break;
        case other:B();break;
    }
}

Cinco, pesando problemas

5.1. Quatro caixas de grãos de chocolate com exatamente a mesma aparência são chamadas de A, B, C e D. Uma caixa de grãos de chocolate é um grama mais pesada do que as outras caixas. Como encontrar esta caixa de grãos de chocolate pesando-os de uma vez.
Resposta:

  • 方法一:如果是显示重量的秤,则从第一盒取1个,第二盒取2个,第三盒取3个,第四盒取4个,重量比正常重几克就是第几盒。
  • 方法二:不显示重量的秤,每边放两盒,则能知道那边重,再分别取走一盒,看余下的是否平衡。

Seis, o problema de ratos bebendo remédio

6.1. Existem 1000 frascos de poção e há apenas um frasco de veneno dentro. Depois que o rato beber o veneno, ele morrerá em apenas uma hora. Agora vou dar a você 10 ratos e 1 hora. Descubra este frasco de veneno (presumindo que a quantidade de veneno seja muito alta. Grande, pode ser dividido em várias partes e não afeta a toxicidade).

  • 因为只有一瓶药水,所以相对简单,首先对所有的药水编号1-1000,对老鼠编号1-10。
  • 十个老鼠前面放十个容器,盛药水,编号为x的药水,一定有一个二进制数(比如23号药水对应二进制:10111),因此把23号药水分别滴入第1号、第2号、第3号、第5号的老鼠容器内.
  • 做完前两步,分别让老鼠喝下去,1小时后,假设第x,y,z,k号小鼠死亡,那么毒药就是二进制为kzyx的那瓶,比如第2号、第3号、第5号、第7号老鼠死亡,对应的二进制为0001010110,因此第86号药水是毒药。

6.2. Existem 1000 frascos de poção e há apenas um frasco de veneno. Depois que o rato bebe o veneno, ele morre em apenas uma hora. Agora você recebe 2 ratos e algumas horas. Descubra este frasco de veneno (presumindo que a quantidade de veneno seja muito alta. Grande, pode ser dividido em várias partes e não afeta a toxicidade).

  • 本题区别于上题是,只有两只小鼠,因此不能采用二进制了,换个思维,采用二维矩阵,我们把1000瓶药,放置成31*31=961、6*6=36、3,这样的三堆,前两个分别是两个矩阵。
  • 我们知道小鼠喝了毒药的情况下,在一小时的时候,也就是3600秒的时候,会死亡,那么我们根据不同的时间差,第一个小鼠在不同的时间喝矩阵的行混合物,第二只在不同时间段喝列的混合物。
  • 假设第一只在第一小时零15秒的时候死亡,说明第一个矩阵的第15行内有毒药,第二只在1小时30秒的时候死亡,说明第一个矩阵的第30列有毒药,那么第一个矩阵的(15,30)号药水是毒药,因为只有一瓶毒药,不存在跨矩阵的情况。

6.3. Existem 1.000 frascos de poção, mas não sei quantos frascos de veneno existem. Ratos morrerão em apenas uma hora após beber o veneno. Como testar quantos venenos existem em menos horas e em menos ratos?

  • Esta pergunta é diferente da pergunta anterior porque o número de venenos é desconhecido. Se uma matriz bidimensional for usada, o comprimento é x ratos, a largura é y ratos e cada rato bebe a mistura de poção na coluna ou linha atual, então x + y ratos Você pode testar x * y frascos de remédio?
    • 假设存在一瓶毒药,坐标为(x3,y5),那么一小时后,编号为x3和y5的老鼠会死亡
  • Isso significa que, se houver k frascos de veneno, podemos determinar quantos frascos de veneno existem determinando as coordenadas com base nos ratos mortos?
    • 然鹅并不是,假设存在这样一种情况,我们把k瓶毒药放置在矩阵所有的对角线上,一小时后,所有的小鼠全部死亡,能推断出来该矩阵全部有毒?
  • Como pode ser eficaz?
    • 因为这道题是不知道多少瓶毒药,因此,存在一种可能性,有1000瓶毒药,那么最大需要1000只老鼠来测试,所以矩阵法失效,时间法也失效。
    • 目前一种比较实际的方法,但不一定是最好的方法是:1000瓶毒药放置成100*10的矩阵,用10只老鼠,按顺序每隔1秒喝当前列的100瓶药水中的一瓶,那么小鼠在某时间死亡,其后的药水需要重新进行测试。比如:100行*10列的药水,每一列编号1-100,第一只小鼠在第一秒喝第一瓶,第二秒喝第二瓶,假设一号小鼠在1小时56秒死亡,那么可以判定第一列的1-55瓶药水安全,56-100需要重新验证。

Acho que você gosta

Origin blog.csdn.net/ljfirst/article/details/105884411
Recomendado
Clasificación